/ Hex Artifact Content
Login

Artifact ce1e53959413c5e41b9242c3b28800a2bcb1e2ae:


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 34  : pager.c,v 1.44
0350: 36 20 32 30 30 38 2f 30 35 2f 31 33 20 31 33 3a  6 2008/05/13 13:
0360: 32 37 3a 33 34 20 64 72 68 20 45 78 70 20 24 0a  27:34 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  E */.  u8 journa
3fb0: 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20  lMode;          
3fc0: 20 20 20 2f 2a 20 4f 6e 20 6f 66 20 74 68 65 20     /* On of the 
3fd0: 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
3fe0: 45 5f 2a 20 76 61 6c 75 65 73 20 2a 2f 0a 20 20  E_* values */.  
3ff0: 75 38 20 64 62 4d 6f 64 69 66 69 65 64 3b 20 20  u8 dbModified;  
4000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
4010: 72 75 65 20 69 66 20 74 68 65 72 65 20 61 72 65  rue if there are
4020: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 20   any changes to 
4030: 74 68 65 20 44 62 20 2a 2f 0a 20 20 75 38 20 63  the Db */.  u8 c
4040: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 3b 20  hangeCountDone; 
4050: 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74 20 61          /* Set a
4060: 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74 69 6e  fter incrementin
4070: 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63 6f 75  g the change-cou
4080: 6e 74 65 72 20 2a 2f 0a 20 20 75 33 32 20 76 66  nter */.  u32 vf
4090: 73 46 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20  sFlags;         
40a0: 20 20 20 20 20 20 2f 2a 20 46 6c 61 67 73 20 66        /* Flags f
40b0: 6f 72 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78  or sqlite3_vfs.x
40c0: 4f 70 65 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20  Open() */.  int 
40d0: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
40e0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
40f0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
4100: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
4110: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
4120: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4130: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
4140: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
4150: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
4170: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
4180: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
4190: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
41a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
41b0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
41c0: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
41d0: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
41e0: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
41f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4200: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
4210: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
4220: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
4230: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
4240: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
4250: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
4260: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
4270: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
4280: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
4290: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
42a0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
42b0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
42c0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
42d0: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
42e0: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
42f0: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
4300: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
4310: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
4320: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
4330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
4340: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
4350: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4370: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
4380: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
4390: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
43a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
43b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
43c0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
43d0: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
43e0: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
43f0: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
4400: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
4410: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
4420: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
4430: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
4440: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
4450: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
4460: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
4470: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 42 69  database */.  Bi
4480: 74 76 65 63 20 2a 70 49 6e 4a 6f 75 72 6e 61 6c  tvec *pInJournal
4490: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65  ;         /* One
44a0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
44b0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
44c0: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 42 69 74  se file */.  Bit
44d0: 76 65 63 20 2a 70 49 6e 53 74 6d 74 3b 20 20 20  vec *pInStmt;   
44e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
44f0: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
4500: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
4510: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
4520: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
4530: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4540: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
4550: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
4560: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4570: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
45a0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
45b0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
45c0: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
45d0: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
45e0: 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e 6c 3b  char *zStmtJrnl;
45f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
4600: 61 6d 65 20 6f 66 20 74 68 65 20 73 74 61 74 65  ame of the state
4610: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ment journal fil
4620: 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66  e */.  sqlite3_f
4630: 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64 3b 20 20  ile *fd, *jfd;  
4640: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
4650: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
4660: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4670: 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  */.  sqlite3_fil
4680: 65 20 2a 73 74 66 64 3b 20 20 20 20 20 20 20 20  e *stfd;        
4690: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
46a0: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
46b0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
46c0: 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65 72  */.  BusyHandler
46d0: 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 20   *pBusyHandler; 
46e0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 73   /* Pointer to s
46f0: 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c 65  qlite.busyHandle
4700: 72 20 2a 2f 0a 20 20 50 61 67 65 72 4c 72 75 4c  r */.  PagerLruL
4710: 69 73 74 20 6c 72 75 3b 20 20 20 20 20 20 20 20  ist lru;        
4720: 20 20 20 2f 2a 20 4c 52 55 20 6c 69 73 74 20 6f     /* LRU list o
4730: 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f 0a  f free pages */.
4740: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4760: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
4770: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
4780: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
4790: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
47a0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
47b0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
47c0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
47d0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
47e0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
47f0: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4800: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4810: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4820: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4830: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4840: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4850: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
4860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
4870: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
4880: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
4890: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
48a0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
48b0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
48c0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
48d0: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
48e0: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
48f0: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4900: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4910: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4920: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4930: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4950: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
4960: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
4970: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
4980: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4990: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
49a0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
49b0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
49c0: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
49d0: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
49e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
49f0: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4a00: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4a10: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4a20: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4a30: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4a40: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4a50: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
4a60: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
4a70: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
4a80: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
4a90: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
4aa0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
4ab0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4ac0: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4ad0: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4ae0: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4af0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4b00: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4b10: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4b20: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4b30: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4b40: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4b50: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
4b60: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
4b70: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
4b80: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
4b90: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
4ba0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
4bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4bc0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4bd0: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4be0: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4bf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4c00: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4c10: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4c20: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4c30: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4c40: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4c50: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
4c60: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
4c70: 6f 75 62 6c 79 20 6c 69 6e 6b 65 64 20 6c 69 73  oubly linked lis
4c80: 74 20 6f 66 20 70 61 67 65 72 73 20 6f 6e 20 77  t of pagers on w
4c90: 68 69 63 68 20 2a 2f 0a 20 20 50 61 67 65 72 20  hich */.  Pager 
4ca0: 2a 70 50 72 65 76 3b 20 20 20 20 20 20 20 20 20  *pPrev;         
4cb0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
4cc0: 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28  _release_memory(
4cd0: 29 20 77 69 6c 6c 20 77 6f 72 6b 20 2a 2f 0a 20  ) will work */. 
4ce0: 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20 69 49   volatile int iI
4cf0: 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 2f 2a 20  nUseMM;      /* 
4d00: 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 75 6e 61 76  Non-zero if unav
4d10: 61 69 6c 61 62 6c 65 20 74 6f 20 4d 4d 20 2a 2f  ailable to MM */
4d20: 0a 20 20 76 6f 6c 61 74 69 6c 65 20 69 6e 74 20  .  volatile int 
4d30: 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20 20 2f  iInUseDB;      /
4d40: 2a 20 4e 6f 6e 2d 7a 65 72 6f 20 69 66 20 69 6e  * Non-zero if in
4d50: 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65   sqlite3_release
4d60: 5f 6d 65 6d 6f 72 79 28 29 20 2a 2f 0a 20 20 75  _memory() */.  u
4d70: 38 20 6f 6e 50 61 67 65 72 4c 69 73 74 3b 20 20  8 onPagerList;  
4d80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
4d90: 75 65 20 69 66 20 70 61 72 74 20 6f 66 20 74 68  ue if part of th
4da0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69  e sqlite3PagerLi
4db0: 73 74 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63  st */.#endif.  c
4dc0: 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20  har *pTmpSpace; 
4dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61             /* Pa
4de0: 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74  ger.pageSize byt
4df0: 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20  es of space for 
4e00: 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61  tmp use */.  cha
4e10: 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d  r dbFileVers[16]
4e20: 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e  ;        /* Chan
4e30: 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61 74  ges whenever dat
4e40: 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
4e50: 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  es */.};../*.** 
4e60: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c  The following gl
4e70: 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68  obal variables h
4e80: 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65  old counters use
4e90: 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67  d for.** testing
4ea0: 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20   purposes only. 
4eb0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4ec0: 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e   do not exist in
4ed0: 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e  .** a non-testin
4ee0: 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20  g build.  These 
4ef0: 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f  variables are no
4f00: 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a  t thread-safe..*
4f10: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4f20: 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33  TEST.int sqlite3
4f30: 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f  _pager_readdb_co
4f40: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4f50: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
4f60: 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42  ges read from DB
4f70: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
4f80: 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f  pager_writedb_co
4f90: 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75  unt = 0;   /* Nu
4fa0: 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67  mber of full pag
4fb0: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42  es written to DB
4fc0: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
4fd0: 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75  pager_writej_cou
4fe0: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
4ff0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
5000: 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c  itten to journal
5010: 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f   */.int sqlite3_
5020: 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75  pager_pgfree_cou
5030: 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75  nt = 0;    /* Nu
5040: 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70 61  mber of cache pa
5050: 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64  ges freed */.# d
5060: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
5070: 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23  (v)  v++.#else.#
5080: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
5090: 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  CR(v).#endif../*
50a0: 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
50b0: 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74  g variable point
50c0: 73 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66  s to the head of
50d0: 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64   a double-linked
50e0: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20   list.** of all 
50f0: 70 61 67 65 72 73 20 74 68 61 74 20 61 72 65 20  pagers that are 
5100: 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67  eligible for pag
5110: 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68  e stealing by th
5120: 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c  e.** sqlite3_rel
5130: 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e  ease_memory() in
5140: 74 65 72 66 61 63 65 2e 20 20 41 63 63 65 73 73  terface.  Access
5150: 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73   to this list is
5160: 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79  .** protected by
5170: 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45   the SQLITE_MUTE
5180: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75  X_STATIC_MEM2 mu
5190: 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  tex..*/.#ifdef S
51a0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
51b0: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73  ORY_MANAGEMENT.s
51c0: 74 61 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c  tatic Pager *sql
51d0: 69 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20  ite3PagerList = 
51e0: 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c  0;.static PagerL
51f0: 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72  ruList sqlite3Lr
5200: 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20  uPageList = {0, 
5210: 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a  0, 0};.#endif...
5220: 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69  /*.** Journal fi
5230: 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74  les begin with t
5240: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67  he following mag
5250: 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20  ic string.  The 
5260: 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61  data.** was obta
5270: 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72  ined from /dev/r
5280: 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73  andom.  It is us
5290: 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e  ed only as a san
52a0: 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a  ity check..**.**
52b0: 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32   Since version 2
52c0: 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61  .8.0, the journa
52d0: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e  l format contain
52e0: 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e  s additional san
52f0: 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20  ity.** checking 
5300: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66  information.  If
5310: 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73   the power fails
5320: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
5330: 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77  al is begin.** w
5340: 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e  ritten, semi-ran
5350: 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61  dom garbage data
5360: 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e   might appear in
5370: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
5380: 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72  file after power
5390: 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49   is restored.  I
53a0: 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20  f an attempt is 
53b0: 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  then made.** to 
53c0: 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  roll the journal
53d0: 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62   back, the datab
53e0: 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72  ase could be cor
53f0: 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64  rupted.  The add
5400: 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74  itional.** sanit
5410: 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20  y checking data 
5420: 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f  is an attempt to
5430: 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61   discover the ga
5440: 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20  rbage in the.** 
5450: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f  journal and igno
5460: 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  re it..**.** The
5470: 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   sanity checking
5480: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
5490: 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c   the new journal
54a0: 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73   format consists
54b0: 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20  .** of a 32-bit 
54c0: 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68  checksum on each
54d0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20   page of data.  
54e0: 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76  The checksum cov
54f0: 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20  ers both.** the 
5500: 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20  page number and 
5510: 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65  the pPager->page
5520: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
5530: 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e  ta for the page.
5540: 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69  .** This cksum i
5550: 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
5560: 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d   a 32-bit random
5570: 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65   value that appe
5580: 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  ars in the.** jo
5590: 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74  urnal file right
55a0: 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65   after the heade
55b0: 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69  r.  The random i
55c0: 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d  nitializer is im
55d0: 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61  portant,.** beca
55e0: 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61  use garbage data
55f0: 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74   that appears at
5600: 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f   the end of a jo
5610: 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a  urnal is likely.
5620: 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73  ** data that was
5630: 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66   once in other f
5640: 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e  iles that have n
5650: 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e  ow been deleted.
5660: 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62    If the.** garb
5670: 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72  age data came fr
5680: 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a  om an obsolete j
5690: 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
56a0: 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74   checksums might
56b0: 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20  .** be correct. 
56c0: 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69   But by initiali
56d0: 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  zing the checksu
56e0: 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75  m to random valu
56f0: 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69  e which.** is di
5700: 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72  fferent for ever
5710: 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69  y journal, we mi
5720: 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b  nimize that risk
5730: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
5740: 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
5750: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20  aJournalMagic[] 
5760: 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35  = {.  0xd9, 0xd5
5770: 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78  , 0x05, 0xf9, 0x
5780: 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20  20, 0xa1, 0x63, 
5790: 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  0xd7,.};../*.** 
57a0: 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  The size of the 
57b0: 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61  header and of ea
57c0: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a  ch page in the j
57d0: 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d  ournal is determ
57e0: 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66  ined.** by the f
57f0: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e  ollowing macros.
5800: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
5810: 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
5820: 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67  )  ((pPager->pag
5830: 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a  eSize) + 8)../*.
5840: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** The journal h
5850: 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74  eader size for t
5860: 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68  his pager. In th
5870: 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63  e future, this c
5880: 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74  ould be.** set t
5890: 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61  o some value rea
58a0: 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20  d from the disk 
58b0: 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20  controller. The 
58c0: 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61  important.** cha
58d0: 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74  racteristic is t
58e0: 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61  hat it is the sa
58f0: 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73  me size as a dis
5900: 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65  k sector..*/.#de
5910: 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  fine JOURNAL_HDR
5920: 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61  _SZ(pPager) (pPa
5930: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
5940: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72  ../*.** The macr
5950: 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20  o MEMDB is true 
5960: 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e  if we are dealin
5970: 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d  g with an in-mem
5980: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  ory database..**
5990: 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61   We do this as a
59a0: 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69   macro so that i
59b0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49  f the SQLITE_OMI
59c0: 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f  T_MEMORYDB macro
59d0: 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20   is set,.** the 
59e0: 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77  value of MEMDB w
59f0: 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e  ill be a constan
5a00: 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c  t and the compil
5a10: 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65  er will optimize
5a20: 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61  .** out code tha
5a30: 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78  t would never ex
5a40: 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  ecute..*/.#ifdef
5a50: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
5a60: 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d  ORYDB.# define M
5a70: 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64  EMDB 0.#else.# d
5a80: 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67  efine MEMDB pPag
5a90: 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66  er->memDb.#endif
5aa0: 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d  ../*.** Page num
5ab0: 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ber PAGER_MJ_PGN
5ac0: 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64 20  O is never used 
5ad0: 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74  in an SQLite dat
5ae0: 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20  abase (it is.** 
5af0: 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72  reserved for wor
5b00: 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69  king around a wi
5b10: 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f  ndows/posix inco
5b20: 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74  mpatibility). It
5b30: 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74   is.** used in t
5b40: 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69  he journal to si
5b50: 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20 72  gnify that the r
5b60: 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20  emainder of the 
5b70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a  journal file .**
5b80: 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73   is devoted to s
5b90: 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20  toring a master 
5ba0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74  journal name - t
5bb0: 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65  here are no more
5bc0: 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c   pages to.** rol
5bd0: 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d  l back. See comm
5be0: 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f  ents for functio
5bf0: 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  n writeMasterJou
5c00: 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69  rnal() for detai
5c10: 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e  ls..*/./* #defin
5c20: 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  e PAGER_MJ_PGNO(
5c30: 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45  x) (PENDING_BYTE
5c40: 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29  /((x)->pageSize)
5c50: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  ) */.#define PAG
5c60: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28  ER_MJ_PGNO(x) ((
5c70: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78  PENDING_BYTE/((x
5c80: 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29  )->pageSize))+1)
5c90: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ../*.** The maxi
5ca0: 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e  mum legal page n
5cb0: 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d  umber is (2^31 -
5cc0: 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20   1)..*/.#define 
5cd0: 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32  PAGER_MAX_PGNO 2
5ce0: 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a  147483647../*.**
5cf0: 20 54 68 65 20 70 61 67 65 72 45 6e 74 65 72 28   The pagerEnter(
5d00: 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65  ) and pagerLeave
5d10: 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75  () routines acqu
5d20: 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a  ire and release.
5d30: 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61  ** a mutex on ea
5d40: 63 68 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d  ch pager.  The m
5d50: 75 74 65 78 20 69 73 20 72 65 63 75 72 73 69 76  utex is recursiv
5d60: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  e..**.** This is
5d70: 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f   a special-purpo
5d80: 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e  se mutex.  It on
5d90: 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75  ly provides mutu
5da0: 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20  al exclusion.** 
5db0: 62 65 74 77 65 65 6e 20 74 68 65 20 42 74 72 65  between the Btre
5dc0: 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79  e and the Memory
5dd0: 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69   Management sqli
5de0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
5df0: 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ry().** function
5e00: 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70  .  It does not p
5e10: 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d  revent, for exam
5e20: 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20  ple, two Btrees 
5e30: 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a  from accessing.*
5e40: 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67 65 72  * the same pager
5e50: 20 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   at the same tim
5e60: 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61  e.  Other genera
5e70: 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65  l-purpose mutexe
5e80: 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65  s in.** the btre
5e90: 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74  e layer handle t
5ea0: 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2a 0a 2a 2a  hat chore..**.**
5eb0: 20 54 68 65 20 70 61 67 65 72 4d 75 74 65 78 48   The pagerMutexH
5ec0: 65 6c 64 28 58 29 20 6d 61 63 72 6f 20 69 73 20  eld(X) macro is 
5ed0: 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b  for sanity check
5ee0: 69 6e 67 2e 20 20 54 68 69 73 20 6d 61 63 72 6f  ing.  This macro
5ef0: 20 76 65 72 69 66 69 65 73 0a 2a 2a 20 74 68 61   verifies.** tha
5f00: 74 20 74 68 65 20 64 61 74 61 62 61 73 65 2d 63  t the database-c
5f10: 6f 6e 6e 65 63 74 69 6f 6e 20 6d 75 74 65 78 20  onnection mutex 
5f20: 69 73 20 68 65 6c 64 20 66 6f 72 20 70 61 67 65  is held for page
5f30: 72 20 58 20 61 6e 64 20 61 73 73 65 72 74 73 20  r X and asserts 
5f40: 69 66 20 69 74 0a 2a 2a 20 69 73 20 6e 6f 74 2e  if it.** is not.
5f50: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
5f60: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
5f70: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74 61  MANAGEMENT.  sta
5f80: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45 6e  tic void pagerEn
5f90: 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a 20  ter(Pager *p){. 
5fa0: 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b 2b     p->iInUseDB++
5fb0: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e  ;.    if( p->iIn
5fc0: 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e 55  UseMM && p->iInU
5fd0: 73 65 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e 64  seDB==1 ){.#ifnd
5fe0: 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  ef SQLITE_MUTEX_
5ff0: 4e 4f 4f 50 0a 20 20 20 20 20 20 73 71 6c 69 74  NOOP.      sqlit
6000: 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b  e3_mutex *mutex;
6010: 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73  .      mutex = s
6020: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
6030: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
6040: 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
6050: 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 69 49  ndif.      p->iI
6060: 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20 20  nUseDB = 0;.    
6070: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6080: 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20  enter(mutex);.  
6090: 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69      assert( p->i
60a0: 49 6e 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20  InUseMM==0 );.  
60b0: 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20      p->iInUseDB 
60c0: 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 1;.      sqlit
60d0: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
60e0: 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  utex);.    }.  }
60f0: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
6100: 61 67 65 72 4c 65 61 76 65 28 50 61 67 65 72 20  agerLeave(Pager 
6110: 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55  *p){.    p->iInU
6120: 73 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65  seDB--;.    asse
6130: 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e  rt( p->iInUseDB>
6140: 3d 30 20 29 3b 0a 20 20 7d 0a 23 20 64 65 66 69  =0 );.  }.# defi
6150: 6e 65 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c  ne pagerMutexHel
6160: 64 28 58 29 20 20 61 73 73 65 72 74 28 20 28 58  d(X)  assert( (X
6170: 29 2d 3e 69 49 6e 55 73 65 44 42 3e 30 20 7c 7c  )->iInUseDB>0 ||
6180: 20 21 28 58 29 2d 3e 6f 6e 50 61 67 65 72 4c 69   !(X)->onPagerLi
6190: 73 74 20 29 0a 23 65 6c 73 65 0a 23 20 64 65 66  st ).#else.# def
61a0: 69 6e 65 20 70 61 67 65 72 45 6e 74 65 72 28 58  ine pagerEnter(X
61b0: 29 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 72  ).# define pager
61c0: 4c 65 61 76 65 28 58 29 0a 23 20 64 65 66 69 6e  Leave(X).# defin
61d0: 65 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c 64  e pagerMutexHeld
61e0: 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
61f0: 2a 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74  * Add page pPg t
6200: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
6210: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e   linked list man
6220: 61 67 65 64 20 62 79 20 73 74 72 75 63 74 75 72  aged by structur
6230: 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20  e.** pList (pPg 
6240: 62 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74  becomes the last
6250: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69   entry in the li
6260: 73 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65  st - the most re
6270: 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29  cently .** used)
6280: 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b  . Argument pLink
6290: 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f   should point to
62a0: 20 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65   either pPg->fre
62b0: 65 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c  e or pPg->gfree,
62c0: 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  .** depending on
62d0: 20 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20   whether pPg is 
62e0: 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
62f0: 68 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69  he pager-specifi
6300: 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c  c or.** global L
6310: 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74  RU list..*/.stat
6320: 69 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28  ic void listAdd(
6330: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c  PagerLruList *pL
6340: 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e  ist, PagerLruLin
6350: 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20  k *pLink, PgHdr 
6360: 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e  *pPg){.  pLink->
6370: 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69  pNext = 0;.  pLi
6380: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73  nk->pPrev = pLis
6390: 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65  t->pLast;..#ifde
63a0: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
63b0: 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
63c0: 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  T.  assert(pLink
63d0: 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20  ==&pPg->free || 
63e0: 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72  pLink==&pPg->gfr
63f0: 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c  ee);.  assert(pL
6400: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65  ink==&pPg->gfree
6410: 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69   || pList!=&sqli
6420: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b  te3LruPageList);
6430: 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70  .#endif..  if( p
6440: 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20  List->pLast ){. 
6450: 20 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63     int iOff = (c
6460: 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63  har *)pLink - (c
6470: 68 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50  har *)pPg;.    P
6480: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61  agerLruLink *pLa
6490: 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  stLink = (PagerL
64a0: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
64b0: 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b  *)pList->pLast)[
64c0: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73  iOff]);.    pLas
64d0: 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70  tLink->pNext = p
64e0: 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  Pg;.  }else{.   
64f0: 20 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e   assert(!pList->
6500: 70 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69  pFirst);.    pLi
6510: 73 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  st->pFirst = pPg
6520: 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e  ;.  }..  pList->
6530: 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69  pLast = pPg;.  i
6540: 66 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73  f( !pList->pFirs
6550: 74 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e  tSynced && pPg->
6560: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20  needSync==0 ){. 
6570: 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74     pList->pFirst
6580: 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
6590: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76  }.}../*.** Remov
65a0: 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c  e pPg from the l
65b0: 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74  ist managed by t
65c0: 68 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69  he structure poi
65d0: 6e 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74  nted to by pList
65e0: 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ..**.** Argument
65f0: 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f   pLink should po
6600: 69 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50  int to either pP
6610: 67 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e  g->free or pPg->
6620: 67 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67  gfree, depending
6630: 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20   .** on whether 
6640: 70 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64  pPg is being add
6650: 65 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d  ed to the pager-
6660: 73 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62  specific or glob
6670: 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a  al LRU list..*/.
6680: 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74  static void list
6690: 52 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c  Remove(PagerLruL
66a0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65  ist *pList, Page
66b0: 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c  rLruLink *pLink,
66c0: 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
66d0: 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72  int iOff = (char
66e0: 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72   *)pLink - (char
66f0: 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20   *)pPg;..#ifdef 
6700: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
6710: 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
6720: 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d    assert(pLink==
6730: 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c  &pPg->free || pL
6740: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65  ink==&pPg->gfree
6750: 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  );.  assert(pLin
6760: 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c  k==&pPg->gfree |
6770: 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65  | pList!=&sqlite
6780: 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23  3LruPageList);.#
6790: 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67  endif..  if( pPg
67a0: 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20  ==pList->pFirst 
67b0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46  ){.    pList->pF
67c0: 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e  irst = pLink->pN
67d0: 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ext;.  }.  if( p
67e0: 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74  Pg==pList->pLast
67f0: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70   ){.    pList->p
6800: 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50  Last = pLink->pP
6810: 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  rev;.  }.  if( p
6820: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20  Link->pPrev ){. 
6830: 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20     PagerLruLink 
6840: 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61  *pPrevLink = (Pa
6850: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28  gerLruLink *)(&(
6860: 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72  (u8 *)pLink->pPr
6870: 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  ev)[iOff]);.    
6880: 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74  pPrevLink->pNext
6890: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b   = pLink->pNext;
68a0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b  .  }.  if( pLink
68b0: 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50  ->pNext ){.    P
68c0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65  agerLruLink *pNe
68d0: 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c  xtLink = (PagerL
68e0: 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20  ruLink *)(&((u8 
68f0: 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b  *)pLink->pNext)[
6900: 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78  iOff]);.    pNex
6910: 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70  tLink->pPrev = p
6920: 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d  Link->pPrev;.  }
6930: 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73  .  if( pPg==pLis
6940: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
6950: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20  ){.    PgHdr *p 
6960: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
6970: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
6980: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  p->needSync ){. 
6990: 20 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e       PagerLruLin
69a0: 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72  k *pL = (PagerLr
69b0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
69c0: 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20  )p)[iOff]);.    
69d0: 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b    p = pL->pNext;
69e0: 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74  .    }.    pList
69f0: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
6a00: 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b   p;.  }..  pLink
6a10: 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d  ->pNext = pLink-
6a20: 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f  >pPrev = 0;.}../
6a30: 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70  * .** Add page p
6a40: 50 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f  Pg to the list o
6a50: 66 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72  f free pages for
6a60: 20 74 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a   the pager. If .
6a70: 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65  ** memory-manage
6a80: 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c  ment is enabled,
6a90: 20 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61   also add the pa
6aa0: 67 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c  ge to the global
6ab0: 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65   .** list of fre
6ac0: 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  e pages..*/.stat
6ad0: 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41  ic void lruListA
6ae0: 64 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  dd(PgHdr *pPg){.
6af0: 20 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e    listAdd(&pPg->
6b00: 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50  pPager->lru, &pP
6b10: 67 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23  g->free, pPg);.#
6b20: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
6b30: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
6b40: 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67  EMENT.  if( !pPg
6b50: 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20  ->pPager->memDb 
6b60: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
6b70: 75 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74  utex_enter(sqlit
6b80: 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
6b90: 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
6ba0: 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69  IC_LRU));.    li
6bb0: 73 74 41 64 64 28 26 73 71 6c 69 74 65 33 4c 72  stAdd(&sqlite3Lr
6bc0: 75 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d  uPageList, &pPg-
6bd0: 3e 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20  >gfree, pPg);.  
6be0: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6bf0: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
6c00: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6c10: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6c20: 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  U));.  }.#endif.
6c30: 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65  }../* .** Remove
6c40: 20 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74   page pPg from t
6c50: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  he list of free 
6c60: 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 61 73  pages for the as
6c70: 73 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a  sociated pager..
6c80: 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  ** If memory-man
6c90: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6ca0: 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20  ed, also remove 
6cb0: 70 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f  pPg from the glo
6cc0: 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66  bal list.** of f
6cd0: 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74  ree pages..*/.st
6ce0: 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73  atic void lruLis
6cf0: 74 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70  tRemove(PgHdr *p
6d00: 50 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76  Pg){.  listRemov
6d10: 65 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  e(&pPg->pPager->
6d20: 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c  lru, &pPg->free,
6d30: 20 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51   pPg);.#ifdef SQ
6d40: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
6d50: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
6d60: 69 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72  if( !pPg->pPager
6d70: 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73  ->memDb ){.    s
6d80: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
6d90: 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  er(sqlite3_mutex
6da0: 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
6db0: 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29  TEX_STATIC_LRU))
6dc0: 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65  ;.    listRemove
6dd0: 28 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  (&sqlite3LruPage
6de0: 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65  List, &pPg->gfre
6df0: 65 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c  e, pPg);.    sql
6e00: 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65  ite3_mutex_leave
6e10: 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61  (sqlite3_mutex_a
6e20: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
6e30: 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a  X_STATIC_LRU));.
6e40: 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a    }.#endif.}../*
6e50: 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69   .** This functi
6e60: 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73  on is called jus
6e70: 74 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64  t after the need
6e80: 53 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65  Sync flag has be
6e90: 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72  en cleared.** fr
6ea0: 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e  om all pages man
6eb0: 61 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28  aged by pPager (
6ec0: 75 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20  usually because 
6ed0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
6ee0: 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65  .** has just bee
6ef0: 6e 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70  n synced). It up
6f00: 64 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72  dates the pPager
6f10: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
6f20: 65 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61  ed variable.** a
6f30: 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61  nd, if memory-ma
6f40: 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62  nagement is enab
6f50: 6c 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33  led, the sqlite3
6f60: 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
6f70: 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69  stSynced.** vari
6f80: 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74  able also..*/.st
6f90: 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73  atic void lruLis
6fa0: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
6fb0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
6fc0: 20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46    pPager->lru.pF
6fd0: 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61  irstSynced = pPa
6fe0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b  ger->lru.pFirst;
6ff0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7000: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
7010: 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  AGEMENT.  if( !p
7020: 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a  Pager->memDb ){.
7030: 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
7040: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
7050: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
7060: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
7070: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
7080: 55 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73  U));.    for(p=s
7090: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
70a0: 74 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20 70  t.pFirst; p && p
70b0: 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d  ->needSync; p=p-
70c0: 3e 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20  >gfree.pNext);. 
70d0: 20 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61     assert(p==pPa
70e0: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
70f0: 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69  ynced || p==sqli
7100: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
7110: 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20  FirstSynced);.  
7120: 20 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65    sqlite3LruPage
7130: 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65  List.pFirstSynce
7140: 64 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74  d = p;.    sqlit
7150: 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73  e3_mutex_leave(s
7160: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
7170: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
7180: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
7190: 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a  }.#endif.}../*.*
71a0: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
71b0: 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61   page *pPg has a
71c0: 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
71d0: 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65  ten to the state
71e0: 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ment.** journal 
71f0: 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e  (or statement sn
7200: 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20  apshot has been 
7210: 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67  created, if *pPg
7220: 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61   is part.** of a
7230: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
7240: 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  base)..*/.static
7250: 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65   int pageInState
7260: 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29  ment(PgHdr *pPg)
7270: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
7280: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
7290: 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
72a0: 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52      return PGHDR
72b0: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
72c0: 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20  ager)->inStmt;. 
72d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
72e0: 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  rn sqlite3Bitvec
72f0: 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
7300: 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
7310: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
7320: 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20 6f  hange the size o
7330: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 68  f the pager hash
7340: 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e 20   table to N.  N 
7350: 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72 0a  must be a power.
7360: 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73 74  ** of two..*/.st
7370: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
7380: 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
7390: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
73a0: 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64 72   int N){.  PgHdr
73b0: 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b 0a   **aHash, *pPg;.
73c0: 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26 26    assert( N>0 &&
73d0: 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29 3b   (N&(N-1))==0 );
73e0: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4d  .#ifdef SQLITE_M
73f0: 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49 54  ALLOC_SOFT_LIMIT
7400: 0a 20 20 69 66 28 20 4e 2a 73 69 7a 65 6f 66 28  .  if( N*sizeof(
7410: 61 48 61 73 68 5b 30 5d 29 3e 53 51 4c 49 54 45  aHash[0])>SQLITE
7420: 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d  _MALLOC_SOFT_LIM
7430: 49 54 20 29 7b 0a 20 20 20 20 4e 20 3d 20 53 51  IT ){.    N = SQ
7440: 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54  LITE_MALLOC_SOFT
7450: 5f 4c 49 4d 49 54 2f 73 69 7a 65 6f 66 28 61 48  _LIMIT/sizeof(aH
7460: 61 73 68 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20 69  ash[0]);.  }.  i
7470: 66 28 20 4e 3d 3d 70 50 61 67 65 72 2d 3e 6e 48  f( N==pPager->nH
7480: 61 73 68 20 29 20 72 65 74 75 72 6e 3b 0a 23 65  ash ) return;.#e
7490: 6e 64 69 66 0a 20 20 70 61 67 65 72 4c 65 61 76  ndif.  pagerLeav
74a0: 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  e(pPager);.  if(
74b0: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 21 3d   pPager->aHash!=
74c0: 30 20 29 20 73 71 6c 69 74 65 33 46 61 75 6c 74  0 ) sqlite3Fault
74d0: 42 65 67 69 6e 42 65 6e 69 67 6e 28 53 51 4c 49  BeginBenign(SQLI
74e0: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
74f0: 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 61 48 61 73  _MALLOC);.  aHas
7500: 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f  h = sqlite3Mallo
7510: 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61 48  cZero( sizeof(aH
7520: 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 69  ash[0])*N );.  i
7530: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
7540: 21 3d 30 20 29 20 73 71 6c 69 74 65 33 46 61 75  !=0 ) sqlite3Fau
7550: 6c 74 45 6e 64 42 65 6e 69 67 6e 28 53 51 4c 49  ltEndBenign(SQLI
7560: 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52  TE_FAULTINJECTOR
7570: 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 70 61 67 65  _MALLOC);.  page
7580: 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
7590: 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20 29    if( aHash==0 )
75a0: 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72 65  {.    /* Failure
75b0: 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e 6f   to rehash is no
75c0: 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74 20  t an error.  It 
75d0: 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f 72  is only a perfor
75e0: 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20 20  mance hit. */.  
75f0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
7600: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61  sqlite3_free(pPa
7610: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
7620: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 4e  Pager->nHash = N
7630: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
7640: 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 70 61 67  h = aHash;.  pag
7650: 65 72 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67  erMutexHeld(pPag
7660: 65 72 29 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  er);.  for(pPg=p
7670: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
7680: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
7690: 41 6c 6c 29 7b 0a 20 20 20 20 69 6e 74 20 68 3b  All){.    int h;
76a0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
76b0: 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  no==0 ){.      a
76c0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
76d0: 74 48 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d  tHash==0 && pPg-
76e0: 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
76f0: 0a 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b  .      continue;
7700: 0a 20 20 20 20 7d 0a 20 20 20 20 68 20 3d 20 70  .    }.    h = p
7710: 50 67 2d 3e 70 67 6e 6f 20 26 20 28 4e 2d 31 29  Pg->pgno & (N-1)
7720: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
7730: 48 61 73 68 20 3d 20 61 48 61 73 68 5b 68 5d 3b  Hash = aHash[h];
7740: 0a 20 20 20 20 69 66 28 20 61 48 61 73 68 5b 68  .    if( aHash[h
7750: 5d 20 29 7b 0a 20 20 20 20 20 20 61 48 61 73 68  ] ){.      aHash
7760: 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  [h]->pPrevHash =
7770: 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
7780: 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
7790: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61      pPg->pPrevHa
77a0: 73 68 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  sh = 0;.  }.}../
77b0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62  *.** Read a 32-b
77c0: 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20  it integer from 
77d0: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
77e0: 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72  escriptor.  Stor
77f0: 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  e the integer.**
7800: 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e   that is read in
7810: 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20   *pRes.  Return 
7820: 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65  SQLITE_OK if eve
7830: 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20  rything worked, 
7840: 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63  or an.** error c
7850: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
7860: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a   goes wrong..**.
7870: 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72  ** All values ar
7880: 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b  e stored on disk
7890: 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a   as big-endian..
78a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
78b0: 61 64 33 32 62 69 74 73 28 73 71 6c 69 74 65 33  ad32bits(sqlite3
78c0: 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f  _file *fd, i64 o
78d0: 66 66 73 65 74 2c 20 75 33 32 20 2a 70 52 65 73  ffset, u32 *pRes
78e0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
78f0: 61 72 20 61 63 5b 34 5d 3b 0a 20 20 69 6e 74 20  ar ac[4];.  int 
7900: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7910: 61 64 28 66 64 2c 20 61 63 2c 20 73 69 7a 65 6f  ad(fd, ac, sizeo
7920: 66 28 61 63 29 2c 20 6f 66 66 73 65 74 29 3b 0a  f(ac), offset);.
7930: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
7940: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73  _OK ){.    *pRes
7950: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79   = sqlite3Get4by
7960: 74 65 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65  te(ac);.  }.  re
7970: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7980: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
7990: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20   integer into a 
79a0: 73 74 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e  string buffer in
79b0: 20 62 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65   big-endian byte
79c0: 20 6f 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69   order..*/.#defi
79d0: 6e 65 20 70 75 74 33 32 62 69 74 73 28 41 2c 42  ne put32bits(A,B
79e0: 29 20 20 73 71 6c 69 74 65 33 50 75 74 34 62 79  )  sqlite3Put4by
79f0: 74 65 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a  te((u8*)A,B)../*
7a00: 0a 2a 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62  .** Write a 32-b
7a10: 69 74 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20  it integer into 
7a20: 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64  the given file d
7a30: 65 73 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75  escriptor.  Retu
7a40: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  rn SQLITE_OK.** 
7a50: 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e  on success or an
7a60: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
7a70: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7a80: 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ong..*/.static i
7a90: 6e 74 20 77 72 69 74 65 33 32 62 69 74 73 28 73  nt write32bits(s
7aa0: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c  qlite3_file *fd,
7ab0: 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33 32   i64 offset, u32
7ac0: 20 76 61 6c 29 7b 0a 20 20 63 68 61 72 20 61 63   val){.  char ac
7ad0: 5b 34 5d 3b 0a 20 20 70 75 74 33 32 62 69 74 73  [4];.  put32bits
7ae0: 28 61 63 2c 20 76 61 6c 29 3b 0a 20 20 72 65 74  (ac, val);.  ret
7af0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
7b00: 74 65 28 66 64 2c 20 61 63 2c 20 34 2c 20 6f 66  te(fd, ac, 4, of
7b10: 66 73 65 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  fset);.}../*.** 
7b20: 49 66 20 66 69 6c 65 20 70 46 64 20 69 73 20 6f  If file pFd is o
7b30: 70 65 6e 2c 20 63 61 6c 6c 20 73 71 6c 69 74 65  pen, call sqlite
7b40: 33 4f 73 55 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69  3OsUnlock() on i
7b50: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
7b60: 20 6f 73 55 6e 6c 6f 63 6b 28 73 71 6c 69 74 65   osUnlock(sqlite
7b70: 33 5f 66 69 6c 65 20 2a 70 46 64 2c 20 69 6e 74  3_file *pFd, int
7b80: 20 65 4c 6f 63 6b 29 7b 0a 20 20 69 66 28 20 21   eLock){.  if( !
7b90: 70 46 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  pFd->pMethods ){
7ba0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7bb0: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 65 74  TE_OK;.  }.  ret
7bc0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c  urn sqlite3OsUnl
7bd0: 6f 63 6b 28 70 46 64 2c 20 65 4c 6f 63 6b 29 3b  ock(pFd, eLock);
7be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
7bf0: 75 6e 63 74 69 6f 6e 20 64 65 74 65 72 6d 69 6e  unction determin
7c00: 65 73 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  es whether or no
7c10: 74 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  t the atomic-wri
7c20: 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 0a  te optimization.
7c30: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 20 77  ** can be used w
7c40: 69 74 68 20 74 68 69 73 20 70 61 67 65 72 2e 20  ith this pager. 
7c50: 54 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  The optimization
7c60: 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 3a   can be used if:
7c70: 0a 2a 2a 0a 2a 2a 20 20 28 61 29 20 74 68 65 20  .**.**  (a) the 
7c80: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62  value returned b
7c90: 79 20 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  y OsDeviceCharac
7ca0: 74 65 72 69 73 74 69 63 73 28 29 20 69 6e 64 69  teristics() indi
7cb0: 63 61 74 65 73 20 74 68 61 74 0a 2a 2a 20 20 20  cates that.**   
7cc0: 20 20 20 61 20 64 61 74 61 62 61 73 65 20 70 61     a database pa
7cd0: 67 65 20 6d 61 79 20 62 65 20 77 72 69 74 74 65  ge may be writte
7ce0: 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e  n atomically, an
7cf0: 64 0a 2a 2a 20 20 28 62 29 20 74 68 65 20 76 61  d.**  (b) the va
7d00: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 62 79 20  lue returned by 
7d10: 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 20 69  OsSectorSize() i
7d20: 73 20 6c 65 73 73 20 74 68 61 6e 20 6f 72 20 65  s less than or e
7d30: 71 75 61 6c 0a 2a 2a 20 20 20 20 20 20 74 6f 20  qual.**      to 
7d40: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
7d50: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69  *.** If the opti
7d60: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 6e 6f 74 20  mization cannot 
7d70: 62 65 20 75 73 65 64 2c 20 30 20 69 73 20 72 65  be used, 0 is re
7d80: 74 75 72 6e 65 64 2e 20 49 66 20 69 74 20 63 61  turned. If it ca
7d90: 6e 20 62 65 20 75 73 65 64 2c 0a 2a 2a 20 74 68  n be used,.** th
7da0: 65 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  en the value ret
7db0: 75 72 6e 65 64 20 69 73 20 74 68 65 20 73 69 7a  urned is the siz
7dc0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
7dd0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 0a 2a 2a   file when it.**
7de0: 20 63 6f 6e 74 61 69 6e 73 20 72 6f 6c 6c 62 61   contains rollba
7df0: 63 6b 20 64 61 74 61 20 66 6f 72 20 65 78 61 63  ck data for exac
7e00: 74 6c 79 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f  tly one page..*/
7e10: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7e20: 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
7e30: 54 45 0a 73 74 61 74 69 63 20 69 6e 74 20 6a 72  TE.static int jr
7e40: 6e 6c 42 75 66 66 65 72 53 69 7a 65 28 50 61 67  nlBufferSize(Pag
7e50: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
7e60: 6e 74 20 64 63 3b 20 20 20 20 20 20 20 20 20 20  nt dc;          
7e70: 20 2f 2a 20 44 65 76 69 63 65 20 63 68 61 72 61   /* Device chara
7e80: 63 74 65 72 69 73 74 69 63 73 20 2a 2f 0a 20 20  cteristics */.  
7e90: 69 6e 74 20 6e 53 65 63 74 6f 72 3b 20 20 20 20  int nSector;    
7ea0: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
7eb0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
7ec0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
7ed0: 73 69 7a 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  size */.  sqlite
7ee0: 33 5f 66 69 6c 65 20 2a 66 64 20 3d 20 70 50 61  3_file *fd = pPa
7ef0: 67 65 72 2d 3e 66 64 3b 0a 0a 20 20 69 66 28 20  ger->fd;..  if( 
7f00: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
7f10: 20 20 20 20 64 63 20 3d 20 73 71 6c 69 74 65 33      dc = sqlite3
7f20: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
7f30: 72 69 73 74 69 63 73 28 66 64 29 3b 0a 20 20 20  ristics(fd);.   
7f40: 20 6e 53 65 63 74 6f 72 20 3d 20 73 71 6c 69 74   nSector = sqlit
7f50: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 66  e3OsSectorSize(f
7f60: 64 29 3b 0a 20 20 20 20 6e 50 61 67 65 20 3d 20  d);.    nPage = 
7f70: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7f80: 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
7f90: 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f  SQLITE_IOCAP_ATO
7fa0: 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e 38 29  MIC512==(512>>8)
7fb0: 29 3b 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  );.  assert(SQLI
7fc0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
7fd0: 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
7fe0: 0a 0a 20 20 69 66 28 20 21 66 64 2d 3e 70 4d 65  ..  if( !fd->pMe
7ff0: 74 68 6f 64 73 20 7c 7c 20 28 64 63 26 28 53 51  thods || (dc&(SQ
8000: 4c 49 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49  LITE_IOCAP_ATOMI
8010: 43 7c 28 6e 50 61 67 65 3e 3e 38 29 29 26 26 6e  C|(nPage>>8))&&n
8020: 53 65 63 74 6f 72 3c 3d 6e 50 61 67 65 29 20 29  Sector<=nPage) )
8030: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 4a 4f 55  {.    return JOU
8040: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
8050: 65 72 29 20 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47  er) + JOURNAL_PG
8060: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
8070: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23  .  return 0;.}.#
8080: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  endif../*.** Thi
8090: 73 20 66 75 6e 63 74 69 6f 6e 20 73 68 6f 75 6c  s function shoul
80a0: 64 20 62 65 20 63 61 6c 6c 65 64 20 77 68 65 6e  d be called when
80b0: 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 73   an error occurs
80c0: 20 77 69 74 68 69 6e 20 74 68 65 20 70 61 67 65   within the page
80d0: 72 0a 2a 2a 20 63 6f 64 65 2e 20 54 68 65 20 66  r.** code. The f
80e0: 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69 73  irst argument is
80f0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
8100: 65 20 70 61 67 65 72 20 73 74 72 75 63 74 75 72  e pager structur
8110: 65 2c 20 74 68 65 0a 2a 2a 20 73 65 63 6f 6e 64  e, the.** second
8120: 20 74 68 65 20 65 72 72 6f 72 2d 63 6f 64 65 20   the error-code 
8130: 61 62 6f 75 74 20 74 6f 20 62 65 20 72 65 74 75  about to be retu
8140: 72 6e 65 64 20 62 79 20 61 20 70 61 67 65 72 20  rned by a pager 
8150: 41 50 49 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a  API function. .*
8160: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
8170: 72 6e 65 64 20 69 73 20 61 20 63 6f 70 79 20 6f  rned is a copy o
8180: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
8190: 75 6d 65 6e 74 20 74 6f 20 74 68 69 73 20 66 75  ument to this fu
81a0: 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49  nction. .**.** I
81b0: 66 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  f the second arg
81c0: 75 6d 65 6e 74 20 69 73 20 53 51 4c 49 54 45 5f  ument is SQLITE_
81d0: 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43 4f  IOERR, SQLITE_CO
81e0: 52 52 55 50 54 2c 20 6f 72 20 53 51 4c 49 54 45  RRUPT, or SQLITE
81f0: 5f 46 55 4c 4c 0a 2a 2a 20 74 68 65 20 65 72 72  _FULL.** the err
8200: 6f 72 20 62 65 63 6f 6d 65 73 20 70 65 72 73 69  or becomes persi
8210: 73 74 65 6e 74 2e 20 55 6e 74 69 6c 20 74 68 65  stent. Until the
8220: 20 70 65 72 73 69 73 74 65 6e 20 65 72 72 6f 72   persisten error
8230: 20 69 73 20 63 6c 65 61 72 65 64 2c 0a 2a 2a 20   is cleared,.** 
8240: 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63  subsequent API c
8250: 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67  alls on this Pag
8260: 65 72 20 77 69 6c 6c 20 69 6d 6d 65 64 69 61 74  er will immediat
8270: 65 6c 79 20 72 65 74 75 72 6e 20 74 68 65 20 73  ely return the s
8280: 61 6d 65 20 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  ame .** error co
8290: 64 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 70 65 72 73  de..**.** A pers
82a0: 69 73 74 65 6e 74 20 65 72 72 6f 72 20 69 6e 64  istent error ind
82b0: 69 63 61 74 65 73 20 74 68 61 74 20 74 68 65 20  icates that the 
82c0: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20  contents of the 
82d0: 70 61 67 65 72 2d 63 61 63 68 65 20 0a 2a 2a 20  pager-cache .** 
82e0: 63 61 6e 6e 6f 74 20 62 65 20 74 72 75 73 74 65  cannot be truste
82f0: 64 2e 20 54 68 69 73 20 73 74 61 74 65 20 63 61  d. This state ca
8300: 6e 20 62 65 20 63 6c 65 61 72 65 64 20 62 79 20  n be cleared by 
8310: 63 6f 6d 70 6c 65 74 65 6c 79 20 64 69 73 63 61  completely disca
8320: 72 64 69 6e 67 20 0a 2a 2a 20 74 68 65 20 63 6f  rding .** the co
8330: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
8340: 67 65 72 2d 63 61 63 68 65 2e 20 49 66 20 61 20  ger-cache. If a 
8350: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
8360: 61 63 74 69 76 65 20 77 68 65 6e 0a 2a 2a 20 74  active when.** t
8370: 68 65 20 70 65 72 73 69 73 74 65 6e 74 20 65 72  he persistent er
8380: 72 6f 72 20 6f 63 63 75 72 65 64 2c 20 74 68 65  ror occured, the
8390: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
83a0: 6f 75 72 6e 61 6c 20 6d 61 79 20 6e 65 65 64 0a  ournal may need.
83b0: 2a 2a 20 74 6f 20 62 65 20 72 65 70 6c 61 79 65  ** to be replaye
83c0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
83d0: 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50  d pager_unlock(P
83e0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 73  ager *pPager);.s
83f0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
8400: 65 72 72 6f 72 28 50 61 67 65 72 20 2a 70 50 61  error(Pager *pPa
8410: 67 65 72 2c 20 69 6e 74 20 72 63 29 7b 0a 20 20  ger, int rc){.  
8420: 69 6e 74 20 72 63 32 20 3d 20 72 63 20 26 20 30  int rc2 = rc & 0
8430: 78 66 66 3b 0a 20 20 61 73 73 65 72 74 28 0a 20  xff;.  assert(. 
8440: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72        pPager->er
8450: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
8460: 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 70 50 61  LL ||.       pPa
8470: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
8480: 4c 49 54 45 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20  LITE_OK ||.     
8490: 20 20 28 70 50 61 67 65 72 2d 3e 65 72 72 43 6f    (pPager->errCo
84a0: 64 65 20 26 20 30 78 66 66 29 3d 3d 53 51 4c 49  de & 0xff)==SQLI
84b0: 54 45 5f 49 4f 45 52 52 0a 20 20 29 3b 0a 20 20  TE_IOERR.  );.  
84c0: 69 66 28 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c  if(.    rc2==SQL
84d0: 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20  ITE_FULL ||.    
84e0: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52  rc2==SQLITE_IOER
84f0: 52 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51  R ||.    rc2==SQ
8500: 4c 49 54 45 5f 43 4f 52 52 55 50 54 0a 20 20 29  LITE_CORRUPT.  )
8510: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72  {.    pPager->er
8520: 72 43 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20  rCode = rc;.    
8530: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8540: 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
8550: 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
8560: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  =0 ){.      /* I
8570: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 61  f the pager is a
8580: 6c 72 65 61 64 79 20 75 6e 6c 6f 63 6b 65 64 2c  lready unlocked,
8590: 20 63 61 6c 6c 20 70 61 67 65 72 5f 75 6e 6c 6f   call pager_unlo
85a0: 63 6b 28 29 20 6e 6f 77 20 74 6f 0a 20 20 20 20  ck() now to.    
85b0: 20 20 2a 2a 20 63 6c 65 61 72 20 74 68 65 20 65    ** clear the e
85c0: 72 72 6f 72 20 73 74 61 74 65 20 61 6e 64 20 65  rror state and e
85d0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 70  nsure that the p
85e0: 61 67 65 72 2d 63 61 63 68 65 20 69 73 20 0a 20  ager-cache is . 
85f0: 20 20 20 20 20 2a 2a 20 63 6f 6d 70 6c 65 74 65       ** complete
8600: 6c 79 20 65 6d 70 74 79 2e 0a 20 20 20 20 20 20  ly empty..      
8610: 2a 2f 0a 20 20 20 20 20 20 70 61 67 65 72 5f 75  */.      pager_u
8620: 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  nlock(pPager);. 
8630: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
8640: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
8650: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8660: 41 47 45 53 20 69 73 20 64 65 66 69 6e 65 64 20  AGES is defined 
8670: 74 68 65 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20  then we do some 
8680: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 0a  sanity checking.
8690: 2a 2a 20 6f 6e 20 74 68 65 20 63 61 63 68 65 20  ** on the cache 
86a0: 75 73 69 6e 67 20 61 20 68 61 73 68 20 66 75 6e  using a hash fun
86b0: 63 74 69 6f 6e 2e 20 20 54 68 69 73 20 69 73 20  ction.  This is 
86c0: 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
86d0: 0a 2a 2a 20 61 6e 64 20 64 65 62 75 67 67 69 6e  .** and debuggin
86e0: 67 20 6f 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65  g only..*/.#ifde
86f0: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
8700: 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  AGES./*.** Retur
8710: 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68 20  n a 32-bit hash 
8720: 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74 61  of the page data
8730: 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73   for pPage..*/.s
8740: 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f  tatic u32 pager_
8750: 64 61 74 61 68 61 73 68 28 69 6e 74 20 6e 42 79  datahash(int nBy
8760: 74 65 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61  te, unsigned cha
8770: 72 20 2a 70 44 61 74 61 29 7b 0a 20 20 75 33 32  r *pData){.  u32
8780: 20 68 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74   hash = 0;.  int
8790: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
87a0: 3c 6e 42 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20  <nByte; i++){.  
87b0: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2a 31    hash = (hash*1
87c0: 30 33 39 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b  039) + pData[i];
87d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 68 61  .  }.  return ha
87e0: 73 68 3b 0a 7d 0a 73 74 61 74 69 63 20 75 33 32  sh;.}.static u32
87f0: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
8800: 50 67 48 64 72 20 2a 70 50 61 67 65 29 7b 0a 20  PgHdr *pPage){. 
8810: 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 64 61   return pager_da
8820: 74 61 68 61 73 68 28 70 50 61 67 65 2d 3e 70 50  tahash(pPage->pP
8830: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
8840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8850: 20 20 20 20 20 20 20 20 20 28 75 6e 73 69 67 6e           (unsign
8860: 65 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f  ed char *)PGHDR_
8870: 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29 29 3b  TO_DATA(pPage));
8880: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48  .}../*.** The CH
8890: 45 43 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74  ECK_PAGE macro t
88a0: 61 6b 65 73 20 61 20 50 67 48 64 72 2a 20 61 73  akes a PgHdr* as
88b0: 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66   an argument. If
88c0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
88d0: 47 45 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65  GES.** is define
88e0: 64 2c 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73  d, and NDEBUG is
88f0: 20 6e 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e   not defined, an
8900: 20 61 73 73 65 72 74 28 29 20 73 74 61 74 65 6d   assert() statem
8910: 65 6e 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68  ent checks.** th
8920: 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20 65  at the page is e
8930: 69 74 68 65 72 20 64 69 72 74 79 20 6f 72 20 73  ither dirty or s
8940: 74 69 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65  till matches the
8950: 20 63 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65   calculated page
8960: 2d 68 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e  -hash..*/.#defin
8970: 65 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20  e CHECK_PAGE(x) 
8980: 63 68 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61  checkPage(x).sta
8990: 74 69 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61  tic void checkPa
89a0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
89b0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
89c0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
89d0: 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70   assert( !pPg->p
89e0: 61 67 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65  ageHash || pPage
89f0: 72 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45  r->errCode || ME
8a00: 4d 44 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74  MDB || pPg->dirt
8a10: 79 20 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d  y || .      pPg-
8a20: 3e 70 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72  >pageHash==pager
8a30: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 20 29  _pagehash(pPg) )
8a40: 3b 0a 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69  ;.}..#else.#defi
8a50: 6e 65 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  ne pager_datahas
8a60: 68 28 58 2c 59 29 20 20 30 0a 23 64 65 66 69 6e  h(X,Y)  0.#defin
8a70: 65 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  e pager_pagehash
8a80: 28 58 29 20 20 30 0a 23 64 65 66 69 6e 65 20 43  (X)  0.#define C
8a90: 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e  HECK_PAGE(x).#en
8aa0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  dif../*.** When 
8ab0: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
8ac0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
8ad0: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
8ae0: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
8af0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
8b00: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
8b10: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
8b20: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
8b30: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
8b40: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 73 75 70 70  into memory supp
8b50: 6c 69 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c  lied by the call
8b60: 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74  er. .**.** zMast
8b70: 65 72 20 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f  er must point to
8b80: 20 61 20 62 75 66 66 65 72 20 6f 66 20 61 74 20   a buffer of at 
8b90: 6c 65 61 73 74 20 6e 4d 61 73 74 65 72 20 62 79  least nMaster by
8ba0: 74 65 73 20 61 6c 6c 6f 63 61 74 65 64 20 62 79  tes allocated by
8bb0: 0a 2a 2a 20 74 68 65 20 63 61 6c 6c 65 72 2e 20  .** the caller. 
8bc0: 54 68 69 73 20 73 68 6f 75 6c 64 20 62 65 20 73  This should be s
8bd0: 71 6c 69 74 65 33 5f 76 66 73 2e 6d 78 50 61 74  qlite3_vfs.mxPat
8be0: 68 6e 61 6d 65 2b 31 20 28 74 6f 20 65 6e 73 75  hname+1 (to ensu
8bf0: 72 65 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 65  re there is.** e
8c00: 6e 6f 75 67 68 20 73 70 61 63 65 20 74 6f 20 77  nough space to w
8c10: 72 69 74 65 20 74 68 65 20 6d 61 73 74 65 72 20  rite the master 
8c20: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 29 2e 20 49  journal name). I
8c30: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
8c40: 72 6e 61 6c 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20  rnal.** name in 
8c50: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6c  the journal is l
8c60: 6f 6e 67 65 72 20 74 68 61 6e 20 6e 4d 61 73 74  onger than nMast
8c70: 65 72 20 62 79 74 65 73 20 28 69 6e 63 6c 75 64  er bytes (includ
8c80: 69 6e 67 20 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72  ing a.** nul-ter
8c90: 6d 69 6e 61 74 6f 72 29 2c 20 74 68 65 6e 20 74  minator), then t
8ca0: 68 69 73 20 69 73 20 68 61 6e 64 6c 65 64 20 61  his is handled a
8cb0: 73 20 69 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  s if no master j
8cc0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77  ournal name.** w
8cd0: 65 72 65 20 70 72 65 73 65 6e 74 20 69 6e 20 74  ere present in t
8ce0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
8cf0: 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a  * If no master j
8d00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
8d10: 20 69 73 20 70 72 65 73 65 6e 74 20 7a 4d 61 73   is present zMas
8d20: 74 65 72 5b 30 5d 20 69 73 20 73 65 74 20 74 6f  ter[0] is set to
8d30: 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45   0 and.** SQLITE
8d40: 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  _OK returned..*/
8d50: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
8d60: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 73 71  MasterJournal(sq
8d70: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a 72 6e  lite3_file *pJrn
8d80: 6c 2c 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  l, char *zMaster
8d90: 2c 20 69 6e 74 20 6e 4d 61 73 74 65 72 29 7b 0a  , int nMaster){.
8da0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
8db0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
8dc0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
8dd0: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
8de0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
8df0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
8e00: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
8e10: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73  eader */..  zMas
8e20: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a  ter[0] = '\0';..
8e30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
8e40: 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20  FileSize(pJrnl, 
8e50: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
8e60: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
8e70: 4a 3c 31 36 20 29 20 72 65 74 75 72 6e 20 72 63  J<16 ) return rc
8e80: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
8e90: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  bits(pJrnl, szJ-
8ea0: 31 36 2c 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28  16, &len);.  if(
8eb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
8ec0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
8ed0: 66 28 20 6c 65 6e 3e 3d 6e 4d 61 73 74 65 72 20  f( len>=nMaster 
8ee0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8ef0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20  LITE_OK;.  }..  
8f00: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8f10: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26  pJrnl, szJ-12, &
8f20: 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63  cksum);.  if( rc
8f30: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
8f40: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8f50: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
8f60: 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 2c  Jrnl, aMagic, 8,
8f70: 20 73 7a 4a 2d 38 29 3b 0a 20 20 69 66 28 20 72   szJ-8);.  if( r
8f80: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
8f90: 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20 61  memcmp(aMagic, a
8fa0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29  JournalMagic, 8)
8fb0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8fc0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
8fd0: 65 61 64 28 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74  ead(pJrnl, zMast
8fe0: 65 72 2c 20 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d  er, len, szJ-16-
8ff0: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
9000: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
9010: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
9020: 20 20 7a 4d 61 73 74 65 72 5b 6c 65 6e 5d 20 3d    zMaster[len] =
9030: 20 27 5c 30 27 3b 0a 0a 20 20 2f 2a 20 53 65 65   '\0';..  /* See
9040: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
9050: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
9060: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
9070: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
9080: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
9090: 63 6b 73 75 6d 20 2d 3d 20 7a 4d 61 73 74 65 72  cksum -= zMaster
90a0: 5b 69 5d 3b 0a 20 20 20 7d 0a 20 20 69 66 28 20  [i];.   }.  if( 
90b0: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20  cksum ){.    /* 
90c0: 49 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  If the checksum 
90d0: 64 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20  doesn't add up, 
90e0: 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  then one or more
90f0: 20 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63   of the disk sec
9100: 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74  tors.    ** cont
9110: 61 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65  aining the maste
9120: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r journal filena
9130: 6d 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e  me is corrupted.
9140: 20 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20   This means.    
9150: 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f  ** definitely ro
9160: 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74  ll back, so just
9170: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
9180: 4b 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28  K and report a (
9190: 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74  nul).    ** mast
91a0: 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e  er-journal filen
91b0: 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ame..    */.    
91c0: 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20 27 5c 30  zMaster[0] = '\0
91d0: 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65 74  ';.  }.   .  ret
91e0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
91f0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68 65  ../*.** Seek the
9200: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
9210: 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20  scriptor to the 
9220: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
9230: 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a 20  dary where a.** 
9240: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 6d  journal header m
9250: 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77 72  ay be read or wr
9260: 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f 75  itten. Pager.jou
9270: 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61 74  rnalOff is updat
9280: 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20 6e  ed with.** the n
9290: 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e 0a  ew seek offset..
92a0: 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61 20  **.** i.e for a 
92b0: 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20 35  sector size of 5
92c0: 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20  12:.**.** Input 
92d0: 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20 20  Offset          
92e0: 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73 65      Output Offse
92f0: 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t.** -----------
9300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20  ------------.** 
9320: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
9330: 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20 35            0.** 5
9340: 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20 20  12              
9350: 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a 20           512.** 
9360: 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20 20  100             
9370: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
9380: 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20 20   2000           
9390: 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38 0a             2048.
93a0: 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ** .*/.static vo
93b0: 69 64 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  id seekJournalHd
93c0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
93d0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
93e0: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
93f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
9400: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
9410: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
9420: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
9430: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
9440: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
9450: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
9460: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
9470: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9480: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
9490: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
94a0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
94b0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
94c0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
94d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
94e0: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a  Off = offset;.}.
94f0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 7a 65 72  ./*.** Write zer
9500: 6f 73 20 6f 76 65 72 20 74 68 65 20 68 65 61 64  os over the head
9510: 65 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  er of the journa
9520: 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 68 61  l file.  This ha
9530: 73 20 74 68 65 0a 2a 2a 20 65 66 66 65 63 74 20  s the.** effect 
9540: 6f 66 20 69 6e 76 61 6c 69 64 61 74 69 6e 67 20  of invalidating 
9550: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
9560: 20 61 6e 64 20 63 6f 6d 6d 69 74 74 69 6e 67 20   and committing 
9570: 74 68 65 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69  the.** transacti
9580: 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
9590: 74 20 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72  t zeroJournalHdr
95a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
95b0: 69 6e 74 20 64 6f 54 72 75 6e 63 61 74 65 29 7b  int doTruncate){
95c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
95d0: 54 45 5f 4f 4b 3b 0a 20 20 73 74 61 74 69 63 20  TE_OK;.  static 
95e0: 63 6f 6e 73 74 20 63 68 61 72 20 7a 65 72 6f 48  const char zeroH
95f0: 64 72 5b 32 38 5d 3b 0a 0a 20 20 69 66 28 20 70  dr[28];..  if( p
9600: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9610: 66 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  f ){.    IOTRACE
9620: 28 28 22 4a 5a 45 52 4f 48 44 52 20 25 70 5c 6e  (("JZEROHDR %p\n
9630: 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
9640: 69 66 28 20 64 6f 54 72 75 6e 63 61 74 65 20 29  if( doTruncate )
9650: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9660: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
9670: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a  Pager->jfd, 0);.
9680: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9690: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
96a0: 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  rite(pPager->jfd
96b0: 2c 20 7a 65 72 6f 48 64 72 2c 20 73 69 7a 65 6f  , zeroHdr, sizeo
96c0: 66 28 7a 65 72 6f 48 64 72 29 2c 20 30 29 3b 0a  f(zeroHdr), 0);.
96d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
96e0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
96f0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
9700: 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e  3OsSync(pPager->
9710: 6a 66 64 2c 20 53 51 4c 49 54 45 5f 53 59 4e 43  jfd, SQLITE_SYNC
9720: 5f 44 41 54 41 4f 4e 4c 59 7c 70 50 61 67 65 72  _DATAONLY|pPager
9730: 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20  ->sync_flags);. 
9740: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
9750: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
9760: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9770: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
9780: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
9790: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
97a0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
97b0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
97c0: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
97d0: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
97e0: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
97f0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9800: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
9810: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
9820: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
9830: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
9840: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
9850: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
9860: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
9870: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
9880: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
9890: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
98a0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
98b0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
98c0: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
98d0: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
98e0: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
98f0: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
9900: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
9910: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
9920: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
9930: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
9940: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
9950: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 44  .** - 4 bytes: D
9960: 61 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a  atabase page siz
9970: 65 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  e..** .** Follow
9980: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
9990: 44 52 5f 53 5a 20 2d 20 32 38 29 20 62 79 74 65  DR_SZ - 28) byte
99a0: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
99b0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
99c0: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
99d0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
99e0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
99f0: 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
9a00: 48 65 61 64 65 72 20 3d 20 70 50 61 67 65 72 2d  Header = pPager-
9a10: 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20 20 69 6e  >pTmpSpace;.  in
9a20: 74 20 6e 48 65 61 64 65 72 20 3d 20 70 50 61 67  t nHeader = pPag
9a30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
9a40: 69 6e 74 20 6e 57 72 69 74 65 3b 0a 0a 20 20 69  int nWrite;..  i
9a50: 66 28 20 6e 48 65 61 64 65 72 3e 4a 4f 55 52 4e  f( nHeader>JOURN
9a60: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
9a70: 29 20 29 7b 0a 20 20 20 20 6e 48 65 61 64 65 72  ) ){.    nHeader
9a80: 20 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   = JOURNAL_HDR_S
9a90: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a  Z(pPager);.  }..
9aa0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
9ab0: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
9ac0: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
9ad0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
9ae0: 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 7d 0a  journalOff;.  }.
9af0: 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  .  seekJournalHd
9b00: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  r(pPager);.  pPa
9b10: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
9b20: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
9b30: 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d 63 70 79 28  lOff;..  memcpy(
9b40: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
9b50: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
9b60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
9b70: 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20 57 72 69 74  .  /* .  ** Writ
9b80: 65 20 74 68 65 20 6e 52 65 63 20 46 69 65 6c 64  e the nRec Field
9b90: 20 2d 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66   - the number of
9ba0: 20 70 61 67 65 20 72 65 63 6f 72 64 73 20 74 68   page records th
9bb0: 61 74 20 66 6f 6c 6c 6f 77 20 74 68 69 73 0a 20  at follow this. 
9bc0: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64   ** journal head
9bd0: 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79 2c 20 7a 65  er. Normally, ze
9be0: 72 6f 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ro is written to
9bf0: 20 74 68 69 73 20 76 61 6c 75 65 20 61 74 20 74   this value at t
9c00: 68 69 73 20 74 69 6d 65 2e 0a 20 20 2a 2a 20 41  his time..  ** A
9c10: 66 74 65 72 20 74 68 65 20 72 65 63 6f 72 64 73  fter the records
9c20: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
9c30: 65 20 6a 6f 75 72 6e 61 6c 20 28 61 6e 64 20 74  e journal (and t
9c40: 68 65 20 6a 6f 75 72 6e 61 6c 20 73 79 6e 63 65  he journal synce
9c50: 64 2c 20 0a 20 20 2a 2a 20 69 66 20 69 6e 20 66  d, .  ** if in f
9c60: 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 29 2c 20  ull-sync mode), 
9c70: 74 68 65 20 7a 65 72 6f 20 69 73 20 6f 76 65 72  the zero is over
9c80: 77 72 69 74 74 65 6e 20 77 69 74 68 20 74 68 65  written with the
9c90: 20 74 72 75 65 20 6e 75 6d 62 65 72 0a 20 20 2a   true number.  *
9ca0: 2a 20 6f 66 20 72 65 63 6f 72 64 73 20 28 73 65  * of records (se
9cb0: 65 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 29  e syncJournal())
9cc0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 20 66 61  ..  **.  ** A fa
9cd0: 73 74 65 72 20 61 6c 74 65 72 6e 61 74 69 76 65  ster alternative
9ce0: 20 69 73 20 74 6f 20 77 72 69 74 65 20 30 78 46   is to write 0xF
9cf0: 46 46 46 46 46 46 46 20 74 6f 20 74 68 65 20 6e  FFFFFFF to the n
9d00: 52 65 63 20 66 69 65 6c 64 2e 20 57 68 65 6e 0a  Rec field. When.
9d10: 20 20 2a 2a 20 72 65 61 64 69 6e 67 20 74 68 65    ** reading the
9d20: 20 6a 6f 75 72 6e 61 6c 20 74 68 69 73 20 76 61   journal this va
9d30: 6c 75 65 20 74 65 6c 6c 73 20 53 51 4c 69 74 65  lue tells SQLite
9d40: 20 74 6f 20 61 73 73 75 6d 65 20 74 68 61 74 20   to assume that 
9d50: 74 68 65 0a 20 20 2a 2a 20 72 65 73 74 20 6f 66  the.  ** rest of
9d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9d70: 65 20 63 6f 6e 74 61 69 6e 73 20 76 61 6c 69 64  e contains valid
9d80: 20 70 61 67 65 20 72 65 63 6f 72 64 73 2e 20 54   page records. T
9d90: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 0a 20  his assumption. 
9da0: 20 2a 2a 20 69 73 20 64 61 6e 67 65 72 6f 75 73   ** is dangerous
9db0: 2c 20 61 73 20 69 66 20 61 20 66 61 69 6c 75 72  , as if a failur
9dc0: 65 20 6f 63 63 75 72 65 64 20 77 68 69 6c 73 74  e occured whilst
9dd0: 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20   writing to the 
9de0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
9df0: 65 20 69 74 20 6d 61 79 20 63 6f 6e 74 61 69 6e  e it may contain
9e00: 20 73 6f 6d 65 20 67 61 72 62 61 67 65 20 64 61   some garbage da
9e10: 74 61 2e 20 54 68 65 72 65 20 61 72 65 20 74 77  ta. There are tw
9e20: 6f 20 73 63 65 6e 61 72 69 6f 73 0a 20 20 2a 2a  o scenarios.  **
9e30: 20 77 68 65 72 65 20 74 68 69 73 20 72 69 73 6b   where this risk
9e40: 20 63 61 6e 20 62 65 20 69 67 6e 6f 72 65 64 3a   can be ignored:
9e50: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57  .  **.  **   * W
9e60: 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 69 73  hen the pager is
9e70: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
9e80: 2e 20 43 6f 72 72 75 70 74 69 6f 6e 20 63 61 6e  . Corruption can
9e90: 20 66 6f 6c 6c 6f 77 20 61 0a 20 20 2a 2a 20 20   follow a.  **  
9ea0: 20 20 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65     power failure
9eb0: 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 61 6e   in this case an
9ec0: 79 77 61 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  yway..  **.  ** 
9ed0: 20 20 2a 20 57 68 65 6e 20 74 68 65 20 53 51 4c    * When the SQL
9ee0: 49 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41  ITE_IOCAP_SAFE_A
9ef0: 50 50 45 4e 44 20 66 6c 61 67 20 69 73 20 73 65  PPEND flag is se
9f00: 74 2e 20 54 68 69 73 20 67 75 61 72 61 6e 74 65  t. This guarante
9f10: 65 73 0a 20 20 2a 2a 20 20 20 20 20 74 68 61 74  es.  **     that
9f20: 20 67 61 72 62 61 67 65 20 64 61 74 61 20 69 73   garbage data is
9f30: 20 6e 65 76 65 72 20 61 70 70 65 6e 64 65 64 20   never appended 
9f40: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
9f50: 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  ile..  */.  asse
9f60: 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
9f70: 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
9f80: 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20 69 66 28 20  >noSync);.  if( 
9f90: 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  (pPager->noSync)
9fa0: 20 0a 20 20 20 7c 7c 20 28 73 71 6c 69 74 65 33   .   || (sqlite3
9fb0: 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
9fc0: 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
9fd0: 66 64 29 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  fd)&SQLITE_IOCAP
9fe0: 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 0a 20  _SAFE_APPEND) . 
9ff0: 20 29 7b 0a 20 20 20 20 70 75 74 33 32 62 69 74   ){.    put32bit
a000: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
a010: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
a020: 5d 2c 20 30 78 66 66 66 66 66 66 66 66 29 3b 0a  ], 0xffffffff);.
a030: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 75 74    }else{.    put
a040: 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b  32bits(&zHeader[
a050: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
a060: 61 67 69 63 29 5d 2c 20 30 29 3b 0a 20 20 7d 0a  agic)], 0);.  }.
a070: 0a 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d  .  /* The random
a080: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
a090: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 73 71  ialiser */ .  sq
a0a0: 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73  lite3_randomness
a0b0: 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  (sizeof(pPager->
a0c0: 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50 61  cksumInit), &pPa
a0d0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
a0e0: 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a 48  .  put32bits(&zH
a0f0: 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f  eader[sizeof(aJo
a100: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34 5d 2c 20  urnalMagic)+4], 
a110: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
a120: 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20 69 6e 69  t);.  /* The ini
a130: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 73 69  tial database si
a140: 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32 62 69 74  ze */.  put32bit
a150: 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f  s(&zHeader[sizeo
a160: 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
a170: 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e 64 62 53  +8], pPager->dbS
a180: 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68 65 20 61  ize);.  /* The a
a190: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69  ssumed sector si
a1a0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ze for this proc
a1b0: 65 73 73 20 2a 2f 0a 20 20 70 75 74 33 32 62 69  ess */.  put32bi
a1c0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
a1d0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
a1e0: 29 2b 31 32 5d 2c 20 70 50 61 67 65 72 2d 3e 73  )+12], pPager->s
a1f0: 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69 66  ectorSize);.  if
a200: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
a210: 6c 48 64 72 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  lHdr==0 ){.    /
a220: 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20  * The page size 
a230: 2a 2f 0a 20 20 20 20 70 75 74 33 32 62 69 74 73  */.    put32bits
a240: 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66  (&zHeader[sizeof
a250: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a260: 31 36 5d 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  16], pPager->pag
a270: 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 66  eSize);.  }..  f
a280: 6f 72 28 6e 57 72 69 74 65 3d 30 3b 20 72 63 3d  or(nWrite=0; rc=
a290: 3d 53 51 4c 49 54 45 5f 4f 4b 26 26 6e 57 72 69  =SQLITE_OK&&nWri
a2a0: 74 65 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  te<JOURNAL_HDR_S
a2b0: 5a 28 70 50 61 67 65 72 29 3b 20 6e 57 72 69 74  Z(pPager); nWrit
a2c0: 65 2b 3d 6e 48 65 61 64 65 72 29 7b 0a 20 20 20  e+=nHeader){.   
a2d0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
a2e0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
a2f0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
a300: 6f 75 72 6e 61 6c 48 64 72 2c 20 6e 48 65 61 64  ournalHdr, nHead
a310: 65 72 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71  er)).    rc = sq
a320: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
a330: 67 65 72 2d 3e 6a 66 64 2c 20 7a 48 65 61 64 65  ger->jfd, zHeade
a340: 72 2c 20 6e 48 65 61 64 65 72 2c 20 70 50 61 67  r, nHeader, pPag
a350: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
a360: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
a370: 72 6e 61 6c 4f 66 66 20 2b 3d 20 6e 48 65 61 64  rnalOff += nHead
a380: 65 72 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  er;.  }..  retur
a390: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
a3a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a3b0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
a3c0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
a3d0: 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  . A journal head
a3e0: 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52  er file.** (JOUR
a3f0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a400: 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74  ) is read from t
a410: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
a420: 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ion in the journ
a430: 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20  al.** file. See 
a440: 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20 66  comments above f
a450: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75  unction writeJou
a460: 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61 20  rnalHdr() for a 
a470: 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a  description of.*
a480: 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * the journal he
a490: 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a  ader format..**.
a4a0: 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65 72  ** If the header
a4b0: 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73 73   is read success
a4c0: 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20  fully, *nRec is 
a4d0: 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  set to the numbe
a4e0: 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65 63  r of.** page rec
a4f0: 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74  ords following t
a500: 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20 2a  his header and *
a510: 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74 6f  dbSize is set to
a520: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
a530: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65 66  .** database bef
a540: 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63 74  ore the transact
a550: 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70 61  ion began, in pa
a560: 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65  ges. Also, pPage
a570: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20  r->cksumInit.** 
a580: 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76 61  is set to the va
a590: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
a5a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
a5b0: 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
a5c0: 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68  eturned.** in th
a5d0: 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  is case..**.** I
a5e0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
a5f0: 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61 72  ader file appear
a600: 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74 65  s to be corrupte
a610: 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69  d, SQLITE_DONE i
a620: 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61 6e  s.** returned an
a630: 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62 53  d *nRec and *dbS
a640: 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74 2e  ize are not set.
a650: 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52    If JOURNAL_HDR
a660: 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e  _SZ bytes.** can
a670: 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f 6d  not be read from
a680: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
a690: 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  e an error code 
a6a0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
a6b0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 4a  static int readJ
a6c0: 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61 67  ournalHdr(.  Pag
a6d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 69  er *pPager, .  i
a6e0: 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a  64 journalSize,.
a6f0: 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20    u32 *pNRec, . 
a700: 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b   u32 *pDbSize.){
a710: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73  .  int rc;.  uns
a720: 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67 69  igned char aMagi
a730: 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65  c[8]; /* A buffe
a740: 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61  r to hold the ma
a750: 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  gic header */.  
a760: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 69  i64 jrnlOff;.  i
a770: 6e 74 20 69 50 61 67 65 53 69 7a 65 3b 0a 0a 20  nt iPageSize;.. 
a780: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
a790: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
a7a0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a7b0: 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f+JOURNAL_HDR_SZ
a7c0: 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e  (pPager) > journ
a7d0: 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  alSize ){.    re
a7e0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a7f0: 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20  ;.  }.  jrnlOff 
a800: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
a810: 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73 71  lOff;..  rc = sq
a820: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61 67  lite3OsRead(pPag
a830: 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c  er->jfd, aMagic,
a840: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 2c   sizeof(aMagic),
a850: 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28   jrnlOff);.  if(
a860: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a870: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73 69  .  jrnlOff += si
a880: 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a 20  zeof(aMagic);.. 
a890: 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67   if( memcmp(aMag
a8a0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
a8b0: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
a8c0: 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ))!=0 ){.    ret
a8d0: 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b  urn SQLITE_DONE;
a8e0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
a8f0: 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  d32bits(pPager->
a900: 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70 4e  jfd, jrnlOff, pN
a910: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
a920: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
a930: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a940: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a950: 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d 3e  Off+4, &pPager->
a960: 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66  cksumInit);.  if
a970: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a980: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
a990: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
a9a0: 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44 62  , jrnlOff+8, pDb
a9b0: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
a9c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a9d0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a9e0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a9f0: 6c 4f 66 66 2b 31 36 2c 20 28 75 33 32 20 2a 29  lOff+16, (u32 *)
aa00: 26 69 50 61 67 65 53 69 7a 65 29 3b 0a 20 20 69  &iPageSize);.  i
aa10: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
aa20: 20 0a 20 20 20 26 26 20 69 50 61 67 65 53 69 7a   .   && iPageSiz
aa30: 65 3e 3d 35 31 32 20 0a 20 20 20 26 26 20 69 50  e>=512 .   && iP
aa40: 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f  ageSize<=SQLITE_
aa50: 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 0a 20  MAX_PAGE_SIZE . 
aa60: 20 20 26 26 20 28 28 69 50 61 67 65 53 69 7a 65    && ((iPageSize
aa70: 2d 31 29 26 69 50 61 67 65 53 69 7a 65 29 3d 3d  -1)&iPageSize)==
aa80: 30 20 0a 20 20 29 7b 0a 20 20 20 20 75 31 36 20  0 .  ){.    u16 
aa90: 70 61 67 65 73 69 7a 65 20 3d 20 69 50 61 67 65  pagesize = iPage
aaa0: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
aab0: 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50 61  qlite3PagerSetPa
aac0: 67 65 73 69 7a 65 28 70 50 61 67 65 72 2c 20 26  gesize(pPager, &
aad0: 70 61 67 65 73 69 7a 65 29 3b 0a 20 20 7d 0a 20  pagesize);.  }. 
aae0: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
aaf0: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
ab00: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
ab10: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
ab20: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
ab30: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
ab40: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
ab50: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
ab60: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
ab70: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
ab80: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
ab90: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
aba0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
abb0: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
abc0: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
abd0: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
abe0: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
abf0: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
ac00: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
ac10: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
ac20: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
ac30: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
ac40: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
ac50: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a  s(pPager->jfd, j
ac60: 72 6e 6c 4f 66 66 2b 31 32 2c 20 28 75 33 32 20  rnlOff+12, (u32 
ac70: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
ac80: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
ac90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
aca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
acb0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
acc0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
acd0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ace0: 4b 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69  K;.}.../*.** Wri
acf0: 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20  te the supplied 
ad00: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
ad10: 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ame into the jou
ad20: 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61  rnal file for pa
ad30: 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74  ger.** pPager at
ad40: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
ad50: 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65  ation. The maste
ad60: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d  r journal name m
ad70: 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a  ust be the last.
ad80: 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e  ** thing written
ad90: 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   to a journal fi
ada0: 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72  le. If the pager
adb0: 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   is in full-sync
adc0: 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f   mode, the.** jo
add0: 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72  urnal file descr
ade0: 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65  iptor is advance
adf0: 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  d to the next se
ae00: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65  ctor boundary be
ae10: 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67  fore.** anything
ae20: 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65   is written. The
ae30: 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a   format is:.**.*
ae40: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47  * + 4 bytes: PAG
ae50: 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b  ER_MJ_PGNO..** +
ae60: 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68   N bytes: length
ae70: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
ae80: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20  al name..** + 4 
ae90: 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20  bytes: N.** + 4 
aea0: 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f  bytes: Master jo
aeb0: 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b  urnal name check
aec0: 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65  sum..** + 8 byte
aed0: 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  s: aJournalMagic
aee0: 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  []..**.** The ma
aef0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67  ster journal pag
af00: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68  e checksum is th
af10: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74  e sum of the byt
af20: 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72  es in the master
af30: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  .** journal name
af40: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74  ..**.** If zMast
af50: 65 72 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69  er is a NULL poi
af60: 6e 74 65 72 20 28 6f 63 63 75 72 73 20 66 6f 72  nter (occurs for
af70: 20 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61   a single databa
af80: 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c  se transaction),
af90: 20 0a 2a 2a 20 74 68 69 73 20 63 61 6c 6c 20 69   .** this call i
afa0: 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74  s a no-op..*/.st
afb0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d 61  atic int writeMa
afc0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sterJournal(Page
afd0: 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
afe0: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
aff0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
b000: 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20   len; .  int i; 
b010: 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a  .  i64 jrnlOff;.
b020: 20 20 69 36 34 20 6a 72 6e 6c 53 69 7a 65 3b 0a    i64 jrnlSize;.
b030: 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b    u32 cksum = 0;
b040: 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 73 69 7a  .  char zBuf[siz
b050: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
b060: 63 29 2b 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20  c)+2*4];..  if( 
b070: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
b080: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
b090: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
b0a0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
b0b0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
b0c0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
b0d0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
b0e0: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
b0f0: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
b100: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
b110: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
b120: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
b130: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
b140: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
b150: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
b160: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
b170: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
b180: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
b190: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
b1a0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
b1b0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
b1c0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
b1d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
b1e0: 53 79 6e 63 20 29 7b 0a 20 20 20 20 73 65 65 6b  Sync ){.    seek
b1f0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
b200: 72 29 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66  r);.  }.  jrnlOf
b210: 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f = pPager->jour
b220: 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
b230: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
b240: 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20  (len+20);..  rc 
b250: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
b260: 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f  ager->jfd, jrnlO
b270: 66 66 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ff, PAGER_MJ_PGN
b280: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
b290: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b2a0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a  ) return rc;.  j
b2b0: 72 6e 6c 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20  rnlOff += 4;..  
b2c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
b2d0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
b2e0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a   zMaster, len, j
b2f0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66 28 20 72  rnlOff);.  if( r
b300: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
b310: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
b320: 4f 66 66 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70  Off += len;..  p
b330: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
b340: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
b350: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
b360: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
b370: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
b380: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
b390: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
b3a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
b3b0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b3c0: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
b3d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a  JournalMagic), j
b3e0: 72 6e 6c 4f 66 66 29 3b 0a 20 20 6a 72 6e 6c 4f  rnlOff);.  jrnlO
b3f0: 66 66 20 2b 3d 20 38 2b 73 69 7a 65 6f 66 28 61  ff += 8+sizeof(a
b400: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20  JournalMagic);. 
b410: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
b420: 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
b430: 79 6e 63 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  ync;..  /* If th
b440: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 70 65  e pager is in pe
b450: 72 69 73 74 65 6e 74 2d 6a 6f 75 72 6e 61 6c 20  ristent-journal 
b460: 6d 6f 64 65 2c 20 74 68 65 6e 20 74 68 65 20 70  mode, then the p
b470: 68 79 73 69 63 61 6c 20 0a 20 20 2a 2a 20 6a 6f  hysical .  ** jo
b480: 75 72 6e 61 6c 2d 66 69 6c 65 20 6d 61 79 20 65  urnal-file may e
b490: 78 74 65 6e 64 20 70 61 73 74 20 74 68 65 20 65  xtend past the e
b4a0: 6e 64 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  nd of the master
b4b0: 2d 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 0a 20 20  -journal name.  
b4c0: 2a 2a 20 61 6e 64 20 38 20 62 79 74 65 73 20 6f  ** and 8 bytes o
b4d0: 66 20 6d 61 67 69 63 20 64 61 74 61 20 6a 75 73  f magic data jus
b4e0: 74 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  t written to the
b4f0: 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 0a   file. This is .
b500: 20 20 2a 2a 20 64 61 6e 67 65 72 6f 75 73 20 62    ** dangerous b
b510: 65 63 61 75 73 65 20 74 68 65 20 63 6f 64 65 20  ecause the code 
b520: 74 6f 20 72 6f 6c 6c 62 61 63 6b 20 61 20 68 6f  to rollback a ho
b530: 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 20  t-journal file. 
b540: 20 2a 2a 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20   ** will not be 
b550: 61 62 6c 65 20 74 6f 20 66 69 6e 64 20 74 68 65  able to find the
b560: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b570: 6e 61 6d 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  name to determin
b580: 65 20 0a 20 20 2a 2a 20 77 68 65 74 68 65 72 20  e .  ** whether 
b590: 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f 75 72 6e  or not the journ
b5a0: 61 6c 20 69 73 20 68 6f 74 2e 20 0a 20 20 2a 2a  al is hot. .  **
b5b0: 0a 20 20 2a 2a 20 45 61 73 69 65 73 74 20 74 68  .  ** Easiest th
b5c0: 69 6e 67 20 74 6f 20 64 6f 20 69 6e 20 74 68 69  ing to do in thi
b5d0: 73 20 73 63 65 6e 61 72 69 6f 20 69 73 20 74 6f  s scenario is to
b5e0: 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 6a 6f   truncate the jo
b5f0: 75 72 6e 61 6c 20 0a 20 20 2a 2a 20 66 69 6c 65  urnal .  ** file
b600: 20 74 6f 20 74 68 65 20 72 65 71 75 69 72 65 64   to the required
b610: 20 73 69 7a 65 2e 0a 20 20 2a 2f 20 0a 20 20 69   size..  */ .  i
b620: 66 28 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  f( (rc==SQLITE_O
b630: 4b 29 0a 20 20 20 26 26 20 28 72 63 20 3d 20 73  K).   && (rc = s
b640: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
b650: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a  (pPager->jfd, &j
b660: 72 6e 6c 53 69 7a 65 29 29 3d 3d 53 51 4c 49 54  rnlSize))==SQLIT
b670: 45 5f 4f 4b 0a 20 20 20 26 26 20 6a 72 6e 6c 53  E_OK.   && jrnlS
b680: 69 7a 65 3e 6a 72 6e 6c 4f 66 66 0a 20 20 29 7b  ize>jrnlOff.  ){
b690: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
b6a0: 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67  3OsTruncate(pPag
b6b0: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
b6c0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
b6d0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  rc;.}../*.** Add
b6e0: 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67   or remove a pag
b6f0: 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20  e from the list 
b700: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61  of all pages tha
b710: 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20  t are in the.** 
b720: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b730: 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67  l..**.** The Pag
b740: 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72  er keeps a separ
b750: 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ate list of page
b760: 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65  s that are curre
b770: 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73  ntly in.** the s
b780: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
b790: 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68  .  This helps th
b7a0: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  e sqlite3PagerSt
b7b0: 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  mtCommit().** ro
b7c0: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
b7d0: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
b7e0: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
b7f0: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
b800: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
b810: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
b820: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
b830: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
b840: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
b850: 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
b860: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
b870: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
b880: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
b890: 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
b8a0: 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
b8b0: 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
b8c0: 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42  .  assert( MEMDB
b8d0: 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74   );.  if( !pHist
b8e0: 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  ->inStmt ){.    
b8f0: 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
b900: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
b910: 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d  Hist->pNextStmt=
b920: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
b930: 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  ager->pStmt ){. 
b940: 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49       PGHDR_TO_HI
b950: 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  ST(pPager->pStmt
b960: 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76  , pPager)->pPrev
b970: 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20  Stmt = pPg;.    
b980: 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65  }.    pHist->pNe
b990: 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d  xtStmt = pPager-
b9a0: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67  >pStmt;.    pPag
b9b0: 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b  er->pStmt = pPg;
b9c0: 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74  .    pHist->inSt
b9d0: 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f  mt = 1;.  }.}../
b9e0: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
b9f0: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
ba00: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
ba10: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
ba20: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
ba30: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
ba40: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
ba50: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
ba60: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
ba70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
ba80: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
ba90: 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67  r *p;.  if( pPag
baa0: 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72  er->aHash==0 ) r
bab0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70  eturn 0;.  p = p
bac0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e  Pager->aHash[pgn
bad0: 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
bae0: 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28  sh-1)];.  while(
baf0: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
bb00: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
bb10: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
bb20: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
bb30: 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65 20  /*.** Clear the 
bb40: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
bb50: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
bb60: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
bb70: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
bb80: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
bb90: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
bba0: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
bbb0: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
bbc0: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
bbd0: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
bbe0: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
bbf0: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
bc00: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
bc10: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
bc20: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
bc30: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
bc40: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
bc50: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
bc60: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
bc70: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
bc80: 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61 67 65  ) return;.  page
bc90: 72 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65  rMutexHeld(pPage
bca0: 72 29 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50  r);.  for(pPg=pP
bcb0: 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b  ager->pAll; pPg;
bcc0: 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20   pPg=pNext){.   
bcd0: 20 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45   IOTRACE(("PGFRE
bce0: 45 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67  E %p %d\n", pPag
bcf0: 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b  er, pPg->pgno));
bd00: 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28  .    PAGER_INCR(
bd10: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
bd20: 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
bd30: 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e   pNext = pPg->pN
bd40: 65 78 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c  extAll;.    lruL
bd50: 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a  istRemove(pPg);.
bd60: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bd70: 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20  (pPg->pData);.  
bd80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
bd90: 50 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  Pg);.  }.  asser
bda0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
bdb0: 69 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65  irst==0);.  asse
bdc0: 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  rt(pPager->lru.p
bdd0: 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b  FirstSynced==0);
bde0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
bdf0: 2d 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b  ->lru.pLast==0);
be00: 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  .  pPager->pStmt
be10: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
be20: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67  pAll = 0;.  pPag
be30: 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  er->pDirty = 0;.
be40: 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20    pPager->nHash 
be50: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
be60: 72 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73  ree(pPager->aHas
be70: 68 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50  h);.  pPager->nP
be80: 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  age = 0;.  pPage
be90: 72 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20  r->aHash = 0;.  
bea0: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
beb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63  ;.}../*.** Unloc
bec0: 6b 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  k the database f
bed0: 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ile. .**.** If t
bee0: 68 65 20 70 61 67 65 72 20 69 73 20 63 75 72 72  he pager is curr
bef0: 65 6e 74 6c 79 20 69 6e 20 65 72 72 6f 72 20 73  ently in error s
bf00: 74 61 74 65 2c 20 64 69 73 63 61 72 64 20 74 68  tate, discard th
bf10: 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a  e contents of .*
bf20: 2a 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20  * the cache and 
bf30: 72 65 73 65 74 20 74 68 65 20 50 61 67 65 72 20  reset the Pager 
bf40: 73 74 72 75 63 74 75 72 65 20 69 6e 74 65 72 6e  structure intern
bf50: 61 6c 20 73 74 61 74 65 2e 20 49 66 20 74 68 65  al state. If the
bf60: 72 65 20 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e  re is.** an open
bf70: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74   journal-file, t
bf80: 68 65 6e 20 74 68 65 20 6e 65 78 74 20 74 69 6d  hen the next tim
bf90: 65 20 61 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20  e a shared-lock 
bfa0: 69 73 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f  is obtained.** o
bfb0: 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
bfc0: 20 28 62 79 20 74 68 69 73 20 6f 72 20 61 6e 79   (by this or any
bfd0: 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 29 2c   other process),
bfe0: 20 69 74 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74   it will be.** t
bff0: 72 65 61 74 65 64 20 61 73 20 61 20 68 6f 74 2d  reated as a hot-
c000: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c  journal and roll
c010: 65 64 20 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ed back..*/.stat
c020: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75 6e  ic void pager_un
c030: 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  lock(Pager *pPag
c040: 65 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67  er){.  if( !pPag
c050: 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
c060: 65 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  e ){.    if( !ME
c070: 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  MDB ){.      int
c080: 20 72 63 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70   rc = osUnlock(p
c090: 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
c0a0: 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  CK);.      if( r
c0b0: 63 20 29 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c ) pPager->errC
c0c0: 6f 64 65 20 3d 20 72 63 3b 0a 20 20 20 20 20 20  ode = rc;.      
c0d0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
c0e0: 20 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41   -1;.      IOTRA
c0f0: 43 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e  CE(("UNLOCK %p\n
c100: 22 2c 20 70 50 61 67 65 72 29 29 0a 0a 20 20 20  ", pPager))..   
c110: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f     /* Always clo
c120: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
c130: 69 6c 65 20 77 68 65 6e 20 64 72 6f 70 70 69 6e  ile when droppin
c140: 67 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  g the database l
c150: 6f 63 6b 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74  ock..      ** Ot
c160: 68 65 72 77 69 73 65 2c 20 61 6e 6f 74 68 65 72  herwise, another
c170: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68   connection with
c180: 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65   journal_mode=de
c190: 6c 65 74 65 20 6d 69 67 68 74 0a 20 20 20 20 20  lete might.     
c1a0: 20 2a 2a 20 64 65 6c 65 74 65 20 74 68 65 20 66   ** delete the f
c1b0: 69 6c 65 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64  ile out from und
c1c0: 65 72 20 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a  er us..      */.
c1d0: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
c1e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
c1f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
c200: 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e  OsClose(pPager->
c210: 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20 70 50  jfd);.        pP
c220: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c230: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  n = 0;.        s
c240: 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
c250: 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  roy(pPager->pInJ
c260: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
c270: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
c280: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  nal = 0;.      }
c290: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 50 61  ..      /* If Pa
c2a0: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
c2b0: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
c2c0: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
c2d0: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
c2e0: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
c2f0: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
c300: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
c310: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
c320: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
c330: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
c340: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
c350: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
c360: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
c370: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
c380: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
c390: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
c3a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50  ==SQLITE_OK ) pP
c3b0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
c3c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
c3d0: 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
c3e0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
c3f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
c400: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  Open ){.        
c410: 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
c420: 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
c430: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
c440: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
c450: 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
c460: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
c470: 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a  r->pInStmt = 0;.
c480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c490: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
c4a0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  en = 0;.        
c4b0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
c4c0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  e = 0;.        p
c4d0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c4e0: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  f = 0;.        p
c4f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
c500: 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
c510: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
c520: 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20  utoopen = 0;.   
c530: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69       pPager->ori
c540: 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20  gDbSize = 0;.   
c550: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
c560: 69 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50  if( !MEMDB || pP
c570: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
c580: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
c590: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
c5a0: 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
c5b0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68        pPager->ch
c5c0: 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20  angeCountDone = 
c5d0: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
c5e0: 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20  /*.** Execute a 
c5f0: 72 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72  rollback if a tr
c600: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74  ansaction is act
c610: 69 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74  ive and unlock t
c620: 68 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  he .** database 
c630: 66 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67  file. If the pag
c640: 65 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65  er has already e
c650: 6e 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72  ntered the error
c660: 20 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e   state, .** do n
c670: 6f 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72  ot attempt the r
c680: 6f 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  ollback..*/.stat
c690: 69 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c  ic void pagerUnl
c6a0: 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50  ockAndRollback(P
c6b0: 61 67 65 72 20 2a 70 29 7b 0a 20 20 2f 2a 20 61  ager *p){.  /* a
c6c0: 73 73 65 72 74 28 20 70 2d 3e 73 74 61 74 65 3e  ssert( p->state>
c6d0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
c6e0: 7c 7c 20 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  || p->journalOpe
c6f0: 6e 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 69 66 28  n==0 ); */.  if(
c700: 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c   p->errCode==SQL
c710: 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61  ITE_OK && p->sta
c720: 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
c730: 45 44 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ED ){.    sqlite
c740: 33 46 61 75 6c 74 42 65 67 69 6e 42 65 6e 69 67  3FaultBeginBenig
c750: 6e 28 2d 31 29 3b 0a 20 20 20 20 73 71 6c 69 74  n(-1);.    sqlit
c760: 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
c770: 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 46  p);.    sqlite3F
c780: 61 75 6c 74 45 6e 64 42 65 6e 69 67 6e 28 2d 31  aultEndBenign(-1
c790: 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 5f 75  );.  }.  pager_u
c7a0: 6e 6c 6f 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a  nlock(p);.#if 0.
c7b0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72    assert( p->err
c7c0: 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72  Code || !p->jour
c7d0: 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65  nalOpen || (p->e
c7e0: 78 63 6c 75 73 69 76 65 4d 6f 64 65 26 26 21 70  xclusiveMode&&!p
c7f0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b  ->journalOff) );
c800: 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 65 72  .  assert( p->er
c810: 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d  rCode || !p->stm
c820: 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c  tOpen || p->excl
c830: 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e  usiveMode );.#en
c840: 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  dif.}../*.** Thi
c850: 73 20 72 6f 75 74 69 6e 65 20 65 6e 64 73 20 61  s routine ends a
c860: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41   transaction.  A
c870: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
c880: 65 6e 64 65 64 20 62 79 20 65 69 74 68 65 72 0a  ended by either.
c890: 2a 2a 20 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61  ** a COMMIT or a
c8a0: 20 52 4f 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a   ROLLBACK..**.**
c8b0: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
c8c0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
c8d0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
c8e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
c8f0: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
c900: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
c910: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
c920: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
c930: 74 69 6e 65 20 77 69 6c 6c 20 72 65 6c 65 61 73  tine will releas
c940: 65 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  e.** the databas
c950: 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69  e lock and acqui
c960: 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  res a SHARED loc
c970: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 20 69  k in its place i
c980: 66 20 74 68 61 74 20 69 73 0a 2a 2a 20 74 68 65  f that is.** the
c990: 20 61 70 70 72 6f 70 72 69 61 74 65 20 74 68 69   appropriate thi
c9a0: 6e 67 20 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61  ng to do.  Relea
c9b0: 73 65 20 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79  se locks usually
c9c0: 20 69 73 20 61 70 70 72 6f 70 72 69 61 74 65 2c   is appropriate,
c9d0: 0a 2a 2a 20 75 6e 6c 65 73 73 20 77 65 20 61 72  .** unless we ar
c9e0: 65 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61  e in exclusive a
c9f0: 63 63 65 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e  ccess mode or un
ca00: 6c 65 73 73 20 74 68 69 73 20 69 73 20 61 20 0a  less this is a .
ca10: 2a 2a 20 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45  ** COMMIT AND BE
ca20: 47 49 4e 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20  GIN or ROLLBACK 
ca30: 41 4e 44 20 42 45 47 49 4e 20 6f 70 65 72 61 74  AND BEGIN operat
ca40: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ion..**.** The j
ca50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 65  ournal file is e
ca60: 69 74 68 65 72 20 64 65 6c 65 74 65 64 20 6f 72  ither deleted or
ca70: 20 74 72 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a   truncated..**.*
ca80: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
ca90: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
caa0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
cab0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
cac0: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
cad0: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
cae0: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
caf0: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
cb00: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
cb10: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
cb20: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
cb30: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
cb40: 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
cb50: 61 63 74 69 6f 6e 28 50 61 67 65 72 20 2a 70 50  action(Pager *pP
cb60: 61 67 65 72 2c 20 69 6e 74 20 68 61 73 4d 61 73  ager, int hasMas
cb70: 74 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ter){.  PgHdr *p
cb80: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
cb90: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20  QLITE_OK;.  int 
cba0: 72 63 32 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b  rc2 = SQLITE_OK;
cbb0: 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
cbc0: 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  B );.  if( pPage
cbd0: 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
cbe0: 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
cbf0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
cc00: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
cc10: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50  gerStmtCommit(pP
cc20: 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61  ager);.  if( pPa
cc30: 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26  ger->stmtOpen &&
cc40: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
cc50: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73  iveMode ){.    s
cc60: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
cc70: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
cc80: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
cc90: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
cca0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ccb0: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  Open ){.    if( 
ccc0: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
ccd0: 65 4d 6f 64 65 20 0a 20 20 20 20 20 7c 7c 20 70  eMode .     || p
cce0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
ccf0: 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
cd00: 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 0a 20 20  LMODE_PERSIST.  
cd10: 20 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20    ){.      rc = 
cd20: 7a 65 72 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70  zeroJournalHdr(p
cd30: 50 61 67 65 72 2c 20 68 61 73 4d 61 73 74 65 72  Pager, hasMaster
cd40: 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65  );.      pager_e
cd50: 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
cd60: 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
cd70: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
cd80: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cd90: 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
cda0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
cdb0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
cdc0: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
cdd0: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
cde0: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
cdf0: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
ce00: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
ce10: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
ce20: 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 70  Delete(pPager->p
ce30: 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
ce40: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20  urnal, 0);.     
ce50: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
ce60: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
ce70: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
ce80: 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67 65  rnal);.    pPage
ce90: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
cea0: 30 3b 0a 20 20 20 20 70 61 67 65 72 4d 75 74 65  0;.    pagerMute
ceb0: 78 48 65 6c 64 28 70 50 61 67 65 72 29 3b 0a 20  xHeld(pPager);. 
cec0: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
ced0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
cee0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
cef0: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
cf00: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
cf10: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
cf20: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
cf30: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 20  dSync = 0;.     
cf40: 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c   pPg->alwaysRoll
cf50: 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65 66  back = 0;.#ifdef
cf60: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
cf70: 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  GES.      pPg->p
cf80: 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f  ageHash = pager_
cf90: 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23  pagehash(pPg);.#
cfa0: 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20 20  endif.    }.    
cfb0: 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
cfc0: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
cfd0: 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
cfe0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
cff0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
d000: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d010: 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
d020: 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21   );.  }..  if( !
d030: 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
d040: 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 32  eMode ){.    rc2
d050: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
d060: 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c  er->fd, SHARED_L
d070: 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65 72  OCK);.    pPager
d080: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d090: 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65 20  SHARED;.  }else 
d0a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
d0b0: 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
d0c0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
d0d0: 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
d0e0: 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70 50  LUSIVE;.  }.  pP
d0f0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
d100: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d110: 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
d120: 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
d130: 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73 74  c = 0;.  lruList
d140: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 70  SetFirstSynced(p
d150: 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
d160: 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
d170: 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66   pPager->dbModif
d180: 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74 75  ied = 0;..  retu
d190: 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  rn (rc==SQLITE_O
d1a0: 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f 2a  K?rc2:rc);.}../*
d1b0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20  .** Compute and 
d1c0: 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75  return a checksu
d1d0: 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f  m for the page o
d1e0: 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68  f data..**.** Th
d1f0: 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c  is is not a real
d200: 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69   checksum.  It i
d210: 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68  s really just th
d220: 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a  e sum of the .**
d230: 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20   random initial 
d240: 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61  value and the pa
d250: 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65  ge number.  We e
d260: 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68  xperimented with
d270: 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f  .** a checksum o
d280: 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61 74  f the entire dat
d290: 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73 20  a, but that was 
d2a0: 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20  found to be too 
d2b0: 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  slow..**.** Note
d2c0: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e   that the page n
d2d0: 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64 20  umber is stored 
d2e0: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
d2f0: 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20   of data and.** 
d300: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20  the checksum is 
d310: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
d320: 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f  d.  This is impo
d330: 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e  rtant.  If journ
d340: 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e  al.** corruption
d350: 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20 61   occurs due to a
d360: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20   power failure, 
d370: 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20  the most likely 
d380: 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74  scenario.** is t
d390: 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74  hat one end or t
d3a0: 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20  he other of the 
d3b0: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63  record will be c
d3c0: 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a  hanged.  It is.*
d3d0: 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65  * much less like
d3e0: 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f 20  ly that the two 
d3f0: 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72  ends of the jour
d400: 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20  nal record will 
d410: 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e  be.** correct an
d420: 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20  d the middle be 
d430: 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20  corrupt.  Thus, 
d440: 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20  this "checksum" 
d450: 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67  scheme,.** thoug
d460: 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c  h fast and simpl
d470: 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20 6d  e, catches the m
d480: 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e  ostly likely kin
d490: 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e  d of corruption.
d4a0: 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20  .**.** FIX ME:  
d4b0: 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20  Consider adding 
d4c0: 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72 20  every 200th (or 
d4d0: 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65 20  so) byte of the 
d4e0: 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63  data to the.** c
d4f0: 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77  hecksum.  That w
d500: 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70  ay if a single p
d510: 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d  age spans 3 or m
d520: 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  ore disk sectors
d530: 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65   and.** only the
d540: 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69   middle sector i
d550: 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69  s corrupt, we wi
d560: 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20  ll still have a 
d570: 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68  reasonable.** ch
d580: 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20  ance of failing 
d590: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64  the checksum and
d5a0: 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67 20   thus detecting 
d5b0: 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a  the problem..*/.
d5c0: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
d5d0: 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50  _cksum(Pager *pP
d5e0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20 2a  ager, const u8 *
d5f0: 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b  aData){.  u32 ck
d600: 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
d610: 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69  sumInit;.  int i
d620: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
d630: 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65  ize-200;.  while
d640: 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73  ( i>0 ){.    cks
d650: 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a  um += aData[i];.
d660: 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20      i -= 200;.  
d670: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d  }.  return cksum
d680: 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64 20  ;.}../* Forward 
d690: 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a 73  declaration */.s
d6a0: 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
d6b0: 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a 2f  lean(PgHdr*);../
d6c0: 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67  *.** Read a sing
d6d0: 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65  le page from the
d6e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
d6f0: 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73  ened on file des
d700: 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20  criptor.** jfd. 
d710: 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f   Playback this o
d720: 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49  ne page..**.** I
d730: 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74  f useCksum==0 it
d740: 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72   means this jour
d750: 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  nal does not use
d760: 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65   checksums.  Che
d770: 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f  cksums.** are no
d780: 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d  t used in statem
d790: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63  ent journals bec
d7a0: 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a  ause statement j
d7b0: 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a  ournals do not.*
d7c0: 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76  * need to surviv
d7d0: 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  e power failures
d7e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d7f0: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f  pager_playback_o
d800: 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65 72  ne_page(.  Pager
d810: 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71 6c   *pPager, .  sql
d820: 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c 0a  ite3_file *jfd,.
d830: 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20 20    i64 offset,.  
d840: 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b 0a  int useCksum.){.
d850: 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64    int rc;.  PgHd
d860: 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20  r *pPg;         
d870: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
d880: 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e  existing page in
d890: 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20   the cache */.  
d8a0: 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20  Pgno pgno;      
d8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d8c0: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
d8d0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f   of a page in jo
d8e0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63  urnal */.  u32 c
d8f0: 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20  ksum;           
d900: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63           /* Chec
d910: 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61  ksum used for sa
d920: 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f  nity checking */
d930: 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20 28  .  u8 *aData = (
d940: 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54 6d  u8 *)pPager->pTm
d950: 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65 6d  pSpace;   /* Tem
d960: 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20  p storage for a 
d970: 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75 73  page */..  /* us
d980: 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62 65  eCksum should be
d990: 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d 61   true for the ma
d9a0: 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 66  in journal and f
d9b0: 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73 74  alse for.  ** st
d9c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
d9d0: 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74  .  Verify that t
d9e0: 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74 68  his is always th
d9f0: 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61 73  e case.  */.  as
da00: 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75 73  sert( jfd == (us
da10: 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72 2d  eCksum ? pPager-
da20: 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e 73  >jfd : pPager->s
da30: 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72 74  tfd) );.  assert
da40: 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72 63  ( aData );..  rc
da50: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
da60: 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e 6f  d, offset, &pgno
da70: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
da80: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
da90: 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  rc;.  rc = sqlit
daa0: 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61 44  e3OsRead(jfd, aD
dab0: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
dac0: 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34 29  eSize, offset+4)
dad0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
dae0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
daf0: 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  c;.  pPager->jou
db00: 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65  rnalOff += pPage
db10: 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34 3b  r->pageSize + 4;
db20: 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63 68  ..  /* Sanity ch
db30: 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70 61  ecking on the pa
db40: 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f 72  ge.  This is mor
db50: 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  e important that
db60: 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20   I originally.  
db70: 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66 20  ** thought.  If 
db80: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  a power failure 
db90: 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68 65  occurs while the
dba0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69 6e   journal is bein
dbb0: 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a 20  g written,.  ** 
dbc0: 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20 69  it could cause i
dbd0: 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20 62  nvalid data to b
dbe0: 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
dbf0: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65 20  he journal.  We 
dc00: 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65 74  need to.  ** det
dc10: 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69 64  ect this invalid
dc20: 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67 68   data (with high
dc30: 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61 6e   probability) an
dc40: 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20 2a  d ignore it..  *
dc50: 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30 20  /.  if( pgno==0 
dc60: 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f 4d  || pgno==PAGER_M
dc70: 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29  J_PGNO(pPager) )
dc80: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
dc90: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20  ITE_DONE;.  }.  
dca0: 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67 6e  if( pgno>(unsign
dcb0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
dcc0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
dcd0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
dce0: 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29 7b   if( useCksum ){
dcf0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33 32  .    rc = read32
dd00: 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65 74  bits(jfd, offset
dd10: 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  +pPager->pageSiz
dd20: 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20  e+4, &cksum);.  
dd30: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
dd40: 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
dd50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
dd60: 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72  4;.    if( pager
dd70: 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 61  _cksum(pPager, a
dd80: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
dd90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
dda0: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
ddb0: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
ddc0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
ddd0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
dde0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
ddf0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
de00: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
de10: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
de20: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
de30: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
de40: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
de50: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
de60: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
de70: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
de80: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
de90: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
dea0: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
deb0: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
dec0: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
ded0: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
dee0: 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70 74  *.  ** An except
def0: 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76 65  ion to the above
df00: 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64 61   rule: If the da
df10: 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d  tabase is in no-
df20: 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61  sync mode.  ** a
df30: 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f 76  nd a page is mov
df40: 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e 63  ed during an inc
df50: 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 20  remental vacuum 
df60: 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d 61  then the page ma
df70: 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e  y.  ** not be in
df80: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
df90: 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d 61  . Later: if a ma
dfa0: 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72 72  lloc() or IO err
dfb0: 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64  or occurs.  ** d
dfc0: 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67 65  uring a Movepage
dfd0: 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68  () call, then th
dfe0: 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20 62  e page may not b
dff0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a 20  e in the cache. 
e000: 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20 74   ** either. So t
e010: 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73  he condition des
e020: 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61 62  cribed in the ab
e030: 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69 73  ove paragraph is
e040: 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72 74   not.  ** assert
e050: 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a  ()able..  **.  *
e060: 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49 56  * If in EXCLUSIV
e070: 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77 65  E state, then we
e080: 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65   update the page
e090: 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65 78  r cache if it ex
e0a0: 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68  ists.  ** and th
e0b0: 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68 65  e main file. The
e0c0: 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d 61   page is then ma
e0d0: 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a  rked not dirty..
e0e0: 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74    **.  ** Ticket
e0f0: 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74 61   #1171:  The sta
e100: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d  tement journal m
e110: 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61 67  ight contain pag
e120: 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20 69  e content that i
e130: 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e 74  s.  ** different
e140: 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 63   from the page c
e150: 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73 74  ontent at the st
e160: 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e 73  art of the trans
e170: 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69  action..  ** Thi
e180: 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61 20  s occurs when a 
e190: 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64 20  page is changed 
e1a0: 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74 61  prior to the sta
e1b0: 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65 6e  rt of a statemen
e1c0: 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e  t.  ** then chan
e1d0: 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69 6e  ged again within
e1e0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e 20   the statement. 
e1f0: 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61   When rolling ba
e200: 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20 73  ck such a.  ** s
e210: 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73 74  tatement we must
e220: 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74 68   not write to th
e230: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
e240: 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e  ase unless we kn
e250: 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72 74  ow.  ** for cert
e260: 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e 61  ain that origina
e270: 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20  l page contents 
e280: 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f 20  are synced into 
e290: 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63  the main rollbac
e2a0: 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20  k.  ** journal. 
e2b0: 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70 6f   Otherwise, a po
e2c0: 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c  wer loss might l
e2d0: 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64 61  eave modified da
e2e0: 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ta in the.  ** d
e2f0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69 74  atabase file wit
e300: 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69 6e  hout an entry in
e310: 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
e320: 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a 20  urnal that can. 
e330: 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65 20   ** restore the 
e340: 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73 20  database to its 
e350: 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20  original form.  
e360: 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d  Two conditions m
e370: 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20  ust be.  ** met 
e380: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20 74  before writing t
e390: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
e3a0: 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64 61  iles. (1) the da
e3b0: 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a 20  tabase must be. 
e3c0: 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29   ** locked.  (2)
e3d0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
e3e0: 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  e original page 
e3f0: 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c 79  content is fully
e400: 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20   synced.  ** in 
e410: 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c  the main journal
e420: 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65 20   either because 
e430: 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
e440: 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65  in cache or else
e450: 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69  .  ** the page i
e460: 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65 64  s marked as need
e470: 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20 20  Sync==0..  **.  
e480: 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20 20  ** 2008-04-14:  
e490: 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67 20  When attempting 
e4a0: 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72 72  to vacuum a corr
e4b0: 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69 6c  upt database fil
e4c0: 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70 6f  e, it.  ** is po
e4d0: 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20 61  ssible to fail a
e4e0: 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61 20   statement on a 
e4f0: 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64 6f  database that do
e500: 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73 74  es not yet exist
e510: 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61 74  ..  ** Do not at
e520: 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20 69  tempt to write i
e530: 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  f database file 
e540: 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20 6f  has never been o
e550: 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70 50  pened..  */.  pP
e560: 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
e570: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
e580: 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 50    PAGERTRACE4("P
e590: 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20  LAYBACK %d page 
e5a0: 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22  %d hash(%08x)\n"
e5b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
e5c0: 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
e5d0: 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61  , pgno, pager_da
e5e0: 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70  tahash(pPager->p
e5f0: 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29  ageSize, aData))
e600: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e610: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
e620: 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d  LUSIVE && (pPg==
e630: 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79  0 || pPg->needSy
e640: 6e 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 26  nc==0).        &
e650: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
e660: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
e670: 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e 6f  4 offset = (pgno
e680: 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
e690: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 72  >pageSize;.    r
e6a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
e6b0: 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 61  te(pPager->fd, a
e6c0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
e6d0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b  geSize, offset);
e6e0: 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b 0a  .    if( pPg ){.
e6f0: 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28        makeClean(
e700: 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
e710: 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20    if( pPg ){.   
e720: 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75   /* No page shou
e730: 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c 69  ld ever be expli
e740: 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63  citly rolled bac
e750: 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73 65  k that is in use
e760: 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20  , except.    ** 
e770: 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63 68  for page 1 which
e780: 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20   is held in use 
e790: 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70  in order to keep
e7a0: 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
e7b0: 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
e7c0: 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72   active. However
e7d0: 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61 79   such a page may
e7e0: 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20   be rolled back 
e7f0: 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20  as a result.    
e800: 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61  ** of an interna
e810: 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e  l error resultin
e820: 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69  g in an automati
e830: 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a  c call to.    **
e840: 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c   sqlite3PagerRol
e850: 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a  lback()..    */.
e860: 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b      void *pData;
e870: 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20  .    /* assert( 
e880: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
e890: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20  pPg->pgno==1 ); 
e8a0: 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50  */.    pData = P
e8b0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
e8c0: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44  );.    memcpy(pD
e8d0: 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67  ata, aData, pPag
e8e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
e8f0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
e900: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
e910: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
e920: 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  ter(pPg, pPager-
e930: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
e940: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
e950: 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20  CHECK_PAGES.    
e960: 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
e970: 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
e980: 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
e990: 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20 70  /* If this was p
e9a0: 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73 74  age 1, then rest
e9b0: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ore the value of
e9c0: 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65 72   Pager.dbFileVer
e9d0: 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68 69  s..    ** Do thi
e9e0: 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65 63  s before any dec
e9f0: 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69 66  oding. */.    if
ea00: 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20  ( pgno==1 ){.   
ea10: 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
ea20: 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
ea30: 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34 5d  ((u8*)pData)[24]
ea40: 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e  ,sizeof(pPager->
ea50: 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
ea60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63 6f    }..    /* Deco
ea70: 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73 74  de the page just
ea80: 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 20   read from disk 
ea90: 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70 50  */.    CODEC1(pP
eaa0: 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
eab0: 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d 0a  ->pgno, 3);.  }.
eac0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
ead0: 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20  /*.** Parameter 
eae0: 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20 6e  zMaster is the n
eaf0: 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72 20  ame of a master 
eb00: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41 20  journal file. A 
eb10: 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a  single journal.*
eb20: 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66 65  * file that refe
eb30: 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73 74  rred to the mast
eb40: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
eb50: 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72 6f  has just been ro
eb60: 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54 68  lled back..** Th
eb70: 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b  is routine check
eb80: 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73 69  s if it is possi
eb90: 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74 68  ble to delete th
eba0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
ebb0: 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64 6f   file,.** and do
ebc0: 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e 0a  es so if it is..
ebd0: 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20 7a  **.** Argument z
ebe0: 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e 74  Master may point
ebf0: 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53 70   to Pager.pTmpSp
ec00: 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75 66  ace. So that buf
ec10: 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20 61  fer is not .** a
ec20: 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73 65  vailable for use
ec30: 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75 6e   within this fun
ec40: 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20  ction..**.**.** 
ec50: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
ec60: 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73  al file contains
ec70: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
ec80: 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73  l child journals
ec90: 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20  ..** To tell if 
eca0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
ecb0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c   can be deleted,
ecc0: 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f   check to each o
ecd0: 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65  f the.** childre
ece0: 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64  n.  If all child
ecf0: 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d  ren are either m
ed00: 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74  issing or do not
ed10: 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64   refer to.** a d
ed20: 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20  ifferent master 
ed30: 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68  journal, then th
ed40: 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  is master journa
ed50: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
ed60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ed70: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
ed80: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
ed90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
eda0: 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
edb0: 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
edc0: 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20 72  r->pVfs;.  int r
edd0: 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f  c;.  int master_
ede0: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c 69  open = 0;.  sqli
edf0: 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74 65  te3_file *pMaste
ee00: 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  r;.  sqlite3_fil
ee10: 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20 63  e *pJournal;.  c
ee20: 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75 72  har *zMasterJour
ee30: 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74  nal = 0; /* Cont
ee40: 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20 6a  ents of master j
ee50: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
ee60: 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75 72   i64 nMasterJour
ee70: 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53 69  nal;       /* Si
ee80: 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  ze of master jou
ee90: 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20 20  rnal file */..  
eea0: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73 74  /* Open the mast
eeb0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
eec0: 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20 63  exclusively in c
eed0: 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  ase some other p
eee0: 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20 72  rocess.  ** is r
eef0: 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75 74  unning this rout
ef00: 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74 68  ine also. Not th
ef10: 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f 20  at it makes too 
ef20: 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65 2e  much difference.
ef30: 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72 20  .  */.  pMaster 
ef40: 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  = (sqlite3_file 
ef50: 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
ef60: 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 20  (pVfs->szOsFile 
ef70: 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61 6c  * 2);.  pJournal
ef80: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
ef90: 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73 74   *)(((u8 *)pMast
efa0: 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f 73  er) + pVfs->szOs
efb0: 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70 4d  File);.  if( !pM
efc0: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63 20  aster ){.    rc 
efd0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
efe0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74    }else{.    int
eff0: 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54 45   flags = (SQLITE
f000: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53  _OPEN_READONLY|S
f010: 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54 45  QLITE_OPEN_MASTE
f020: 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20  R_JOURNAL);.    
f030: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
f040: 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65 72  en(pVfs, zMaster
f050: 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67 73  , pMaster, flags
f060: 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  , 0);.  }.  if( 
f070: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
f080: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f090: 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65  ut;.  master_ope
f0a0: 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20 73  n = 1;..  rc = s
f0b0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
f0c0: 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  (pMaster, &nMast
f0d0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
f0e0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f0f0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
f100: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
f110: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
f120: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
f130: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
f140: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 20  MasterPtr = 0;. 
f150: 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50 74     int nMasterPt
f160: 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  r = pPager->pVfs
f170: 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b 0a  ->mxPathname+1;.
f180: 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65  .    /* Load the
f190: 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a   entire master j
f1a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f  ournal file into
f1b0: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
f1c0: 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69  from.    ** sqli
f1d0: 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e 64  te3_malloc() and
f1e0: 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a   pointed to by z
f1f0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a  MasterJournal. .
f200: 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74      */.    zMast
f210: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61  erJournal = (cha
f220: 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  r *)sqlite3_mall
f230: 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  oc(nMasterJourna
f240: 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29 3b  l + nMasterPtr);
f250: 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65  .    if( !zMaste
f260: 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  rJournal ){.    
f270: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
f280: 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  MEM;.      goto 
f290: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
f2a0: 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65 72     }.    zMaster
f2b0: 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a 6f  Ptr = &zMasterJo
f2c0: 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f 75  urnal[nMasterJou
f2d0: 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d 20  rnal];.    rc = 
f2e0: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4d  sqlite3OsRead(pM
f2f0: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
f300: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
f310: 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 69  urnal, 0);.    i
f320: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f330: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
f340: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
f350: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
f360: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
f370: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
f380: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
f390: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
f3a0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
f3b0: 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a  OsAccess(pVfs, z
f3c0: 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f  Journal, SQLITE_
f3d0: 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b 0a  ACCESS_EXISTS);.
f3e0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
f3f0: 26 26 20 72 63 21 3d 31 20 29 7b 0a 20 20 20 20  && rc!=1 ){.    
f400: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
f410: 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
f420: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
f430: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ter_out;.      }
f440: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 31  .      if( rc==1
f450: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f   ){.        /* O
f460: 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ne of the journa
f470: 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ls pointed to by
f480: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
f490: 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20 20  nal exists..    
f4a0: 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61      ** Open it a
f4b0: 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20 70  nd check if it p
f4c0: 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61 73  oints at the mas
f4d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a  ter journal. If.
f4e0: 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72          ** so, r
f4f0: 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64 65  eturn without de
f500: 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74 65  leting the maste
f510: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  r journal file..
f520: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
f530: 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20 20     int c;.      
f540: 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53    int flags = (S
f550: 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
f560: 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  NLY|SQLITE_OPEN_
f570: 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20  MAIN_JOURNAL);. 
f580: 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
f590: 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
f5a0: 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72 6e  zJournal, pJourn
f5b0: 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 20  al, flags, 0);. 
f5c0: 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
f5d0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
f5e0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f5f0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f600: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20    }..        rc 
f610: 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
f620: 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a 4d  nal(pJournal, zM
f630: 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74 65  asterPtr, nMaste
f640: 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73  rPtr);.        s
f650: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 4a  qlite3OsClose(pJ
f660: 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20  ournal);.       
f670: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
f680: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
f690: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
f6a0: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
f6b0: 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74         c = zMast
f6c0: 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20 73  erPtr[0]!=0 && s
f6d0: 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72  trcmp(zMasterPtr
f6e0: 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20  , zMaster)==0;. 
f6f0: 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a         if( c ){.
f700: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20            /* We 
f710: 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f  have a match. Do
f720: 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20   not delete the 
f730: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
f740: 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ile. */.        
f750: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
f760: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
f770: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a        }.      zJ
f780: 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65  ournal += (strle
f790: 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a  n(zJournal)+1);.
f7a0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 72      }.  }.  .  r
f7b0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
f7c0: 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  ete(pVfs, zMaste
f7d0: 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  r, 0);..delmaste
f7e0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
f7f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
f800: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
f810: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
f820: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
f830: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
f840: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f850: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 73  Master);.  }.  s
f860: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61 73  qlite3_free(pMas
f870: 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ter);.  return r
f880: 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76 6f  c;.}...static vo
f890: 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  id pager_truncat
f8a0: 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a 70  e_cache(Pager *p
f8b0: 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Pager);../*.** T
f8c0: 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e  runcate the main
f8d0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76   file of the giv
f8e0: 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20  en pager to the 
f8f0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a  number of pages.
f900: 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41 6c  ** indicated. Al
f910: 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 20  so truncate the 
f920: 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e 74  cached represent
f930: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  ation of the fil
f940: 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20 6d  e..**.** Might m
f950: 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73 65  ight be the case
f960: 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20 6f   that the file o
f970: 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c 65  n disk is smalle
f980: 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a 2a  r than nPage..**
f990: 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e   This can happen
f9a0: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  , for example, i
f9b0: 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65 20  f we are in the 
f9c0: 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61 6e  middle of a tran
f9d0: 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63 68  saction.** which
f9e0: 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74 68   has extended th
f9f0: 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64 20  e file size and 
fa00: 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61 72  the new pages ar
fa10: 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c 64  e still all held
fa20: 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74 68  .** in cache, th
fa30: 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72 20  en an INSERT or 
fa40: 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73 74  UPDATE does a st
fa50: 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b  atement rollback
fa60: 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72 61  .  Some.** opera
fa70: 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70 6c  ting system impl
fa80: 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e 20  ementations can 
fa90: 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66 20  get confused if 
faa0: 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74 72  you try to.** tr
fab0: 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74 6f  uncate a file to
fac0: 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74 20   some size that 
fad0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 69  is larger than i
fae0: 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c 0a  t currently is,.
faf0: 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68 69  ** so detect thi
fb00: 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74 65  s case and write
fb10: 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20 62   a single zero b
fb20: 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  yte to the end o
fb30: 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69 6c  f the new.** fil
fb40: 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73 74  e instead..*/.st
fb50: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
fb60: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
fb70: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
fb80: 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
fb90: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70  LITE_OK;.  if( p
fba0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
fbb0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26 26  GER_EXCLUSIVE &&
fbc0: 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65   pPager->fd->pMe
fbd0: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36 34  thods ){.    i64
fbe0: 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e 65   currentSize, ne
fbf0: 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20  wSize;.    rc = 
fc00: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
fc10: 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 63  e(pPager->fd, &c
fc20: 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20 20  urrentSize);.   
fc30: 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67 65   newSize = pPage
fc40: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
fc50: 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28 20  )nPage;.    if( 
fc60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
fc70: 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e 65   currentSize!=ne
fc80: 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 69  wSize ){.      i
fc90: 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  f( currentSize>n
fca0: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
fcb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
fcc0: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
fcd0: 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20  >fd, newSize);. 
fce0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
fcf0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
fd00: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
fd10: 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53 69  fd, "", 1, newSi
fd20: 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ze-1);.      }. 
fd30: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72     }.  }.  if( r
fd40: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
fd50: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
fd60: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
fd70: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
fd80: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
fd90: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
fda0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
fdb0: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
fdc0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
fdd0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
fde0: 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61 73   size is at leas
fdf0: 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65 20  t as big as the 
fe00: 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70 6f  sector size repo
fe10: 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69 74  rted.** by sqlit
fe20: 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
fe30: 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20 73  .  The minimum s
fe40: 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35 31  ector size is 51
fe50: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  2..*/.static voi
fe60: 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28  d setSectorSize(
fe70: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
fe80: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
fe90: 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70  >fd->pMethods||p
fea0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
feb0: 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
fec0: 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
fed0: 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65 20   /* Sector size 
fee0: 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20 66  doesn't matter f
fef0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c  or temporary fil
ff00: 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66 69  es. Also, the fi
ff10: 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e 6f  le.    ** may no
ff20: 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65 6e  t have been open
ff30: 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69 68  ed yet, in whcih
ff40: 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63 74   case the OsSect
ff50: 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a 20  orSize().    ** 
ff60: 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61 75  call will segfau
ff70: 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  lt..    */.    p
ff80: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
ff90: 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63  e = sqlite3OsSec
ffa0: 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  torSize(pPager->
ffb0: 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  fd);.  }.  if( p
ffc0: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
ffd0: 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50 61  e<512 ){.    pPa
ffe0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
fff0: 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = 512;.  }.}../*
10000 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65  .** Playback the
10010 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75   journal and thu
10020 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61  s restore the da
10030 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a  tabase file to.*
10040 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77  * the state it w
10050 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20  as in before we 
10060 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63  started making c
10070 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20  hanges.  .**.** 
10080 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10090 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f   format is as fo
100a0 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28  llows: .**.**  (
100b0 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69  1)  8 byte prefi
100c0 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a  x.  A copy of aJ
100d0 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
100e0 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62  *  (2)  4 byte b
100f0 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
10100 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
10110 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70  umber of valid p
10120 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20  age records.**  
10130 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72       in the jour
10140 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61  nal.  If this va
10150 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66  lue is 0xfffffff
10160 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20  f, then compute 
10170 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d  the.**       num
10180 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f  ber of page reco
10190 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  rds from the jou
101a0 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28  rnal size..**  (
101b0 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  3)  4 byte big-e
101c0 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
101d0 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69  ich is the initi
101e0 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  al value for the
101f0 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74   .**       sanit
10200 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20  y checksum..**  
10210 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (4)  4 byte inte
10220 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
10230 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
10240 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65   to truncate the
10250 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61  .**       databa
10260 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72  se to during a r
10270 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29  ollback..**  (5)
10280 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
10290 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
102a0 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72 20  h is the sector 
102b0 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64 65  size.  The heade
102c0 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74 68  r.**       is th
102d0 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69 6e  is many bytes in
102e0 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20 20   size..**  (6)  
102f0 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
10300 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
10310 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73 65  is the page case
10320 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79 74  ..**  (7)  4 byt
10330 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  e integer which 
10340 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10350 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61   bytes in the ma
10360 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
10370 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65        name.  The
10380 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65   value may be ze
10390 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61  ro (indicate tha
103a0 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  t there is no ma
103b0 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
103c0 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29 20  urnal.).**  (8) 
103d0 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20   N bytes of the 
103e0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
103f0 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77  ame.  The name w
10400 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69  ill be nul-termi
10410 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61  nated.**       a
10420 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72  nd might be shor
10430 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c  ter than the val
10440 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29  ue read from (5)
10450 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20  .  If the first 
10460 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66  byte.**       of
10470 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30   the name is \00
10480 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20  0 then there is 
10490 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
104a0 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a  l.  The master.*
104b0 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20  *       journal 
104c0 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69  name is stored i
104d0 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39 29  n UTF-8..**  (9)
104e0 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70    Zero or more p
104f0 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20  ages instances, 
10500 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  each as follows:
10510 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20  .**        +  4 
10520 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72  byte page number
10530 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70  ..**        +  p
10540 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
10550 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a  bytes of data..*
10560 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79  *        +  4 by
10570 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a  te checksum.**.*
10580 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20  * When we speak 
10590 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
105a0 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74  eader, we mean t
105b0 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d 73  he first 8 items
105c0 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20   above..** Each 
105d0 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75  entry in the jou
105e0 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61  rnal is an insta
105f0 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20 69  nce of the 9th i
10600 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20  tem..**.** Call 
10610 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74  the value from t
10620 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74  he second bullet
10630 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69   "nRec".  nRec i
10640 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  s the number of.
10650 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e  ** valid page en
10660 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75  tries in the jou
10670 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63  rnal.  In most c
10680 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f  ases, you can co
10690 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c  mpute the.** val
106a0 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20  ue of nRec from 
106b0 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
106c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42  journal file.  B
106d0 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a  ut if a power.**
106e0 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65   failure occurre
106f0 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  d while the jour
10700 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72  nal was being wr
10710 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20  itten, it could 
10720 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74  be the.** case t
10730 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20  hat the size of 
10740 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10750 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65   had already bee
10760 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a  n increased but.
10770 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74  ** the extra ent
10780 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74  ries had not yet
10790 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20   made it safely 
107a0 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63  to disk.  In suc
107b0 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65  h a case,.** the
107c0 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63   value of nRec c
107d0 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
107e0 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64   file size would
107f0 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20   be too large.  
10800 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73  For.** that reas
10810 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73  on, we always us
10820 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65  e the nRec value
10830 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a   in the header..
10840 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65  **.** If the nRe
10850 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  c value is 0xfff
10860 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74  fffff it means t
10870 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20  hat nRec should 
10880 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66  be computed.** f
10890 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a  rom the file siz
108a0 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69  e.  This value i
108b0 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20  s used when the 
108c0 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65  user selects the
108d0 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69  .** no-sync opti
108e0 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  on for the journ
108f0 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69  al.  A power fai
10900 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20  lure could lead 
10910 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a  to corruption.**
10920 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20   in this case.  
10930 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c  But for things l
10940 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  ike temporary ta
10950 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20  ble (which will 
10960 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68  be.** deleted wh
10970 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20  en the power is 
10980 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e  restored) we don
10990 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a  't care.  .**.**
109a0 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65   If the file ope
109b0 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e  ned as the journ
109c0 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61  al file is not a
109d0 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20   well-formed.** 
109e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
109f0 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74  n all pages up t
10a00 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72  o the first corr
10a10 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72  upted page are r
10a20 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f  olled.** back (o
10a30 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68  r no pages if th
10a40 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10a50 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20   is corrupted). 
10a60 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
10a70 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65  .** is then dele
10a80 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ted and SQLITE_O
10a90 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74  K returned, just
10aa0 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70   as if no corrup
10ab0 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e  tion had.** been
10ac0 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a   encountered..**
10ad0 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72  .** If an I/O or
10ae0 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20   malloc() error 
10af0 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72  occurs, the jour
10b00 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal-file is not 
10b10 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61  deleted.** and a
10b20 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
10b30 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
10b40 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
10b50 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  ayback(Pager *pP
10b60 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74 29  ager, int isHot)
10b70 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  {.  sqlite3_vfs 
10b80 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e  *pVfs = pPager->
10b90 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a 3b  pVfs;.  i64 szJ;
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10bb0 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
10bc0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
10bd0 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
10be0 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
10bf0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
10c00 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
10c10 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
10c20 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
10c30 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
10c40 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
10c50 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
10c60 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
10c70 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
10c80 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
10c90 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
10ca0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
10cb0 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
10cc0 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20  outine */.  int 
10cd0 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20 20  res = 0;        
10ce0 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72 65       /* Value re
10cf0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
10d00 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a 20  3OsAccess() */. 
10d10 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d   char *zMaster =
10d20 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
10d30 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  e of master jour
10d40 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20  nal file if any 
10d50 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  */..  /* Figure 
10d60 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
10d70 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
10d80 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20  journal.  Abort 
10d90 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68  early if.  ** th
10da0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70  e journal is emp
10db0 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ty..  */.  asser
10dc0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
10dd0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d  alOpen );.  rc =
10de0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
10df0 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
10e00 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
10e10 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a  =SQLITE_OK || sz
10e20 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74 6f  J==0 ){.    goto
10e30 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
10e40 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68   }..  /* Read th
10e50 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
10e60 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20 6a   name from the j
10e70 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69 73  ournal, if it is
10e80 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20 49   present..  ** I
10e90 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
10ea0 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
10eb0 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20 74  specified, but t
10ec0 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 20  he file is not. 
10ed0 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20 64   ** present on d
10ee0 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  isk, then the jo
10ef0 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f 74  urnal is not hot
10f00 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e 65   and does not ne
10f10 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70 6c  ed to be.  ** pl
10f20 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f 0a  ayed back..  */.
10f30 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61 67    zMaster = pPag
10f40 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 20  er->pTmpSpace;. 
10f50 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72   rc = readMaster
10f60 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e  Journal(pPager->
10f70 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50  jfd, zMaster, pP
10f80 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61  ager->pVfs->mxPa
10f90 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66 28  thname+1);.  if(
10fa0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
10fb0 7c 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20 0a 20  | (zMaster[0] . 
10fc0 20 20 26 26 20 28 72 65 73 3d 73 71 6c 69 74 65    && (res=sqlite
10fd0 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
10fe0 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f  zMaster, SQLITE_
10ff0 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29 3d  ACCESS_EXISTS))=
11000 3d 30 20 29 20 0a 20 20 29 7b 0a 20 20 20 20 7a  =0 ) .  ){.    z
11010 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
11020 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
11030 6b 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  k;.  }.  zMaster
11040 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 65 73 3c   = 0;.  if( res<
11050 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  0 ){.    rc = SQ
11060 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
11070 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70  ;.    goto end_p
11080 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70  layback;.  }.  p
11090 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
110a0 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
110b0 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
110c0 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
110d0 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
110e0 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
110f0 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
11100 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
11110 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
11120 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
11130 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
11140 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
11150 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
11160 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
11170 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
11180 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
11190 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
111a0 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
111b0 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
111c0 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
111d0 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
111e0 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
111f0 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
11200 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
11210 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
11220 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
11230 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
11240 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
11250 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
11260 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
11270 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
11280 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
11290 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
112a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
112b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
112c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
112d0 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
112e0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
112f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
11300 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
11310 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
11320 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
11330 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
11340 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
11350 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
11360 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
11370 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
11380 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
11390 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
113a0 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
113b0 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
113c0 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
113d0 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
113e0 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
113f0 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
11400 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
11410 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
11420 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
11430 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
11440 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
11450 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
11460 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
11470 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
11480 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
11490 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
114a0 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
114b0 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20 61  * If nRec is 0 a
114c0 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63 6b  nd this rollback
114d0 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61 63   is of a transac
114e0 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79 20  tion created by 
114f0 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f 63  this.    ** proc
11500 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73 20  ess and if this 
11510 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65 61  is the final hea
11520 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  der in the journ
11530 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61 6e  al, then it mean
11540 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74 68  s.    ** that th
11550 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 6a  is part of the j
11560 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
11570 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73 20   filled but has 
11580 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20 20  not yet been.   
11590 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64 69   ** synced to di
115a0 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68 65  sk.  Compute the
115b0 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
115c0 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72 65   based on the re
115d0 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 73  maining.    ** s
115e0 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ize of the file.
115f0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
11600 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f 66  he third term of
11610 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61 64   the test was ad
11620 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b 65  ded to fix ticke
11630 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f 0a  t #2565..    */.
11640 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20      if( nRec==0 
11650 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20 20  && !isHot &&.   
11660 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11670 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f  rnalHdr+JOURNAL_
11680 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
11690 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
116a0 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  ff ){.      nRec
116b0 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
116c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
116d0 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50  JOURNAL_PG_SZ(pP
116e0 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ager);.    }..  
116f0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
11700 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65 72  the first header
11710 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
11720 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65  ournal, truncate
11730 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
11740 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74  base file back t
11750 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73  o its original s
11760 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ize..    */.    
11770 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
11780 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
11790 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
117a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
117b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
117c0 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20  er, mxPg);.     
117d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
117e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f  OK ){.        go
117f0 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
11800 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
11810 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
11820 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
11830 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
11840 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
11850 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
11860 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
11870 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
11880 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
11890 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
118a0 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
118b0 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
118c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
118d0 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
118e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
118f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
11900 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20  TE_DONE ){.     
11910 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
11920 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  _OK;.          p
11930 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
11940 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20  f = szJ;.       
11950 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
11960 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11970 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
11980 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  back;.        }.
11990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
119a0 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45 44  }.  /*NOTREACHED
119b0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20 29  */.  assert( 0 )
119c0 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
119d0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
119e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61 73  E_OK ){.    zMas
119f0 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 54  ter = pPager->pT
11a00 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63 20  mpSpace;.    rc 
11a10 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72  = readMasterJour
11a20 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  nal(pPager->jfd,
11a30 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65 72   zMaster, pPager
11a40 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  ->pVfs->mxPathna
11a50 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66 28  me+1);.  }.  if(
11a60 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
11a70 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
11a80 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
11a90 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72  (pPager, zMaster
11aa0 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d 0a  [0]!='\0');.  }.
11ab0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
11ac0 5f 4f 4b 20 26 26 20 7a 4d 61 73 74 65 72 5b 30  _OK && zMaster[0
11ad0 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ] ){.    /* If t
11ae0 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
11af0 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
11b00 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
11b10 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c 0a  return success,.
11b20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69 74      ** see if it
11b30 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
11b40 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
11b50 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a  r journal..    *
11b60 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  /.    rc = pager
11b70 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67 65  _delmaster(pPage
11b80 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  r, zMaster);.  }
11b90 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
11ba0 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
11bb0 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
11bc0 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
11bd0 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
11be0 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
11bf0 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
11c00 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
11c10 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a 20  nt sector size. 
11c20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74   ** value. Reset
11c30 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65   it to the corre
11c40 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69  ct value for thi
11c50 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a  s process..  */.
11c60 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
11c70 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
11c80 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
11c90 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
11ca0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
11cb0 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
11cc0 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
11cd0 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
11ce0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
11cf0 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
11d00 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
11d10 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
11d20 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
11d30 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11d40 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
11d50 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
11d60 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
11d70 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
11d80 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
11d90 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
11da0 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
11db0 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
11dc0 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
11dd0 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
11de0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
11df0 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
11e00 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
11e10 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
11e20 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
11e30 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
11e40 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
11e50 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
11e60 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
11e70 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
11e80 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
11e90 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
11ea0 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
11eb0 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
11ec0 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
11ed0 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
11ee0 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
11ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11f00 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
11f10 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
11f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f30 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
11f40 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
11f50 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
11f60 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a 20  urnalOff;..  /* 
11f70 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
11f80 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73 74   the offset just
11f90 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20 6f   after the end o
11fa0 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72 6e  f the last journ
11fb0 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72 69  al.  ** page wri
11fc0 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65 20  tten before the 
11fd0 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68 65  first journal-he
11fe0 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73 74  ader for this st
11ff0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72 61  atement.  ** tra
12000 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72 69  nsaction was wri
12010 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e 64  tten, or the end
12020 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66 20   of the file if 
12030 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  no journal.  ** 
12040 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74 74  header was writt
12050 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f 66  en..  */.  hdrOf
12060 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f = pPager->stmt
12070 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72 74  HdrOff;.  assert
12080 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
12090 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29 3b  nc || !hdrOff );
120a0 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20 29  .  if( !hdrOff )
120b0 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20 73  {.    hdrOff = s
120c0 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a 20  zJ;.  }.  .  /* 
120d0 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61 74  Truncate the dat
120e0 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69 74  abase back to it
120f0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
12100 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
12110 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
12120 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  er, pPager->stmt
12130 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74 28  Size);.  assert(
12140 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
12150 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a  PAGER_SHARED );.
12160 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74  .  /* Figure out
12170 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64   how many record
12180 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  s are in the sta
12190 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
121a0 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
121b0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
121c0 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   && pPager->jour
121d0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52 65  nalOpen );.  nRe
121e0 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  c = pPager->stmt
121f0 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f  NRec;.  .  /* Co
12200 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  py original page
12210 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61  s out of the sta
12220 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61  tement journal a
12230 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
12240 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
12250 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20  ile.  Note that 
12260 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
12270 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63  urnal omits chec
12280 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20  ksums from.  ** 
12290 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63  each record sinc
122a0 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20  e power-failure 
122b0 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20  recovery is not 
122c0 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61  important to sta
122d0 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72  tement.  ** jour
122e0 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  nals..  */.  for
122f0 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b  (i=0; i<nRec; i+
12300 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66 73  +){.    i64 offs
12310 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65 72  et = i*(4+pPager
12320 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
12330 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
12340 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
12350 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
12360 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b 0a  fd, offset, 0);.
12370 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
12380 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
12390 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
123a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
123b0 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
123c0 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c   }..  /* Now rol
123d0 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63  l some pages bac
123e0 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73  k from the trans
123f0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20  action journal. 
12400 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a  Pager.stmtJSize.
12410 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a    ** was the siz
12420 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
12430 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20   file when this 
12440 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74  statement was st
12450 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65  arted, so.  ** e
12460 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20  verything after 
12470 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
12480 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69   rolled back, ei
12490 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20  ther into the.  
124a0 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65  ** database, the
124b0 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f   memory cache, o
124c0 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a  r both..  **.  *
124d0 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a  * If it is not z
124e0 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e  ero, then Pager.
124f0 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68  stmtHdrOff is th
12500 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20  e offset to the 
12510 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68  start.  ** of th
12520 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20  e first journal 
12530 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64  header written d
12540 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65  uring this state
12550 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
12560 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  ..  */.  pPager-
12570 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50  >journalOff = pP
12580 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b  ager->stmtJSize;
12590 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  .  pPager->cksum
125a0 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  Init = pPager->s
125b0 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69 6c  tmtCksum;.  whil
125c0 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
125d0 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20 29  alOff < hdrOff )
125e0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
125f0 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
12600 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  ge(pPager, pPage
12610 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
12620 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a  journalOff, 1);.
12630 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
12640 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
12650 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12660 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
12670 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
12680 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
12690 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
126a0 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
126b0 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20 20   nJRec;         
126c0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f 75  /* Number of Jou
126d0 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f 0a  rnal Records */.
126e0 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a 20      u32 dummy;. 
126f0 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75 72     rc = readJour
12700 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20 73  nalHdr(pPager, s
12710 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75 6d  zJ, &nJRec, &dum
12720 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
12730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12740 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
12750 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
12760 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
12770 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
12780 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65 63   }.    if( nJRec
12790 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a 52  ==0 ){.      nJR
127a0 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67  ec = (szJ - pPag
127b0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20  er->journalOff) 
127c0 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  / (pPager->pageS
127d0 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20  ize+8);.    }.  
127e0 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31 3b    for(i=nJRec-1;
127f0 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
12800 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
12810 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
12820 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
12830 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
12840 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
12850 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
12860 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  Off, 1);.      a
12870 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
12880 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
12890 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
128a0 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
128b0 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
128c0 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
128d0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
128e0 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
128f0 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
12900 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b 0a  c==SQLITE_OK) {.
12910 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
12920 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
12930 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
12940 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
12950 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
12960 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
12970 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
12980 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
12990 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
129a0 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a  are allowed..*/.
129b0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
129c0 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50 61  rSetCachesize(Pa
129d0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
129e0 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
129f0 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
12a00 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
12a10 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
12a20 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
12a30 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
12a40 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
12a50 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
12a60 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
12a70 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
12a80 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
12a90 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
12aa0 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
12ab0 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
12ac0 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
12ad0 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
12ae0 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
12af0 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
12b00 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
12b10 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
12b20 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
12b30 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
12b40 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
12b50 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
12b60 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
12b70 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
12b80 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
12b90 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
12ba0 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
12bb0 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
12bc0 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
12bd0 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
12be0 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
12bf0 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
12c00 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
12c10 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
12c20 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
12c30 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
12c40 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
12c50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12c60 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
12c70 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
12c80 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
12c90 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
12ca0 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
12cb0 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
12cc0 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
12cd0 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
12ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
12cf0 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
12d00 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
12d10 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
12d20 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
12d30 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
12d40 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
12d50 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
12d60 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
12d70 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
12d80 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
12d90 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
12da0 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
12db0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
12dc0 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
12dd0 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
12de0 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
12df0 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
12e00 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
12e10 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
12e20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
12e30 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
12e40 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
12e50 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
12e60 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
12e70 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
12e80 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
12e90 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
12ea0 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
12eb0 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
12ec0 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
12ed0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
12ee0 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
12ef0 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
12f00 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
12f10 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
12f20 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
12f30 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
12f40 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65  ULL=3..*/.#ifnde
12f50 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41  f SQLITE_OMIT_PA
12f60 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64  GER_PRAGMAS.void
12f70 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74   sqlite3PagerSet
12f80 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67 65  SafetyLevel(Page
12f90 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
12fa0 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f 66  evel, int full_f
12fb0 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72 2d  sync){.  pPager-
12fc0 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
12fd0 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
12fe0 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
12ff0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
13000 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
13010 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
13020 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
13030 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63 3f  s = (full_fsync?
13040 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c 4c  SQLITE_SYNC_FULL
13050 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52  :SQLITE_SYNC_NOR
13060 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  MAL);.  if( pPag
13070 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
13080 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
13090 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  0;.}.#endif../*.
130a0 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
130b0 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65   global variable
130c0 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
130d0 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62  whenever the lib
130e0 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73  rary.** attempts
130f0 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f   to open a tempo
13100 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73  rary file.  This
13110 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
13120 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74  used for.** test
13130 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
13140 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64   only.  .*/.#ifd
13150 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69  ef SQLITE_TEST.i
13160 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74  nt sqlite3_opent
13170 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23  emp_count = 0;.#
13180 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  endif../*.** Ope
13190 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
131a0 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  le. .**.** Write
131b0 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69   the file descri
131c0 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20  ptor into *fd.  
131d0 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
131e0 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73   on success or s
131f0 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72  ome.** other err
13200 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66 61  or code if we fa
13210 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c 20  il. The OS will 
13220 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65  automatically de
13230 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
13240 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e 20  ry.** file when 
13250 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2f  it is closed..*/
13260 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69  .static int sqli
13270 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70  te3PagerOpentemp
13280 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20  (.  sqlite3_vfs 
13290 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20 54 68 65  *pVfs,    /* The
132a0 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
132b0 73 74 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20 20  stem layer */.  
132c0 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 46  sqlite3_file *pF
132d0 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20 74  ile,  /* Write t
132e0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
132f0 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68 61  or here */.  cha
13300 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
13310 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
13320 65 20 66 69 6c 65 2e 20 20 4d 69 67 68 74 20 62  e file.  Might b
13330 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20  e NULL */.  int 
13340 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20 20  vfsFlags        
13350 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73 65    /* Flags passe
13360 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68 65  d through to the
13370 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74   VFS */.){.  int
13380 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 7a   rc;.  assert( z
13390 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a 0a  Filename!=0 );..
133a0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
133b0 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70 65  ST.  sqlite3_ope
133c0 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20 20  ntemp_count++;  
133d0 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73 74  /* Used for test
133e0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
133f0 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66 0a   only */.#endif.
13400 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20 20  .  vfsFlags |=  
13410 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
13420 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f 4f  WRITE | SQLITE_O
13430 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20 20  PEN_CREATE |.   
13440 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
13450 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20 7c  OPEN_EXCLUSIVE |
13460 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c   SQLITE_OPEN_DEL
13470 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72 63  ETEONCLOSE;.  rc
13480 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
13490 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
134a0 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61 67  , pFile, vfsFlag
134b0 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74 28  s, 0);.  assert(
134c0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
134d0 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f 64  | pFile->pMethod
134e0 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  s );.  return rc
134f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
13500 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61 63  e a new page cac
13510 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69  he and put a poi
13520 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
13530 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67   cache in *ppPag
13540 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20  er..** The file 
13550 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65 65  to be cached nee
13560 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68  d not exist.  Th
13570 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f  e file is not lo
13580 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68  cked until.** th
13590 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20  e first call to 
135a0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
135b0 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65  ) and is only he
135c0 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68  ld open until th
135d0 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69  e.** last page i
135e0 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67  s released using
135f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
13600 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
13610 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
13620 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
13630 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
13640 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
13650 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
13660 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
13670 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
13680 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
13690 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
136a0 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
136b0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
136c0 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
136d0 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
136e0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
136f0 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
13700 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
13710 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
13720 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
13730 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
13740 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
13750 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
13760 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a 20  ite3PagerOpen(. 
13770 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
13780 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  fs,       /* The
13790 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73 79   virtual file sy
137a0 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20  stem to use */. 
137b0 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65 72   Pager **ppPager
137c0 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74  ,         /* Ret
137d0 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73 74  urn the Pager st
137e0 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f 0a  ructure here */.
137f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46    const char *zF
13800 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61  ilename,   /* Na
13810 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
13820 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
13830 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61 2c  */.  int nExtra,
13840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
13850 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70 70   Extra bytes app
13860 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  end to each in-m
13870 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
13880 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20 20  int flags,      
13890 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67           /* flag
138a0 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68  s controlling th
138b0 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74  is file */.  int
138c0 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
138d0 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 70        /* flags p
138e0 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74 6f  assed through to
138f0 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70   sqlite3_vfs.xOp
13900 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38 20  en() */.){.  u8 
13910 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20 2a  *pPtr;.  Pager *
13920 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69 6e  pPager = 0;.  in
13930 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
13940 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
13950 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
13960 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
13970 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
13980 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
13990 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
139a0 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
139b0 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
139c0 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
139d0 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
139e0 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e 74  DLOCK)!=0;.  int
139f0 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a 65   journalFileSize
13a00 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61   = sqlite3Journa
13a10 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20 69  lSize(pVfs);.  i
13a20 6e 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20  nt nDefaultPage 
13a30 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  = SQLITE_DEFAULT
13a40 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63 68  _PAGE_SIZE;.  ch
13a50 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a 20  ar *zPathname;. 
13a60 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b 0a   int nPathname;.
13a70 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72 6e    char *zStmtJrn
13a80 6c 3b 0a 20 20 69 6e 74 20 6e 53 74 6d 74 4a 72  l;.  int nStmtJr
13a90 6e 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65  nl;..  /* The de
13aa0 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73 20  fault return is 
13ab0 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 2a  a NULL pointer *
13ac0 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20 30  /.  *ppPager = 0
13ad0 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65 20  ;..  /* Compute 
13ae0 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
13af0 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e 61 6d 65  e */.  nPathname
13b00 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e   = pVfs->mxPathn
13b10 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74 68 6e 61  ame+1;.  zPathna
13b20 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  me = sqlite3_mal
13b30 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32 29  loc(nPathname*2)
13b40 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61 6d  ;.  if( zPathnam
13b50 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  e==0 ){.    retu
13b60 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
13b70 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
13b80 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
13b90 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
13ba0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
13bb0 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
13bc0 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
13bd0 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
13be0 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
13bf0 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d 65  .      zPathname
13c00 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  [0] = 0;.    }el
13c10 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b 0a  se.#endif.    {.
13c20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13c30 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
13c40 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d 65  (pVfs, zFilename
13c50 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61  , nPathname, zPa
13c60 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20  thname);.    }. 
13c70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
13c80 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65 6d   sqlite3OsGetTem
13c90 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50 61 74  pname(pVfs, nPat
13ca0 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65  hname, zPathname
13cb0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21  );.  }.  if( rc!
13cc0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13cd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
13ce0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 72  Pathname);.    r
13cf0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
13d00 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72 6c  nPathname = strl
13d10 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 0a  en(zPathname);..
13d20 20 20 2f 2a 20 50 75 74 20 74 68 65 20 73 74 61    /* Put the sta
13d30 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
13d40 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 69 73 6b  n temporary disk
13d50 20 73 70 61 63 65 20 73 69 6e 63 65 20 74 68 69   space since thi
13d60 73 20 69 73 0a 20 20 2a 2a 20 73 6f 6d 65 74 69  s is.  ** someti
13d70 6d 65 73 20 52 41 4d 20 64 69 73 6b 20 6f 72 20  mes RAM disk or 
13d80 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 65 64 20  other optimized 
13d90 73 74 6f 72 61 67 65 2e 20 20 55 6e 6c 69 6b 65  storage.  Unlike
13da0 6c 79 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a 2a  ly the main.  **
13db0 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   main journal fi
13dc0 6c 65 2c 20 74 68 65 20 73 74 61 74 65 6d 65 6e  le, the statemen
13dd0 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e  t journal does n
13de0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 0a 20  ot need to be . 
13df0 20 2a 2a 20 63 6f 6c 6f 63 61 74 65 64 20 77 69   ** colocated wi
13e00 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65 20  th the database 
13e10 6e 6f 72 20 64 6f 65 73 20 69 74 20 6e 65 65 64  nor does it need
13e20 20 74 6f 20 62 65 20 70 65 72 73 69 73 74 65 6e   to be persisten
13e30 74 2e 0a 20 20 2a 2f 0a 20 20 7a 53 74 6d 74 4a  t..  */.  zStmtJ
13e40 72 6e 6c 20 3d 20 26 7a 50 61 74 68 6e 61 6d 65  rnl = &zPathname
13e50 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
13e60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47   rc = sqlite3OsG
13e70 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c  etTempname(pVfs,
13e80 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d   pVfs->mxPathnam
13e90 65 2b 31 2c 20 7a 53 74 6d 74 4a 72 6e 6c 29 3b  e+1, zStmtJrnl);
13ea0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
13eb0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69  E_OK ){.    sqli
13ec0 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61  te3_free(zPathna
13ed0 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
13ee0 72 63 3b 0a 20 20 7d 0a 20 20 6e 53 74 6d 74 4a  rc;.  }.  nStmtJ
13ef0 72 6e 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74  rnl = strlen(zSt
13f00 6d 74 4a 72 6e 6c 29 3b 0a 0a 20 20 2f 2a 20 41  mtJrnl);..  /* A
13f10 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20 66  llocate memory f
13f20 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74 72  or the pager str
13f30 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61 67  ucture */.  pPag
13f40 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  er = sqlite3Mall
13f50 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a 65  ocZero(.    size
13f60 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20 20  of(*pPager) +   
13f70 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 72          /* Pager
13f80 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20 20   structure */.  
13f90 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a    journalFileSiz
13fa0 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e +           /*
13fb0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
13fc0 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20 0a  e structure */ .
13fd0 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69      pVfs->szOsFi
13fe0 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20 20  le * 3 +        
13ff0 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20 61  /* The main db a
14000 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20 66  nd two journal f
14010 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a 6e  iles */ .    3*n
14020 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 2b 20  Pathname + 40 + 
14030 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
14040 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f 72  ename, zDirector
14050 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  y, zJournal */. 
14060 20 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 20 20 20     nStmtJrnl    
14070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
14080 2a 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20  * zStmtJrnl */. 
14090 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
140a0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
140b0 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
140c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
140d0 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
140e0 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70   pPtr = (u8 *)&p
140f0 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
14100 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
14110 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65  fsFlags;.  pPage
14120 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
14130 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
14140 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
14150 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d    pPager->stfd =
14160 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
14170 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
14180 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65  File*1];.  pPage
14190 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
141a0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
141b0 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
141c0 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
141d0 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
141e0 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
141f0 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  le*2+journalFile
14200 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
14210 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
14220 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14230 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
14240 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
14250 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
14260 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d  rectory[nPathnam
14270 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
14280 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61  zStmtJrnl = &pPa
14290 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
142a0 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70  athname+10];.  p
142b0 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
142c0 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  fs;.  memcpy(pPa
142d0 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
142e0 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
142f0 6e 61 6d 65 2b 31 29 3b 0a 20 20 6d 65 6d 63 70  name+1);.  memcp
14300 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a  y(pPager->zStmtJ
14310 72 6e 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c 2c 20  rnl, zStmtJrnl, 
14320 6e 53 74 6d 74 4a 72 6e 6c 2b 31 29 3b 0a 20 20  nStmtJrnl+1);.  
14330 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61  sqlite3_free(zPa
14340 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4f  thname);..  /* O
14350 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  pen the pager fi
14360 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  le..  */.  if( z
14370 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
14380 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d  ename[0] && !mem
14390 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50  Db ){.    if( nP
143a0 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d  athname>(pVfs->m
143b0 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65  xPathname - size
143c0 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20  of("-journal")) 
143d0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
143e0 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20  LITE_CANTOPEN;. 
143f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
14400 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20  int fout = 0;.  
14410 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14420 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61  OsOpen(pVfs, pPa
14430 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
14440 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20  pPager->fd,.    
14450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14460 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73       pPager->vfs
14470 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20  Flags, &fout);. 
14480 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20       readOnly = 
14490 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45  (fout&SQLITE_OPE
144a0 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20  N_READONLY);..  
144b0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69      /* If the fi
144c0 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75  le was successfu
144d0 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72  lly opened for r
144e0 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73  ead/write access
144f0 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73  ,.      ** choos
14500 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65  e a default page
14510 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65   size in case we
14520 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
14530 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74  the.      ** dat
14540 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20  abase file. The 
14550 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a  default page siz
14560 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d  e is the maximum
14570 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   of:.      **.  
14580 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49      **    + SQLI
14590 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  TE_DEFAULT_PAGE_
145a0 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20  SIZE,.      **  
145b0 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65    + The value re
145c0 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65  turned by sqlite
145d0 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a  3OsSectorSize().
145e0 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68        **    + Th
145f0 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73  e largest page s
14600 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ize that can be 
14610 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c  written atomical
14620 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ly..      */.   
14630 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
14640 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c  E_OK && !readOnl
14650 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y ){.        int
14660 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73   iSectorSize = s
14670 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69  qlite3OsSectorSi
14680 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  ze(pPager->fd);.
14690 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66          if( nDef
146a0 61 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72  aultPage<iSector
146b0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Size ){.        
146c0 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d    nDefaultPage =
146d0 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20   iSectorSize;.  
146e0 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53        }.#ifdef S
146f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
14700 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20  MIC_WRITE.      
14710 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
14720 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f  t iDc = sqlite3O
14730 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72  sDeviceCharacter
14740 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66  istics(pPager->f
14750 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  d);.          in
14760 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20  t ii;.          
14770 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
14780 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
14790 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20  512>>8));.      
147a0 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54      assert(SQLIT
147b0 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34  E_IOCAP_ATOMIC64
147c0 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a  K==(65536>>8));.
147d0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
147e0 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41  (SQLITE_MAX_DEFA
147f0 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36  ULT_PAGE_SIZE<=6
14800 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20  5536);.         
14810 20 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74   for(ii=nDefault
14820 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45  Page; ii<=SQLITE
14830 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
14840 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29  E_SIZE; ii=ii*2)
14850 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
14860 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f  ( iDc&(SQLITE_IO
14870 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e  CAP_ATOMIC|(ii>>
14880 38 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61  8)) ) nDefaultPa
14890 67 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20  ge = ii;.       
148a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23     }.        }.#
148b0 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66  endif.        if
148c0 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53  ( nDefaultPage>S
148d0 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c  QLITE_MAX_DEFAUL
148e0 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20  T_PAGE_SIZE ){. 
148f0 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c           nDefaul
14900 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d  tPage = SQLITE_M
14910 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f  AX_DEFAULT_PAGE_
14920 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a  SIZE;.        }.
14930 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
14940 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62  }else if( !memDb
14950 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20   ){.    /* If a 
14960 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
14970 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20  s requested, it 
14980 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d  is not opened im
14990 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a  mediately..    *
149a0 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77  * In this case w
149b0 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66  e accept the def
149c0 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61  ault page size a
149d0 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c  nd delay actuall
149e0 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67  y.    ** opening
149f0 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20   the file until 
14a00 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
14a10 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20  o OsWrite()..   
14a20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c   */ .    tempFil
14a30 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65  e = 1;.    pPage
14a40 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
14a50 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a  _EXCLUSIVE;.  }.
14a60 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26  .  if( pPager &&
14a70 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14a80 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54  {.    pPager->pT
14a90 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74 65  mpSpace = sqlite
14aa0 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 44 65 66  3MallocZero(nDef
14ab0 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  aultPage);.  }..
14ac0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
14ad0 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
14ae0 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
14af0 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
14b00 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
14b10 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
14b20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
14b30 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
14b40 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
14b50 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
14b60 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
14b70 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
14b80 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
14b90 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
14ba0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
14bb0 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
14bc0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
14bd0 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
14be0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
14bf0 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
14c00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
14c10 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
14c20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
14c30 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
14c40 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
14c50 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
14c60 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
14c70 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
14c80 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
14c90 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
14ca0 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
14cb0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
14cc0 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
14cd0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
14ce0 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
14cf0 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
14d00 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
14d10 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
14d20 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
14d30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
14d40 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
14d50 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
14d60 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
14d70 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
14d80 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
14d90 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
14da0 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50 61   */.  memcpy(pPa
14db0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70  ger->zJournal, p
14dc0 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
14dd0 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  , nPathname);.  
14de0 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e  memcpy(&pPager->
14df0 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e 61  zJournal[nPathna
14e00 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 2c  me], "-journal",
14e10 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65   9);..  /* pPage
14e20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
14e30 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d   0; */.  pPager-
14e40 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
14e50 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
14e60 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
14e70 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
14e80 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
14e90 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  y;.  /* pPager->
14ea0 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f  stmtOpen = 0; */
14eb0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74  .  /* pPager->st
14ec0 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a  mtInUse = 0; */.
14ed0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65    /* pPager->nRe
14ee0 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  f = 0; */.  pPag
14ef0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d  er->dbSize = mem
14f00 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Db-1;.  pPager->
14f10 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61  pageSize = nDefa
14f20 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50  ultPage;.  /* pP
14f30 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
14f40 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14f50 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
14f60 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14f70 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
14f80 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
14f90 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
14fa0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
14fb0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
14fc0 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  T;.  /* pPager->
14fd0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
14fe0 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72  LOCK; */.  asser
14ff0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
15000 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20   == (tempFile ? 
15010 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
15020 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20  : PAGER_UNLOCK) 
15030 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  );.  /* pPager->
15040 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a  errMask = 0; */.
15050 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69    pPager->tempFi
15060 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20  le = tempFile;. 
15070 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c   assert( tempFil
15080 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
15090 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20  MODE_NORMAL .   
150a0 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69         || tempFi
150b0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
150c0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
150d0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
150e0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
150f0 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20  XCLUSIVE==1 );. 
15100 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
15110 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c  veMode = tempFil
15120 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65  e; .  pPager->me
15130 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70  mDb = memDb;.  p
15140 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20  Pager->readOnly 
15150 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a  = readOnly;.  /*
15160 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
15170 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67  c = 0; */.  pPag
15180 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
15190 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
151a0 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
151b0 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
151c0 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
151d0 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
151e0 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20  r->sync_flags = 
151f0 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d  SQLITE_SYNC_NORM
15200 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  AL;.  /* pPager-
15210 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a  >pFirst = 0; */.
15220 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69    /* pPager->pFi
15230 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a  rstSynced = 0; *
15240 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70  /.  /* pPager->p
15250 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Last = 0; */.  p
15260 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20  Pager->nExtra = 
15270 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28  FORCE_ALIGNMENT(
15280 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72  nExtra);.  asser
15290 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
152a0 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74  ethods||memDb||t
152b0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20  empFile);.  if( 
152c0 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65  !memDb ){.    se
152d0 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
152e0 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50  er);.  }.  /* pP
152f0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
15300 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  er = 0; */.  /* 
15310 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
15320 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
15330 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
15340 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d   */.  *ppPager =
15350 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20   pPager;.#ifdef 
15360 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
15370 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
15380 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65    pPager->iInUse
15390 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  MM = 0;.  pPager
153a0 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a  ->iInUseDB = 0;.
153b0 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a    if( !memDb ){.
153c0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
153d0 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73 71  UTEX_NOOP.    sq
153e0 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74  lite3_mutex *mut
153f0 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74  ex = sqlite3_mut
15400 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
15410 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d  MUTEX_STATIC_MEM
15420 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  2);.#endif.    s
15430 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
15440 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70  er(mutex);.    p
15450 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73  Pager->pNext = s
15460 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b  qlite3PagerList;
15470 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
15480 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20  PagerList ){.   
15490 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69 74     assert( sqlit
154a0 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72  e3PagerList->pPr
154b0 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73  ev==0 );.      s
154c0 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d  qlite3PagerList-
154d0 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b  >pPrev = pPager;
154e0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
154f0 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20  r->pPrev = 0;.  
15500 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69    sqlite3PagerLi
15510 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  st = pPager;.   
15520 20 70 50 61 67 65 72 2d 3e 6f 6e 50 61 67 65 72   pPager->onPager
15530 4c 69 73 74 20 3d 20 31 3b 0a 20 20 20 20 73 71  List = 1;.    sq
15540 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
15550 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65  e(mutex);.  }.#e
15560 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53 51  ndif.  return SQ
15570 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
15580 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20 68  * Set the busy h
15590 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e  andler function.
155a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
155b0 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e 64  PagerSetBusyhand
155c0 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ler(Pager *pPage
155d0 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a  r, BusyHandler *
155e0 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20  pBusyHandler){. 
155f0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
15600 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e  ndler = pBusyHan
15610 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  dler;.}../*.** S
15620 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74 6f  et the destructo
15630 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  r for this pager
15640 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20  .  If not NULL, 
15650 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  the destructor i
15660 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e  s called.** when
15670 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
15680 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67  ount on each pag
15690 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20  e reaches zero. 
156a0 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   The destructor 
156b0 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74  can.** be used t
156c0 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72  o clean up infor
156d0 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78  mation in the ex
156e0 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65  tra segment appe
156f0 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61 67  nded to each pag
15700 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73  e..**.** The des
15710 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63  tructor is not c
15720 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c  alled as a resul
15730 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c  t sqlite3PagerCl
15740 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74  ose().  .** Dest
15750 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79  ructors are only
15760 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74   called by sqlit
15770 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a  e3PagerUnref()..
15780 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50  */.void sqlite3P
15790 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74 6f  agerSetDestructo
157a0 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
157b0 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 44   void (*xDesc)(D
157c0 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20  bPage*,int)){.  
157d0 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
157e0 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
157f0 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
15800 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
15810 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
15820 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
15830 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
15840 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
15850 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
15860 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
15870 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
15880 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
15890 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
158a0 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
158b0 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
158c0 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
158d0 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
158e0 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
158f0 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
15900 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
15910 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
15920 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
15930 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  id sqlite3PagerS
15940 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65 72  etReiniter(Pager
15950 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
15960 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67 65  *xReinit)(DbPage
15970 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
15980 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
15990 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
159a0 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
159b0 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65  ze to *pPageSize
159c0 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74  . If the suggest
159d0 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20 69   new page size i
159e0 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69 61  s.** inappropria
159f0 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
15a00 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
15a10 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61 74  e is set to that
15a20 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72 65  .** value before
15a30 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69   returning..*/.i
15a40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  nt sqlite3PagerS
15a50 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65 72  etPagesize(Pager
15a60 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a 70   *pPager, u16 *p
15a70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74  PageSize){.  int
15a80 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
15a90 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a 65 20  .  u16 pageSize 
15aa0 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20 20  = *pPageSize;.  
15ab0 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65  assert( pageSize
15ac0 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65  ==0 || (pageSize
15ad0 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a  >=512 && pageSiz
15ae0 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41  e<=SQLITE_MAX_PA
15af0 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69 66  GE_SIZE) );.  if
15b00 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70 61  ( pageSize && pa
15b10 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e  geSize!=pPager->
15b20 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26 20  pageSize .   && 
15b30 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26  !pPager->memDb &
15b40 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d  & pPager->nRef==
15b50 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72  0 .  ){.    char
15b60 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20 2a   *pNew = (char *
15b70 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
15b80 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
15b90 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20 20  f( !pNew ){.    
15ba0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
15bb0 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
15bc0 20 20 20 20 20 20 70 61 67 65 72 45 6e 74 65 72        pagerEnter
15bd0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15be0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
15bf0 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  er);.      pPage
15c00 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70 61  r->pageSize = pa
15c10 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73 65  geSize;.      se
15c20 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
15c30 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  er);.      sqlit
15c40 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
15c50 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20 20  pTmpSpace);.    
15c60 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
15c70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  ace = pNew;.    
15c80 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
15c90 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
15ca0 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20 70    *pPageSize = p
15cb0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
15cc0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15cd0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15ce0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 22  pointer to the "
15cf0 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22 20  temporary page" 
15d00 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74 65  buffer held inte
15d10 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65  rnally.** by the
15d20 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69 73   pager.  This is
15d30 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20 69   a buffer that i
15d40 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f 20  s big enough to 
15d50 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69  hold the.** enti
15d60 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  re content of a 
15d70 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20 20  database page.  
15d80 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20 75  This buffer is u
15d90 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a  sed internally.*
15da0 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63  * during rollbac
15db0 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76  k and will be ov
15dc0 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65 76  erwritten whenev
15dd0 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  er a rollback.**
15de0 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f 74   occurs.  But ot
15df0 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65 20  her modules are 
15e00 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20 74  free to use it t
15e10 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a  oo, as long as.*
15e20 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61  * no rollbacks a
15e30 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f  re happening..*/
15e40 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61  .void *sqlite3Pa
15e50 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61 67  gerTempSpace(Pag
15e60 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
15e70 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 54  eturn pPager->pT
15e80 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  mpSpace;.}../*.*
15e90 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74  * Attempt to set
15ea0 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74   the maximum dat
15eb0 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74  abase page count
15ec0 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f   if mxPage is po
15ed0 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65  sitive. .** Make
15ee0 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d   no changes if m
15ef0 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72  xPage is zero or
15f00 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20   negative.  And 
15f10 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65  never reduce the
15f20 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  .** maximum page
15f30 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65   count below the
15f40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
15f50 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a   the database..*
15f60 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20  *.** Regardless 
15f70 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72  of mxPage, retur
15f80 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61  n the current ma
15f90 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74  ximum page count
15fa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15fb0 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e  PagerMaxPageCoun
15fc0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  t(Pager *pPager,
15fd0 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
15fe0 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a  if( mxPage>0 ){.
15ff0 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67      pPager->mxPg
16000 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d  no = mxPage;.  }
16010 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50  .  sqlite3PagerP
16020 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
16030 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  ;.  return pPage
16040 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a  r->mxPgno;.}../*
16050 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
16060 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65  g set of routine
16070 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69  s are used to di
16080 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61  sable the simula
16090 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72  ted.** I/O error
160a0 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65   mechanism.  The
160b0 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20  se routines are 
160c0 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69  used to avoid si
160d0 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72  mulated.** error
160e0 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72  s in places wher
160f0 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  e we do not care
16100 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a   about errors..*
16110 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51  *.** Unless -DSQ
16120 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75  LITE_TEST=1 is u
16130 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69  sed, these routi
16140 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f  nes are all no-o
16150 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61  ps.** and genera
16160 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23  te no code..*/.#
16170 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53  ifdef SQLITE_TES
16180 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  T.extern int sql
16190 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
161a0 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e  nding;.extern in
161b0 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72  t sqlite3_io_err
161c0 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69  or_hit;.static i
161d0 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f  nt saved_cnt;.vo
161e0 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c  id disable_simul
161f0 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76  ated_io_errors(v
16200 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e  oid){.  saved_cn
16210 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
16220 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
16230 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72  sqlite3_io_error
16240 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d  _pending = -1;.}
16250 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d  .void enable_sim
16260 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
16270 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65  (void){.  sqlite
16280 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
16290 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a  ng = saved_cnt;.
162a0 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
162b0 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74   disable_simulat
162c0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23  ed_io_errors().#
162d0 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73   define enable_s
162e0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
162f0 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  rs().#endif../*.
16300 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
16310 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
16320 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
16330 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
16340 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
16350 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a  st points to. .*
16360 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68  *.** No error ch
16370 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20  ecking is done. 
16380 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72  The rational for
16390 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68   this is that th
163a0 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20  is function .** 
163b0 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76  may be called ev
163c0 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64  en if the file d
163d0 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72  oes not exist or
163e0 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65   contain a heade
163f0 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20  r. In .** these 
16400 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52  cases sqlite3OsR
16410 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72  ead() will retur
16420 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77  n an error, to w
16430 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74  hich the correct
16440 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73   .** response is
16450 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d   to zero the mem
16460 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64  ory at pDest and
16470 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65   continue.  A re
16480 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  al IO error .** 
16490 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20  will presumably 
164a0 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63  recur and be pic
164b0 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f  ked up later (To
164c0 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20  do: Think about 
164d0 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71  this)..*/.int sq
164e0 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69  lite3PagerReadFi
164f0 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a  leheader(Pager *
16500 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75  pPager, int N, u
16510 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44  nsigned char *pD
16520 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  est){.  int rc =
16530 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65   SQLITE_OK;.  me
16540 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
16550 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d 44  );.  assert(MEMD
16560 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  B||pPager->fd->p
16570 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
16580 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
16590 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  ( pPager->fd->pM
165a0 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f  ethods ){.    IO
165b0 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25 70  TRACE(("DBHDR %p
165c0 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72   0 %d\n", pPager
165d0 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20 73  , N)).    rc = s
165e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
165f0 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
16600 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  N, 0);.    if( r
16610 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c==SQLITE_IOERR_
16620 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
16630 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
16640 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  OK;.    }.  }.  
16650 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16660 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74  .** Return the t
16670 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70  otal number of p
16680 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b  ages in the disk
16690 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64   file associated
166a0 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e   with.** pPager.
166b0 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50   .**.** If the P
166c0 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73  ENDING_BYTE lies
166d0 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69 72   on the page dir
166e0 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65 20  ectly after the 
166f0 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  end of the.** fi
16700 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65  le, then conside
16710 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72 74  r this page part
16720 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f   of the file too
16730 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69  . For example, i
16740 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54  f.** PENDING_BYT
16750 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20 28  E is byte 4096 (
16760 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20 6f  the first byte o
16770 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74 68  f page 5) and th
16780 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
16790 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62 79   file is 4096 by
167a0 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e  tes, 5 is return
167b0 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e  ed instead of 4.
167c0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
167d0 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61  agerPagecount(Pa
167e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
167f0 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74  i64 n = 0;.  int
16800 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20 70   rc;.  assert( p
16810 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
16820 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
16830 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
16840 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  -1;.  }.  if( pP
16850 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
16860 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67 65  ){.    n = pPage
16870 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20 65  r->dbSize;.  } e
16880 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72 74  lse {.    assert
16890 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
168a0 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74  thods||pPager->t
168b0 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69 66  empFile);.    if
168c0 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( (pPager->fd->p
168d0 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26 26  Methods).     &&
168e0 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
168f0 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d  FileSize(pPager-
16900 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49 54  >fd, &n))!=SQLIT
16910 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
16920 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
16930 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
16940 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
16950 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
16960 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  -;.      return 
16970 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  -1;.    }.    if
16980 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67 65  ( n>0 && n<pPage
16990 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
169a0 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20 20       n = 1;.    
169b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20 2f  }else{.      n /
169c0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
169d0 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ze;.    }.    if
169e0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
169f0 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
16a00 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64  .      pPager->d
16a10 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20 7d  bSize = n;.    }
16a20 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28 50  .  }.  if( n==(P
16a30 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
16a40 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29 7b  er->pageSize) ){
16a50 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
16a60 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d 78  if( n>pPager->mx
16a70 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67  Pgno ){.    pPag
16a80 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b 0a  er->mxPgno = n;.
16a90 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a    }.  return n;.
16aa0 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  }...#ifndef SQLI
16ab0 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42  TE_OMIT_MEMORYDB
16ac0 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 50  ./*.** Clear a P
16ad0 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a  gHistory block.*
16ae0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6c  /.static void cl
16af0 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69 73  earHistory(PgHis
16b00 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20 20  tory *pHist){.  
16b10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69  sqlite3_free(pHi
16b20 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73 71  st->pOrig);.  sq
16b30 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74  lite3_free(pHist
16b40 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73  ->pStmt);.  pHis
16b50 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20  t->pOrig = 0;.  
16b60 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
16b70 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
16b80 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78  e clearHistory(x
16b90 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
16ba0 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74  Forward declarat
16bb0 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ion.*/.static in
16bc0 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
16bd0 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e  ger*);../*.** Un
16be0 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
16bf0 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c  s hash chain. Al
16c00 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20  so set the page 
16c10 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69  number to 0 to i
16c20 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20  ndicate.** that 
16c30 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
16c40 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
16c50 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20   chain. This is 
16c60 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65  required because
16c70 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50   the.** sqlite3P
16c80 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20 72  agerMovepage() r
16c90 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
16ca0 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
16cb0 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
16cc0 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
16cd0 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
16ce0 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
16cf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
16d00 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
16d10 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
16d20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
16d30 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
16d40 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
16d50 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
16d60 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
16d70 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  sh==0 );.    ret
16d80 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
16d90 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
16da0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
16db0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
16dc0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
16dd0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
16de0 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
16df0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16e00 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e 6f  >aHash[pPg->pgno
16e10 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
16e20 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  h-1)]!=pPg );.  
16e30 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
16e40 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
16e50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
16e60 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
16e70 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28   = pPg->pgno & (
16e80 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29  pPager->nHash-1)
16e90 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
16ea0 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e  ash[h] = pPg->pN
16eb0 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  extHash;.  }.  i
16ec0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
16ed0 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47 48  clearHistory(PGH
16ee0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
16ef0 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20  pPager));.  }.  
16f00 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20  pPg->pgno = 0;. 
16f10 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
16f20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
16f30 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55   = 0;.}../*.** U
16f40 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f  nlink a page fro
16f50 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
16f60 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c  (the list of all
16f70 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52 65   pages where nRe
16f80 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f  f==0).** and fro
16f90 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69  m its hash colli
16fa0 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73  sion chain..*/.s
16fb0 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e  tatic void unlin
16fc0 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50 67  kPage(PgHdr *pPg
16fd0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
16fe0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
16ff0 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
17000 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c 69  rom free page li
17010 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74 52  st */.  lruListR
17020 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20 2f  emove(pPg);..  /
17030 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74 68  * Unlink from th
17040 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62 6c  e pgno hash tabl
17050 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  e */.  unlinkHas
17060 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
17070 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  Pg);.}../*.** Th
17080 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
17090 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74  ed to truncate t
170a0 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61 20  he cache when a 
170b0 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20 74  database.** is t
170c0 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70 20  runcated.  Drop 
170d0 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20 61  from the cache a
170e0 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20 70  ll pages whose p
170f0 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65 72  gno is.** larger
17100 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
17110 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
17120 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a 20  ferenced..**.** 
17130 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
17140 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
17150 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
17160 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 63  zeroed..**.** Ac
17170 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20 70  tually, at the p
17180 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e  oint this routin
17190 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74 20  e is called, it 
171a0 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20 65  would be.** an e
171b0 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20 72  rror to have a r
171c0 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e 20  eferenced page. 
171d0 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61 6e   But rather than
171e0 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74 20   delete.** that 
171f0 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e 74  page and guarant
17200 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74 20  ee a subsequent 
17210 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65 65  segfault, it see
17220 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f 20  ms better.** to 
17230 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70 65  zero it and hope
17240 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20 6f   that we error o
17250 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73 74  ut sanely..*/.st
17260 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
17270 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
17280 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17290 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50   PgHdr *pPg;.  P
172a0 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69  gHdr **ppPg;.  i
172b0 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67  nt dbSize = pPag
172c0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70  er->dbSize;..  p
172d0 61 67 65 72 4d 75 74 65 78 48 65 6c 64 28 70 50  agerMutexHeld(pP
172e0 61 67 65 72 29 3b 0a 20 20 70 70 50 67 20 3d 20  ager);.  ppPg = 
172f0 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20  &pPager->pAll;. 
17300 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a   while( (pPg = *
17310 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20  ppPg)!=0 ){.    
17320 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64  if( pPg->pgno<=d
17330 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  bSize ){.      p
17340 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78  pPg = &pPg->pNex
17350 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20  tAll;.    }else 
17360 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  if( pPg->nRef>0 
17370 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
17380 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
17390 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
173a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
173b0 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
173c0 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
173d0 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20  {.      *ppPg = 
173e0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
173f0 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
17400 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c 20  GFREE %p %d\n", 
17410 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
17420 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52  o));.      PAGER
17430 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61  _INCR(sqlite3_pa
17440 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
17450 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  );.      unlinkP
17460 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
17470 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
17480 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
17490 65 65 28 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a  ee(pPg->pData);.
174a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
174b0 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
174c0 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
174d0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
174e0 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69 6e  ** Try to obtain
174f0 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c   a lock on a fil
17500 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20 62  e.  Invoke the b
17510 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66 20  usy callback if 
17520 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63  the lock.** is c
17530 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61  urrently not ava
17540 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74 20  ilable.  Repeat 
17550 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20 63  until the busy c
17560 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a  allback returns.
17570 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69  ** false or unti
17580 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65  l the lock succe
17590 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  eds..**.** Retur
175a0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73  n SQLITE_OK on s
175b0 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72  uccess and an er
175c0 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 63  ror code if we c
175d0 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20  annot obtain.** 
175e0 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61  the lock..*/.sta
175f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61  tic int pager_wa
17600 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72  it_on_lock(Pager
17610 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f   *pPager, int lo
17620 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72  cktype){.  int r
17630 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53 20  c;..  /* The OS 
17640 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73 74  lock values must
17650 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73 20   be the same as 
17660 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20 76  the Pager lock v
17670 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65 72  alues */.  asser
17680 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d  t( PAGER_SHARED=
17690 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
176a0 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
176b0 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56  RESERVED==RESERV
176c0 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73  ED_LOCK );.  ass
176d0 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55  ert( PAGER_EXCLU
176e0 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f  SIVE==EXCLUSIVE_
176f0 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49 66  LOCK );..  /* If
17700 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75 72   the file is cur
17710 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64 20  rently unlocked 
17720 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d 75  then the size mu
17730 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a 2f  st be unknown */
17740 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
17750 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
17760 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65 72  SHARED || pPager
17770 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d 45  ->dbSize<0 || ME
17780 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70 50  MDB );..  if( pP
17790 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63  ager->state>=loc
177a0 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20  ktype ){.    rc 
177b0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
177c0 65 6c 73 65 7b 0a 20 20 20 20 69 66 28 20 70 50  else{.    if( pP
177d0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
177e0 65 72 20 29 20 70 50 61 67 65 72 2d 3e 70 42 75  er ) pPager->pBu
177f0 73 79 48 61 6e 64 6c 65 72 2d 3e 6e 42 75 73 79  syHandler->nBusy
17800 20 3d 20 30 3b 0a 20 20 20 20 64 6f 20 7b 0a 20   = 0;.    do {. 
17810 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
17820 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e  3OsLock(pPager->
17830 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a 20  fd, locktype);. 
17840 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d 53     }while( rc==S
17850 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73 71  QLITE_BUSY && sq
17860 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79 48  lite3InvokeBusyH
17870 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e 70  andler(pPager->p
17880 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b 0a  BusyHandler) );.
17890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
178a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
178b0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
178c0 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20 49  ocktype;.      I
178d0 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25 70  OTRACE(("LOCK %p
178e0 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20   %d\n", pPager, 
178f0 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20 7d  locktype)).    }
17900 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
17910 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  ;.}../*.** Trunc
17920 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
17930 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
17940 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
17950 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
17960 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65 72  erTruncate(Pager
17970 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
17980 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
17990 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
179a0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
179b0 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42 20  SHARED || MEMDB 
179c0 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65  );.  sqlite3Page
179d0 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  rPagecount(pPage
179e0 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
179f0 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20  ->errCode ){.   
17a00 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72   rc = pPager->er
17a10 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  rCode;.    retur
17a20 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
17a30 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64  nPage>=(unsigned
17a40 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20  )pPager->dbSize 
17a50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
17a60 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
17a70 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17a80 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
17a90 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67 65   nPage;.    page
17aa0 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
17ab0 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
17ac0 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
17ad0 3b 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  ;.    pagerLeave
17ae0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
17af0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
17b00 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65 72    }.  pagerEnter
17b10 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
17b20 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
17b30 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
17b40 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
17b50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
17b60 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
17b70 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20  ;.  }..  /* Get 
17b80 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f 63  an exclusive loc
17b90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
17ba0 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61 74  e before truncat
17bb0 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72 45  ing. */.  pagerE
17bc0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
17bd0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
17be0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
17bf0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
17c00 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
17c10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
17c20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
17c30 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
17c40 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
17c50 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
17c60 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
17c70 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
17c80 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
17c90 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
17ca0 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
17cb0 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
17cc0 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
17cd0 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
17ce0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
17cf0 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
17d00 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
17d10 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
17d20 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
17d30 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
17d40 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
17d50 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
17d60 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
17d70 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
17d80 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
17d90 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
17da0 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
17db0 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
17dc0 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
17dd0 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a   coredump..**.**
17de0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
17df0 6c 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20  lways succeeds. 
17e00 49 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  If a transaction
17e10 20 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74   is active an at
17e20 74 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65  tempt.** is made
17e30 20 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b   to roll it back
17e40 2e 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  . If an error oc
17e50 63 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20  curs during the 
17e60 72 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68  rollback .** a h
17e70 6f 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62  ot journal may b
17e80 65 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69  e left in the fi
17e90 6c 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20  lesystem but no 
17ea0 65 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65  error is returne
17eb0 64 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c  d.** to the call
17ec0 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
17ed0 65 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67  e3PagerClose(Pag
17ee0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70  er *pPager){.  p
17ef0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
17f00 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
17f10 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 61 67 65  Code = 0;.  page
17f20 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
17f30 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
17f40 61 67 65 72 29 3b 0a 23 69 66 64 65 66 20 53 51  ager);.#ifdef SQ
17f50 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
17f60 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
17f70 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 23 69  if( !MEMDB ){.#i
17f80 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54  fndef SQLITE_MUT
17f90 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73 71 6c 69  EX_NOOP.    sqli
17fa0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
17fb0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78   = sqlite3_mutex
17fc0 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55  _alloc(SQLITE_MU
17fd0 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29  TEX_STATIC_MEM2)
17fe0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
17ff0 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
18000 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 69 66 28  (mutex);.    if(
18010 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 20 29   pPager->pPrev )
18020 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
18030 70 50 72 65 76 2d 3e 70 4e 65 78 74 20 3d 20 70  pPrev->pNext = p
18040 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
18050 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
18060 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
18070 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b  = pPager->pNext;
18080 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
18090 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 29 7b 0a  Pager->pNext ){.
180a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4e        pPager->pN
180b0 65 78 74 2d 3e 70 50 72 65 76 20 3d 20 70 50 61  ext->pPrev = pPa
180c0 67 65 72 2d 3e 70 50 72 65 76 3b 0a 20 20 20 20  ger->pPrev;.    
180d0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  }.    sqlite3_mu
180e0 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
180f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 6e  ;.    pPager->on
18100 50 61 67 65 72 4c 69 73 74 20 3d 20 30 3b 0a 20  PagerList = 0;. 
18110 20 7d 0a 23 65 6e 64 69 66 0a 20 20 64 69 73 61   }.#endif.  disa
18120 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
18130 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
18140 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65  ite3FaultBeginBe
18150 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 70 50 61 67  nign(-1);.  pPag
18160 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
18170 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 55 6e  e = 0;.  pagerUn
18180 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28  lockAndRollback(
18190 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c  pPager);.  enabl
181a0 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
181b0 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74  rrors();.  sqlit
181c0 65 33 46 61 75 6c 74 45 6e 64 42 65 6e 69 67 6e  e3FaultEndBenign
181d0 28 2d 31 29 3b 0a 20 20 50 41 47 45 52 54 52 41  (-1);.  PAGERTRA
181e0 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
181f0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18200 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
18210 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
18220 67 65 72 29 29 0a 20 20 69 66 28 20 70 50 61 67  ger)).  if( pPag
18230 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18240 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
18250 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
18260 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
18270 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
18280 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
18290 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
182a0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
182b0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
182c0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
182d0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
182e0 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
182f0 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
18300 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
18310 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
18320 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
18330 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
18340 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
18350 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
18360 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
18370 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
18380 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
18390 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
183a0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
183b0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
183c0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
183d0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
183e0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
183f0 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
18400 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
18410 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
18420 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
18430 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
18440 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
18450 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
18460 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
18470 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
18480 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
18490 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
184a0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
184b0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
184c0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
184d0 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
184e0 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
184f0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
18500 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
18510 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
18520 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
18530 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
18540 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
18550 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
18560 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
18570 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
18580 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
18590 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
185a0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
185b0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
185c0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
185d0 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
185e0 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
185f0 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
18600 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
18610 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
18620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
18630 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
18640 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
18650 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
18660 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
18670 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
18680 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
18690 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c  ove it. */.    l
186a0 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
186b0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
186c0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
186d0 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d    pPg->nRef++;.}
186e0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
186f0 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
18700 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
18710 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
18720 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
18730 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
18740 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
18750 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
18760 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  f++;.    }.  }.#
18770 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
18780 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
18790 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
187a0 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
187b0 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
187c0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
187d0 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
187e0 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
187f0 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
18800 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
18810 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
18820 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
18830 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
18840 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
18850 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
18860 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f  pPager);.  page_
18870 72 65 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ref(pPg);.  page
18880 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67  rLeave(pPg->pPag
18890 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
188a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
188b0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
188c0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
188d0 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
188e0 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
188f0 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
18900 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
18910 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
18920 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
18930 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
18940 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
18950 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
18960 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
18970 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
18980 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
18990 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
189a0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
189b0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
189c0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
189d0 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
189e0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
189f0 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
18a00 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
18a10 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
18a20 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
18a30 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
18a40 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
18a50 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
18a60 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
18a70 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
18a80 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
18a90 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
18aa0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
18ab0 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
18ac0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18ad0 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
18ae0 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
18af0 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
18b00 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
18b10 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
18b20 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
18b30 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
18b40 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
18b50 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
18b60 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
18b70 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
18b80 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
18b90 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
18ba0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
18bb0 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
18bc0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
18bd0 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
18be0 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
18bf0 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
18c00 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
18c10 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
18c20 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
18c30 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63  e, so no sync oc
18c40 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  curs..**.** If t
18c50 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
18c60 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20  IAL flag is set 
18c70 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
18c80 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63  nt media on whic
18c90 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
18ca0 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65  e is stored, the
18cb0 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  n OsSync() is ne
18cc0 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  ver called on th
18cd0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
18ce0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
18cf0 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
18d00 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74  ired is to updat
18d10 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
18d20 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   in.** the journ
18d30 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  al header..**.**
18d40 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
18d50 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
18d60 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
18d70 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
18d80 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
18d90 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
18da0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
18db0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
18dc0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
18dd0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
18de0 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
18df0 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
18e00 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
18e10 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
18e20 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
18e30 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
18e40 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
18e50 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
18e60 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
18e70 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
18e80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18e90 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
18ea0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
18eb0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
18ec0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
18ed0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
18ee0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
18ef0 6e 20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  n );..      if( 
18f00 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
18f10 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
18f20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  ) ){.        /* 
18f30 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76  Write the nRec v
18f40 61 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  alue into the jo
18f50 75 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65  urnal file heade
18f60 72 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20  r. If in.       
18f70 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f   ** full-synchro
18f80 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20  nous mode, sync 
18f90 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73  the journal firs
18fa0 74 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20  t. This ensures 
18fb0 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
18fc0 61 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61  all data has rea
18fd0 6c 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b  lly hit the disk
18fe0 20 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20   before nRec is 
18ff0 75 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a  updated to mark.
19000 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73          ** it as
19010 20 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72   a candidate for
19020 20 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20   rollback..     
19030 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
19040 20 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71   This is not req
19050 75 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72  uired if the per
19060 73 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75  sistent media su
19070 70 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20  pports the.     
19080 20 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e     ** SAFE_APPEN
19090 44 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61  D property. Beca
190a0 75 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65  use in this case
190b0 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69   it is not possi
190c0 62 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20  ble .        ** 
190d0 66 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61  for garbage data
190e0 20 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20   to be appended 
190f0 74 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65  to the file, the
19100 20 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20   nRec field.    
19110 20 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61      ** is popula
19120 74 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46  ted with 0xFFFFF
19130 46 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75  FFF when the jou
19140 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77  rnal header is w
19150 72 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a  ritten.        *
19160 2a 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64  * and never need
19170 73 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e  s to be updated.
19180 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
19190 20 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b      i64 jrnlOff;
191a0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
191b0 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26  ger->fullSync &&
191c0 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f   0==(iDc&SQLITE_
191d0 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c  IOCAP_SEQUENTIAL
191e0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
191f0 41 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43  AGERTRACE2("SYNC
19200 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
19210 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19220 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49  r));.          I
19230 4f 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25  OTRACE(("JSYNC %
19240 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
19250 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
19260 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
19270 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
19280 3e 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20  >sync_flags);.  
19290 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
192a0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
192b0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
192c0 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67    jrnlOff = pPag
192d0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
192e0 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
192f0 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20  Magic);.        
19300 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25  IOTRACE(("JHDR %
19310 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50  p %lld %d\n", pP
19320 61 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34  ager, jrnlOff, 4
19330 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ));.        rc =
19340 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61   write32bits(pPa
19350 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
19360 66 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29  f, pPager->nRec)
19370 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
19380 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
19390 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
193a0 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
193b0 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
193c0 20 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45   ){.        PAGE
193d0 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
193e0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
193f0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19400 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43  ;.        IOTRAC
19410 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c  E(("JSYNC %p\n",
19420 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20   pPager)).      
19430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
19440 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64  Sync(pPager->jfd
19450 2c 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66  , pPager->sync_f
19460 6c 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20  lags| .         
19470 20 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66   (pPager->sync_f
19480 6c 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e  lags==SQLITE_SYN
19490 43 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59  C_FULL?SQLITE_SY
194a0 4e 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20  NC_DATAONLY:0). 
194b0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
194c0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
194d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
194e0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
194f0 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
19500 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  1;.    }.    pPa
19510 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
19520 30 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65  0;..    /* Erase
19530 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c   the needSync fl
19540 61 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61  ag from every pa
19550 67 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  ge..    */.    f
19560 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
19570 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
19580 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
19590 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
195a0 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
195b0 20 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74   lruListSetFirst
195c0 53 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a  Synced(pPager);.
195d0 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
195e0 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
195f0 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
19600 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
19610 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
19620 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
19630 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
19640 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
19650 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
19660 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
19670 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
19680 20 20 65 6c 73 65 7b 0a 20 20 20 20 70 61 67 65    else{.    page
19690 72 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65  rMutexHeld(pPage
196a0 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  r);.    for(pPg=
196b0 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
196c0 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
196d0 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73 73  tAll){.      ass
196e0 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
196f0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a 20  nc==0 );.    }. 
19700 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
19710 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
19720 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75  ced==pPager->lru
19730 2e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23  .pFirst );.  }.#
19740 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
19750 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65 72  rc;.}../*.** Mer
19760 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66 20  ge two lists of 
19770 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64 20  pages connected 
19780 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69 6e  by pDirty and in
19790 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a 20   pgno order..** 
197a0 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78 69  Do not both fixi
197b0 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72 74  ng the pPrevDirt
197c0 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a 73  y pointers..*/.s
197d0 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65 72  tatic PgHdr *mer
197e0 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64  ge_pagelist(PgHd
197f0 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70 42  r *pA, PgHdr *pB
19800 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75 6c  ){.  PgHdr resul
19810 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54 61  t, *pTail;.  pTa
19820 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20 20  il = &result;.  
19830 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42 20  while( pA && pB 
19840 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  ){.    if( pA->p
19850 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b 0a  gno<pB->pgno ){.
19860 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
19870 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20 20  rty = pA;.      
19880 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20 20  pTail = pA;.    
19890 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72 74    pA = pA->pDirt
198a0 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
198b0 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72 74      pTail->pDirt
198c0 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70 54  y = pB;.      pT
198d0 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  ail = pB;.      
198e0 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79 3b  pB = pB->pDirty;
198f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
19900 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69 6c   pA ){.    pTail
19910 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20  ->pDirty = pA;. 
19920 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29 7b   }else if( pB ){
19930 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72  .    pTail->pDir
19940 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73 65  ty = pB;.  }else
19950 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
19960 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  rty = 0;.  }.  r
19970 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44 69  eturn result.pDi
19980 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 6f  rty;.}../*.** So
19990 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70  rt the list of p
199a0 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69 6e  ages in accendin
199b0 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f 2e  g order by pgno.
199c0 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20 63    Pages are.** c
199d0 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69 72  onnected by pDir
199e0 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54 68  ty pointers.  Th
199f0 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f 69  e pPrevDirty poi
19a00 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f 72  nters are.** cor
19a10 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20 73  rupted by this s
19a20 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ort..*/.#define 
19a30 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
19a40 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20 4e  LOC 25.#define N
19a50 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20 20  _SORT_BUCKET    
19a60 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51 4c     25.#ifdef SQL
19a70 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20 73  ITE_TEST.  int s
19a80 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
19a90 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b 0a  ort_bucket = 0;.
19aa0 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54 5f    #undef N_SORT_
19ab0 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e 65  BUCKET.  #define
19ac0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 5c   N_SORT_BUCKET \
19ad0 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61 67  .   (sqlite3_pag
19ae0 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74  er_n_sort_bucket
19af0 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e  ?sqlite3_pager_n
19b00 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f 53  _sort_bucket:N_S
19b10 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
19b20 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20  ).#endif.static 
19b30 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67 65  PgHdr *sort_page
19b40 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e 29  list(PgHdr *pIn)
19b50 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f 53  {.  PgHdr *a[N_S
19b60 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f 43  ORT_BUCKET_ALLOC
19b70 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b 0a  ], *p;.  int i;.
19b80 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 73    memset(a, 0, s
19b90 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68 69  izeof(a));.  whi
19ba0 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20 70  le( pIn ){.    p
19bb0 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e 20   = pIn;.    pIn 
19bc0 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  = p->pDirty;.   
19bd0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a   p->pDirty = 0;.
19be0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e      for(i=0; i<N
19bf0 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b 20  _SORT_BUCKET-1; 
19c00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
19c10 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  a[i]==0 ){.     
19c20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20 20     a[i] = p;.   
19c30 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
19c40 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
19c50 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c   p = merge_pagel
19c60 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20  ist(a[i], p);.  
19c70 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b 0a        a[i] = 0;.
19c80 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19c90 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54 5f    if( i==N_SORT_
19ca0 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20 20  BUCKET-1 ){.    
19cb0 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20 54    /* Coverage: T
19cc0 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65 72  o get here, ther
19cd0 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e 28  e need to be 2^(
19ce0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20 0a  N_SORT_BUCKET) .
19cf0 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e 74        ** element
19d00 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20 6c  s in the input l
19d10 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f 73  ist. This is pos
19d20 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72 61  sible, but impra
19d30 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a 2a  ctical..      **
19d40 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c 69   Testing this li
19d50 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74 20  ne is the point 
19d60 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62  of global variab
19d70 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  le.      ** sqli
19d80 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72 74  te3_pager_n_sort
19d90 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20 2a  _bucket..      *
19da0 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 6d  /.      a[i] = m
19db0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61 5b  erge_pagelist(a[
19dc0 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20 20  i], p);.    }.  
19dd0 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20 20  }.  p = a[0];.  
19de0 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f 52  for(i=1; i<N_SOR
19df0 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b 0a  T_BUCKET; i++){.
19e00 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
19e10 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29 3b  gelist(p, a[i]);
19e20 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
19e30 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20  .}../*.** Given 
19e40 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  a list of pages 
19e50 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68  (connected by th
19e60 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70  e PgHdr.pDirty p
19e70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a  ointer) write.**
19e80 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68   every one of th
19e90 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f  ose pages out to
19ea0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
19eb0 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d  le and mark them
19ec0 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e   all.** as clean
19ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19ee0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
19ef0 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73  list(PgHdr *pLis
19f00 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  t){.  Pager *pPa
19f10 67 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70 3b  ger;.  PgHdr *p;
19f20 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66  .  int rc;..  if
19f30 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
19f40 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19f50 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d   pPager = pList-
19f60 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41  >pPager;..  /* A
19f70 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65  t this point the
19f80 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65 72  re may be either
19f90 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45   a RESERVED or E
19fa0 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
19fb0 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61   the.  ** databa
19fc0 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72  se file. If ther
19fd0 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20  e is already an 
19fe0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20  EXCLUSIVE lock, 
19ff0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20  the following.  
1a000 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  ** calls to sqli
1a010 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20  te3OsLock() are 
1a020 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a  no-ops..  **.  *
1a030 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63  * Moving the loc
1a040 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20  k from RESERVED 
1a050 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63 74  to EXCLUSIVE act
1a060 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67  ually involves g
1a070 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67  oing.  ** throug
1a080 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74  h an intermediat
1a090 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e  e state PENDING.
1a0a0 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63     A PENDING loc
1a0b0 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20  k prevents new. 
1a0c0 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d   ** readers from
1a0d0 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68   attaching to th
1a0e0 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20 69  e database but i
1a0f0 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66  s unsufficient f
1a100 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72  or us to.  ** wr
1a110 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f  ite.  The idea o
1a120 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b  f a PENDING lock
1a130 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e   is to prevent n
1a140 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a  ew readers from.
1a150 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77    ** coming in w
1a160 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72  hile we wait for
1a170 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65 72   existing reader
1a180 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a  s to clear..  **
1a190 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20  .  ** While the 
1a1a0 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65 20  pager is in the 
1a1b0 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
1a1c0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1a1d0 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20  abase file.  ** 
1a1e0 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64  is unchanged and
1a1f0 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b   we can rollback
1a200 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20   without having 
1a210 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a  to playback the.
1a220 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74    ** journal int
1a230 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  o the original d
1a240 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f  atabase file.  O
1a250 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f  nce we transitio
1a260 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53  n to.  ** EXCLUS
1a270 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  IVE, it means th
1a280 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a290 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64  has been changed
1a2a0 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63   and any rollbac
1a2b0 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75  k.  ** will requ
1a2c0 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c  ire a journal pl
1a2d0 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72  ayback..  */.  r
1a2e0 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  c = pager_wait_o
1a2f0 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45  n_lock(pPager, E
1a300 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a  XCLUSIVE_LOCK);.
1a310 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a320 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1a330 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69  n rc;.  }..  pLi
1a340 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c 69  st = sort_pageli
1a350 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f 72  st(pList);.  for
1a360 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d 70  (p=pList; p; p=p
1a370 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20 61  ->pDirty){.    a
1a380 73 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79 20  ssert( p->dirty 
1a390 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79 20  );.    p->dirty 
1a3a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  = 0;.  }.  while
1a3b0 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20 20  ( pList ){..    
1a3c0 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 68  /* If the file h
1a3d0 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  as not yet been 
1a3e0 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74 20  opened, open it 
1a3f0 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20  now. */.    if( 
1a400 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  !pPager->fd->pMe
1a410 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20 61  thods ){.      a
1a420 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74 65  ssert(pPager->te
1a430 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72  mpFile);.      r
1a440 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1a450 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72 2d  Opentemp(pPager-
1a460 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 66  >pVfs, pPager->f
1a470 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  d, pPager->zFile
1a480 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  name,.          
1a490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a4a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66        pPager->vf
1a4b0 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 69  sFlags);.      i
1a4c0 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
1a4d0 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
1a4e0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
1a4f0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
1a500 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
1a510 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
1a520 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
1a530 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
1a540 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
1a550 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
1a560 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
1a570 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
1a580 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
1a590 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
1a5a0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
1a5b0 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
1a5c0 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
1a5d0 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
1a5e0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
1a5f0 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
1a600 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
1a610 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20     i64 offset = 
1a620 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a  (pList->pgno-1)*
1a630 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
1a640 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68 61  eSize;.      cha
1a650 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45 43  r *pData = CODEC
1a660 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  2(pPager, PGHDR_
1a670 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
1a680 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
1a690 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
1a6a0 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61 67  E4("STORE %d pag
1a6b0 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c  e %d hash(%08x)\
1a6c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1a6d0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1a6e0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
1a6f0 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1a700 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20 20  ash(pList));.   
1a710 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47 4f     IOTRACE(("PGO
1a720 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  UT %p %d\n", pPa
1a730 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  ger, pList->pgno
1a740 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
1a750 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1a760 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c  ager->fd, pData,
1a770 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1a780 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
1a790 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1a7a0 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
1a7b0 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20  db_count);.     
1a7c0 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1a7d0 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20 20  er->nWrite);.   
1a7e0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
1a7f0 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20  no==1 ){.       
1a800 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
1a810 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70 44  >dbFileVers, &pD
1a820 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66 28  ata[24], sizeof(
1a830 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65  pPager->dbFileVe
1a840 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rs));.      }.  
1a850 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
1a860 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
1a870 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22     PAGERTRACE3("
1a880 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  NOSTORE %d page 
1a890 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a8a0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
1a8b0 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  gno);.    }.#end
1a8c0 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  if.    if( rc ) 
1a8d0 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64 65  return rc;.#ifde
1a8e0 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
1a8f0 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
1a900 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
1a910 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
1a920 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
1a930 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
1a940 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
1a950 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
1a960 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
1a970 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
1a980 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
1a990 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
1a9a0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
1a9b0 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
1a9c0 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
1a9d0 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
1a9e0 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
1a9f0 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
1aa00 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
1aa10 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
1aa20 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
1aa30 50 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64 65 66  Pager){..#ifndef
1aa40 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56 65 72   NDEBUG.  /* Ver
1aa50 69 66 79 20 74 68 65 20 73 61 6e 69 74 79 20 6f  ify the sanity o
1aa60 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73 74  f the dirty list
1aa70 20 77 68 65 6e 20 77 65 20 61 72 65 20 72 75 6e   when we are run
1aa80 6e 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64 65 62  ning.  ** in deb
1aa90 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 54 68  ugging mode.  Th
1aaa0 69 73 20 69 73 20 65 78 70 65 6e 73 69 76 65 2c  is is expensive,
1aab0 20 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a 20   so do not.  ** 
1aac0 64 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e 6f 72  do this on a nor
1aad0 6d 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a 20 20  mal build. */.  
1aae0 69 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20 69 6e  int n1 = 0;.  in
1aaf0 74 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67 48 64  t n2 = 0;.  PgHd
1ab00 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70 50  r *p;.  for(p=pP
1ab10 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
1ab20 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 20 69  =p->pNextAll){ i
1ab30 66 28 20 70 2d 3e 64 69 72 74 79 20 29 20 6e 31  f( p->dirty ) n1
1ab40 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d 70 50  ++; }.  for(p=pP
1ab50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 20 70 3b  ager->pDirty; p;
1ab60 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 20 6e   p=p->pDirty){ n
1ab70 32 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72 74 28  2++; }.  assert(
1ab80 20 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64 69   n1==n2 );.#endi
1ab90 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  f..  return pPag
1aba0 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  er->pDirty;.}../
1abb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 69 66  *.** Return 1 if
1abc0 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74 20   there is a hot 
1abd0 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20 67  journal on the g
1abe0 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 41  iven pager..** A
1abf0 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20   hot journal is 
1ac00 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  one that needs t
1ac10 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
1ac20 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
1ac30 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74  urrent size of t
1ac40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1ac50 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75 72   is 0 but a jour
1ac60 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69 73  nal file.** exis
1ac70 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f 62  ts, that is prob
1ac80 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  ably an old jour
1ac90 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66 72  nal left over fr
1aca0 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64 61  om a prior.** da
1acb0 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65 20  tabase with the 
1acc0 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73 74  same name.  Just
1acd0 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1ace0 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  nal..**.** Retur
1acf0 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20 75 6e  n negative if un
1ad00 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d 69 6e  able to determin
1ad10 65 20 74 68 65 20 73 74 61 74 75 73 20 6f 66 20  e the status of 
1ad20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1ad30 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
1ad40 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20 74 68  does not open th
1ad50 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1ad60 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a 2a 2a  o examine its.**
1ad70 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e 63 65   content.  Hence
1ad80 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 69  , the journal mi
1ad90 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68 65 20  ght contain the 
1ada0 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
1adb0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1adc0 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20 64   that has been d
1add0 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65 6e 63  eleted, and henc
1ade0 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20 20 4f  e not be hot.  O
1adf0 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65 72 20  r.** the header 
1ae00 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  of the journal m
1ae10 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64 20 6f  ight be zeroed o
1ae20 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ut.  This routin
1ae30 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 64 69  e.** does not di
1ae40 73 63 6f 76 65 72 20 74 68 65 73 65 20 63 61 73  scover these cas
1ae50 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f 74 20  es of a non-hot 
1ae60 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74 68 65  journal - if the
1ae70 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1ae80 20 65 78 69 73 74 73 20 61 6e 64 20 69 73 20 6e   exists and is n
1ae90 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20 72 6f  ot empty this ro
1aea0 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20 69 74  utine assumes it
1aeb0 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54 68 65  .** is hot.  The
1aec0 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
1aed0 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20 64  ) routine will d
1aee0 69 73 63 6f 76 65 72 20 74 68 61 74 20 74 68 65  iscover that the
1aef0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
1af00 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79 20 68   is not really h
1af10 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f 2d 6f  ot and will no-o
1af20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
1af30 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50   hasHotJournal(P
1af40 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1af50 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1af60 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1af70 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  s;.  int rc;.  i
1af80 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  f( !pPager->useJ
1af90 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72 6e 20  ournal ) return 
1afa0 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  0;.  if( !pPager
1afb0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1afc0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20   return 0;.  rc 
1afd0 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73  = sqlite3OsAcces
1afe0 73 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  s(pVfs, pPager->
1aff0 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
1b000 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b  _ACCESS_EXISTS);
1b010 0a 20 20 69 66 28 20 72 63 3c 3d 30 20 29 7b 0a  .  if( rc<=0 ){.
1b020 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b030 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1b040 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
1b050 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20  ock(pPager->fd) 
1b060 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1b070 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1b080 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74  e3PagerPagecount
1b090 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20  (pPager)==0 ){. 
1b0a0 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
1b0b0 74 65 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d  te(pVfs, pPager-
1b0c0 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20  >zJournal, 0);. 
1b0d0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1b0e0 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1b0f0 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
1b100 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
1b110 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
1b120 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
1b130 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
1b140 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
1b150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1b160 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
1b170 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
1b180 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
1b190 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
1b1a0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
1b1b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
1b1c0 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
1b1d0 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1b1e0 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64   **ppPg){.  PgHd
1b1f0 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20  r *pPg;.  *ppPg 
1b200 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73  = 0;..  /* It is
1b210 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c   illegal to call
1b220 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75   this function u
1b230 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65 72 20  nless the pager 
1b240 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e  object.  ** poin
1b250 74 65 64 20 74 6f 20 62 79 20 70 50 61 67 65 72  ted to by pPager
1b260 20 68 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e   has at least on
1b270 65 20 66 72 65 65 20 70 61 67 65 20 28 70 61 67  e free page (pag
1b280 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e  e with nRef==0).
1b290 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 21  .  */.  assert(!
1b2a0 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72 74  MEMDB);.  assert
1b2b0 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
1b2c0 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64  rst);..  /* Find
1b2d0 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
1b2e0 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61  le.  Try to loca
1b2f0 74 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64  te a page that d
1b300 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71  oes not.  ** req
1b310 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e  uire us to do an
1b320 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20   fsync() on the 
1b330 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
1b340 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1b350 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a  u.pFirstSynced;.
1b360 0a 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c  .  /* If we coul
1b370 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
1b380 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
1b390 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
1b3a0 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a  ().  ** on the j
1b3b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
1b3c0 20 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e   fsync the journ
1b3d0 61 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  al file.  This i
1b3e0 73 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c  s a.  ** very sl
1b3f0 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f  ow operation, so
1b400 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f   we work hard to
1b410 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20   avoid it.  But 
1b420 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69  sometimes.  ** i
1b430 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65  t can't be helpe
1b440 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  d..  */.  if( pP
1b450 67 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  g==0 && pPager->
1b460 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20 20  lru.pFirst){.   
1b470 20 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74   int iDc = sqlit
1b480 65 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63  e3OsDeviceCharac
1b490 74 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72  teristics(pPager
1b4a0 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72  ->fd);.    int r
1b4b0 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1b4c0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
1b4d0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
1b4e0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1b4f0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1b500 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d  >fullSync && 0==
1b510 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
1b520 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
1b530 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e  {.      /* If in
1b540 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
1b550 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
1b560 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
1b570 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f   the.      ** jo
1b580 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73  urnal file. This
1b590 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69   is done to avoi
1b5a0 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67  d ever modifying
1b5b0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20   a journal.     
1b5c0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
1b5d0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
1b5e0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
1b5f0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20  ages that have. 
1b600 20 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20       ** already 
1b610 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
1b620 74 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e  the database (in
1b630 20 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72   case the header
1b640 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61   is.      ** tra
1b650 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
1b660 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
1b670 74 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  ted)..      */. 
1b680 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65       pPager->nRe
1b690 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  c = 0;.      ass
1b6a0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
1b6b0 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
1b6c0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
1b6d0 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
1b6e0 30 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 );.      rc = 
1b6f0 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
1b700 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1b710 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
1b720 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
1b730 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1b740 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c   pPg = pPager->l
1b750 72 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a  ru.pFirst;.  }..
1b760 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1b770 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20  Ref==0 );..  /* 
1b780 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
1b790 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1b7a0 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
1b7b0 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ty..  */.  if( p
1b7c0 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
1b7d0 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73   int rc;.    ass
1b7e0 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
1b7f0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b  nc==0 );.    mak
1b800 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1b810 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
1b820 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79  .    pPg->pDirty
1b830 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70   = 0;.    rc = p
1b840 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1b850 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
1b860 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
1b870 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1b880 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
1b890 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1b8a0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
1b8b0 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a  g->dirty==0 );..
1b8c0 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1b8d0 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
1b8e0 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
1b8f0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
1b900 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65  hen.  ** set the
1b910 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f   global alwaysRo
1b920 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75  llback flag, thu
1b930 73 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a  s disabling the.
1b940 20 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65    ** sqlite3Page
1b950 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
1b960 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72  optimization for
1b970 20 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69   the rest of thi
1b980 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20  s transaction.. 
1b990 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73   ** It is necess
1b9a0 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62  ary to do this b
1b9b0 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20  ecause the page 
1b9c0 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c  marked alwaysRol
1b9d0 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74  lback.  ** might
1b9e0 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20   be reloaded at 
1b9f0 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74  a later time but
1ba00 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77   at that point w
1ba10 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72  e won't remember
1ba20 0a 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61  .  ** that is wa
1ba30 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
1ba40 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
1ba50 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
1ba60 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65  ges must.  ** be
1ba70 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79   marked as alway
1ba80 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68  sRollback from h
1ba90 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f  ere on out..  */
1baa0 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61  .  if( pPg->alwa
1bab0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20  ysRollback ){.  
1bac0 20 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41    IOTRACE(("ALWA
1bad0 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e  YS_ROLLBACK %p\n
1bae0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
1baf0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
1bb00 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a  llback = 1;.  }.
1bb10 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65  .  /* Unlink the
1bb20 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74   old page from t
1bb30 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64  he free list and
1bb40 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a   the hash table.
1bb50 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67    */.  unlinkPag
1bb60 65 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74  e(pPg);.  assert
1bb70 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
1bb80 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67  ;..  *ppPg = pPg
1bb90 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1bba0 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  E_OK;.}..#ifdef 
1bbb0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1bbc0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a  MORY_MANAGEMENT.
1bbd0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
1bbe0 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ion is called to
1bbf0 20 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75   free superfluou
1bc00 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c  s dynamically al
1bc10 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a  located memory.*
1bc20 2a 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61  * held by the pa
1bc30 67 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f  ger system. Memo
1bc40 72 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79  ry in use by any
1bc50 20 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c   SQLite pager al
1bc60 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68  located.** by th
1bc70 65 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64  e current thread
1bc80 20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f   may be sqlite3_
1bc90 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20  free()ed..**.** 
1bca0 6e 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62  nReq is the numb
1bcb0 65 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  er of bytes of m
1bcc0 65 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20  emory required. 
1bcd0 4f 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68  Once this much h
1bce0 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61  as.** been relea
1bcf0 73 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f  sed, the functio
1bd00 6e 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72  n returns. The r
1bd10 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74  eturn value is t
1bd20 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
1bd30 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20  .** of bytes of 
1bd40 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e  memory released.
1bd50 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
1bd60 61 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72  agerReleaseMemor
1bd70 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69  y(int nReq){.  i
1bd80 6e 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30  nt nReleased = 0
1bd90 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79  ;          /* By
1bda0 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65  tes of memory re
1bdb0 6c 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  leased so far */
1bdc0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
1bdd0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1bde0 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  * For looping ov
1bdf0 65 72 20 70 61 67 65 72 73 20 2a 2f 0a 20 20 42  er pagers */.  B
1be00 75 73 79 48 61 6e 64 6c 65 72 20 2a 73 61 76 65  usyHandler *save
1be10 64 42 75 73 79 3b 20 20 20 20 20 2f 2a 20 53 61  dBusy;     /* Sa
1be20 76 65 64 20 63 6f 70 79 20 6f 66 20 74 68 65 20  ved copy of the 
1be30 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a 2f 0a  busy handler */.
1be40 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1be50 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63 71 75  E_OK;..  /* Acqu
1be60 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79 2d 6d  ire the memory-m
1be70 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65 78 0a  anagement mutex.
1be80 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c    */.#ifndef SQL
1be90 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20  ITE_MUTEX_NOOP. 
1bea0 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a   sqlite3_mutex *
1beb0 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a 20  mutex;       /* 
1bec0 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20 2a  The MEM2 mutex *
1bed0 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69  /.  mutex = sqli
1bee0 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
1bef0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
1bf00 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69  TIC_MEM2);.#endi
1bf10 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
1bf20 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a  x_enter(mutex);.
1bf30 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c  .  /* Signal all
1bf40 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   database connec
1bf50 74 69 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72  tions that memor
1bf60 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e  y management wan
1bf70 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20  ts.  ** to have 
1bf80 61 63 63 65 73 73 20 74 6f 20 74 68 65 20 70 61  access to the pa
1bf90 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72  gers..  */.  for
1bfa0 28 70 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50  (pPager=sqlite3P
1bfb0 61 67 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72  agerList; pPager
1bfc0 3b 20 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d  ; pPager=pPager-
1bfd0 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50  >pNext){.     pP
1bfe0 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d  ager->iInUseMM =
1bff0 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65   1;.  }..  while
1c000 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1c010 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
1c020 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 20 29 7b  eleased<nReq) ){
1c030 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1c040 0a 20 20 20 20 50 67 48 64 72 20 2a 70 52 65 63  .    PgHdr *pRec
1c050 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20  ycled;. .    /* 
1c060 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61  Try to find a pa
1c070 67 65 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68  ge to recycle th
1c080 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75  at does not requ
1c090 69 72 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66  ire a sync(). If
1c0a0 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20  .    ** this is 
1c0b0 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69  not possible, fi
1c0c0 6e 64 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73  nd one that does
1c0d0 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28   require a sync(
1c0e0 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71  )..    */.    sq
1c0f0 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
1c100 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
1c110 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
1c120 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
1c130 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74  .    pPg = sqlit
1c140 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
1c150 69 72 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20  irstSynced;.    
1c160 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 28 70  while( pPg && (p
1c170 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20  Pg->needSync || 
1c180 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e  pPg->pPager->iIn
1c190 55 73 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20  UseDB) ){.      
1c1a0 70 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65  pPg = pPg->gfree
1c1b0 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20  .pNext;.    }.  
1c1c0 20 20 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20    if( !pPg ){.  
1c1d0 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
1c1e0 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
1c1f0 72 73 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  rst;.      while
1c200 28 20 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50  ( pPg && pPg->pP
1c210 61 67 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29  ager->iInUseDB )
1c220 7b 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  {.        pPg = 
1c230 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74  pPg->gfree.pNext
1c240 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1c250 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65      sqlite3_mute
1c260 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f  x_leave(sqlite3_
1c270 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1c280 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1c290 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  LRU));..    /* I
1c2a0 66 20 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74  f pPg==0, then t
1c2b0 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68  he block above h
1c2c0 61 73 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e  as failed to fin
1c2d0 64 20 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20  d a page to.    
1c2e0 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74  ** recycle. In t
1c2f0 68 69 73 20 63 61 73 65 20 72 65 74 75 72 6e 20  his case return 
1c300 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68  early - no furth
1c310 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20  er memory will. 
1c320 20 20 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65     ** be release
1c330 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
1c340 28 20 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a  ( !pPg ) break;.
1c350 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70 50  .    pPager = pP
1c360 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61  g->pPager;.    a
1c370 73 73 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64  ssert(!pPg->need
1c380 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61  Sync || pPg==pPa
1c390 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29  ger->lru.pFirst)
1c3a0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 67  ;.    assert(pPg
1c3b0 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1c3c0 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  g==pPager->lru.p
1c3d0 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20  FirstSynced);.  
1c3e0 0a 20 20 20 20 73 61 76 65 64 42 75 73 79 20 3d  .    savedBusy =
1c3f0 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
1c400 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65  ndler;.    pPage
1c410 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
1c420 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
1c430 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
1c440 65 72 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b  er, &pRecycled);
1c450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75  .    pPager->pBu
1c460 73 79 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65  syHandler = save
1c470 64 42 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72  dBusy;.    asser
1c480 74 28 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67  t(pRecycled==pPg
1c490 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f   || rc!=SQLITE_O
1c4a0 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  K);.    if( rc==
1c4b0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1c4c0 20 20 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e     /* We've foun
1c4d0 64 20 61 20 70 61 67 65 20 74 6f 20 66 72 65 65  d a page to free
1c4e0 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1c4f0 74 68 65 20 70 61 67 65 20 68 61 73 20 62 65 65  the page has bee
1c500 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  n .      ** remo
1c510 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
1c520 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
1c530 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
1c540 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a  ed-list .      *
1c550 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65 64 29  * (pFirstSynced)
1c560 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e  . It is still in
1c570 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28   the all pages (
1c580 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20  pAll) list. .   
1c590 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20     ** Remove it 
1c5a0 66 72 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62  from this list b
1c5b0 65 66 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20  efore freeing.. 
1c5c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
1c5d0 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65   Todo: Check the
1c5e0 20 50 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73   Pager.pStmt lis
1c5f0 74 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  t to make sure t
1c600 68 69 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20  his is Ok. It . 
1c610 20 20 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79       ** probably
1c620 20 69 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20   is though..    
1c630 20 20 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72    */.      PgHdr
1c640 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73   *pTmp;.      as
1c650 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
1c660 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67     if( pPg==pPag
1c670 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20  er->pAll ){.    
1c680 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c       pPager->pAl
1c690 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
1c6a0 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  l;.      }else{.
1c6b0 20 20 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d          for( pTm
1c6c0 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
1c6d0 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d  pTmp->pNextAll!=
1c6e0 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e  pPg; pTmp=pTmp->
1c6f0 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20  pNextAll ){}.   
1c700 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74       pTmp->pNext
1c710 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  All = pPg->pNext
1c720 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  All;.      }.   
1c730 20 20 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20     nReleased += 
1c740 28 0a 20 20 20 20 20 20 20 20 20 20 73 69 7a 65  (.          size
1c750 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65  of(*pPg) + pPage
1c760 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20  r->pageSize.    
1c770 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75        + sizeof(u
1c780 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45  32) + pPager->nE
1c790 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b  xtra.          +
1c7a0 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
1c7b0 48 69 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20  History) .      
1c7c0 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
1c7d0 28 28 22 50 47 46 52 45 45 20 25 70 20 25 64 20  (("PGFREE %p %d 
1c7e0 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  *\n", pPager, pP
1c7f0 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20  g->pgno));.     
1c800 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69   PAGER_INCR(sqli
1c810 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65  te3_pager_pgfree
1c820 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73  _count);.      s
1c830 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d  qlite3_free(pPg-
1c840 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73  >pData);.      s
1c850 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
1c860 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c870 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c  nPage--;.    }el
1c880 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20  se{.      /* An 
1c890 65 72 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68  error occured wh
1c8a0 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
1c8b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c8c0 65 20 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a  e or .      ** j
1c8d0 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f  ournal in pager_
1c8e0 72 65 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65  recycle(). The e
1c8f0 72 72 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75  rror is not retu
1c900 72 6e 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20  rned to the .   
1c910 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20     ** caller of 
1c920 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49  this function. I
1c930 6e 73 74 65 61 64 2c 20 73 65 74 20 74 68 65 20  nstead, set the 
1c940 50 61 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61  Pager.errCode va
1c950 72 69 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a  riable..      **
1c960 20 54 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20   The error will 
1c970 62 65 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74  be returned to t
1c980 68 65 20 75 73 65 72 20 28 6f 72 20 75 73 65 72  he user (or user
1c990 73 2c 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a  s, in the case .
1c9a0 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68        ** of a sh
1c9b0 61 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65  ared pager cache
1c9c0 29 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  ) of the pager f
1c9d0 6f 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72  or which the err
1c9e0 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20  or occured..    
1c9f0 20 20 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72    */.      asser
1ca00 74 28 0a 20 20 20 20 20 20 20 20 20 20 28 72 63  t(.          (rc
1ca10 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49  &0xff)==SQLITE_I
1ca20 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20  OERR ||.        
1ca30 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c    rc==SQLITE_FUL
1ca40 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72  L ||.          r
1ca50 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20  c==SQLITE_BUSY. 
1ca60 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73       );.      as
1ca70 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1ca80 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
1ca90 56 45 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67  VED );.      pag
1caa0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1cab0 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   rc);.    }.  }.
1cac0 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20  .  /* Clear the 
1cad0 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  memory managemen
1cae0 74 20 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65  t flags and rele
1caf0 61 73 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20  ase the mutex.  
1cb00 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d  */.  for(pPager=
1cb10 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
1cb20 3b 20 70 50 61 67 65 72 3b 20 70 50 61 67 65 72  ; pPager; pPager
1cb30 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b  =pPager->pNext){
1cb40 0a 20 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49  .     pPager->iI
1cb50 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a  nUseMM = 0;.  }.
1cb60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1cb70 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20  leave(mutex);.. 
1cb80 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e   /* Return the n
1cb90 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 72  umber of bytes r
1cba0 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72  eleased.  */.  r
1cbb0 65 74 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b  eturn nReleased;
1cbc0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  .}.#endif /* SQL
1cbd0 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
1cbe0 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a  Y_MANAGEMENT */.
1cbf0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
1cc00 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20  content of page 
1cc10 70 50 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64  pPg out of the d
1cc20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1cc30 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
1cc40 44 62 50 61 67 65 28 50 61 67 65 72 20 2a 70 50  DbPage(Pager *pP
1cc50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
1cc60 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
1cc70 69 6e 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66  int rc;.  i64 of
1cc80 66 73 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20  fset;.  assert( 
1cc90 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73  MEMDB==0 );.  as
1cca0 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
1ccb0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
1ccc0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
1ccd0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d  if( !pPager->fd-
1cce0 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
1ccf0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1cd00 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b  OERR_SHORT_READ;
1cd10 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20  .  }.  offset = 
1cd20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50  (pgno-1)*(i64)pP
1cd30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a  ager->pageSize;.
1cd40 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1cd50 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c  Read(pPager->fd,
1cd60 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1cd70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
1cd80 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a  eSize, offset);.
1cd90 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
1cda0 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64  ite3_pager_readd
1cdb0 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45  b_count);.  PAGE
1cdc0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1cdd0 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45  Read);.  IOTRACE
1cde0 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22  (("PGIN %p %d\n"
1cdf0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
1ce00 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20  ;.  if( pgno==1 
1ce10 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70  ){.    memcpy(&p
1ce20 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1ce30 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f  s, &((u8*)PGHDR_
1ce40 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34  TO_DATA(pPg))[24
1ce50 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
1ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce80 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
1ce90 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20  dbFileVers));.  
1cea0 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61 67 65  }.  CODEC1(pPage
1ceb0 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
1cec0 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  (pPg), pPg->pgno
1ced0 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41  , 3);.  PAGERTRA
1cee0 43 45 34 28 22 46 45 54 43 48 20 25 64 20 70 61  CE4("FETCH %d pa
1cef0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
1cf00 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1cf10 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1cf20 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1cf30 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
1cf40 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Pg));.  return r
1cf50 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  c;.}.../*.** Thi
1cf60 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
1cf70 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74  lled to obtain t
1cf80 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72  he shared lock r
1cf90 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a  equired before.*
1cfa0 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65  * data may be re
1cfb0 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65  ad from the page
1cfc0 72 20 63 61 63 68 65 2e 20 49 66 20 74 68 65 20  r cache. If the 
1cfd0 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20  shared lock has 
1cfe0 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20  already.** been 
1cff0 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66  obtained, this f
1d000 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d  unction is a no-
1d010 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69  op..**.** Immedi
1d020 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61  ately after obta
1d030 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72 65 64  ining the shared
1d040 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72   lock (if requir
1d050 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69  ed), this functi
1d060 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72  on.** checks for
1d070 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66   a hot-journal f
1d080 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66  ile. If one is f
1d090 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e  ound, an emergen
1d0a0 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69  cy rollback.** i
1d0b0 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65  s performed imme
1d0c0 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74  diately..*/.stat
1d0d0 69 63 20 69 6e 74 20 70 61 67 65 72 53 68 61 72  ic int pagerShar
1d0e0 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  edLock(Pager *pP
1d0f0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
1d100 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
1d110 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20  nt isHot = 0;.. 
1d120 20 2f 2a 20 49 66 20 74 68 69 73 20 64 61 74 61   /* If this data
1d130 62 61 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66  base is opened f
1d140 6f 72 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  or exclusive acc
1d150 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73  ess, has no outs
1d160 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61  tanding .  ** pa
1d170 67 65 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e  ge references an
1d180 64 20 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72  d is in an error
1d190 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74  -state, now is t
1d1a0 68 65 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65  he chance to cle
1d1b0 61 72 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f  ar.  ** the erro
1d1c0 72 2e 20 44 69 73 63 61 72 64 20 74 68 65 20 63  r. Discard the c
1d1d0 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70  ontents of the p
1d1e0 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74  ager-cache and t
1d1f0 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70  reat any.  ** op
1d200 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  en journal file 
1d210 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  as a hot-journal
1d220 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45  ..  */.  if( !ME
1d230 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65  MDB && pPager->e
1d240 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20  xclusiveMode && 
1d250 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
1d260 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
1d270 64 65 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  de ){.    if( pP
1d280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1d290 6e 20 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74  n ){.      isHot
1d2a0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
1d2b0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d2c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
1d2d0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
1d2e0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
1d2f0 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20  If the pager is 
1d300 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f  still in an erro
1d310 72 20 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20  r state, do not 
1d320 70 72 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72  proceed. The err
1d330 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77  or .  ** state w
1d340 69 6c 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61  ill be cleared a
1d350 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20  t some point in 
1d360 74 68 65 20 66 75 74 75 72 65 20 77 68 65 6e 20  the future when 
1d370 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72  all page .  ** r
1d380 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 64 72  eferences are dr
1d390 6f 70 70 65 64 20 61 6e 64 20 74 68 65 20 63 61  opped and the ca
1d3a0 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63 61  che can be disca
1d3b0 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rded..  */.  if(
1d3c0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1d3d0 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43   && pPager->errC
1d3e0 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  ode!=SQLITE_FULL
1d3f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1d400 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
1d410 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
1d420 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
1d430 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20  UNLOCK || isHot 
1d440 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
1d450 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
1d460 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28  r->pVfs;.    if(
1d470 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
1d480 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1d490 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
1d4a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
1d4b0 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
1d4c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
1d4d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
1d4e0 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b  ger, SHARED_LOCK
1d4f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
1d500 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1d510 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
1d520 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1d530 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b  =PAGER_UNLOCK );
1d540 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1d550 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
1d560 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
1d570 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
1d580 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1d590 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20  te>=SHARED_LOCK 
1d5a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 0a 20 20  );.      }.  .  
1d5b0 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
1d5c0 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
1d5d0 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
1d5e0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
1d5f0 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64  n the.      ** d
1d600 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68  atabase file, th
1d610 65 6e 20 69 74 20 65 69 74 68 65 72 20 6e 65 65  en it either nee
1d620 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
1d630 62 61 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e  back or deleted.
1d640 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1d650 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f 75 72 6e  rc = hasHotJourn
1d660 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1d670 20 20 69 66 28 20 72 63 3c 30 20 29 7b 0a 20 20    if( rc<0 ){.  
1d680 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1d690 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20  E_IOERR_NOMEM;. 
1d6a0 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c         goto fail
1d6b0 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ed;.      }.    
1d6c0 20 20 69 66 28 20 72 63 3d 3d 31 20 7c 7c 20 69    if( rc==1 || i
1d6d0 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sHot ){.        
1d6e0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
1d6f0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1d700 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
1d710 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
1d720 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
1d730 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
1d740 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1d750 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
1d760 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
1d770 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
1d780 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
1d790 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
1d7a0 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
1d7b0 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d7c0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
1d7d0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
1d7e0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
1d7f0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
1d800 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
1d810 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
1d820 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
1d830 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
1d840 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
1d850 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
1d860 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
1d870 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
1d880 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
1d890 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
1d8a0 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
1d8b0 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
1d8c0 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
1d8d0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
1d8e0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
1d8f0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
1d900 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73 20 6f   ** obtain its o
1d910 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  wn EXCLUSIVE loc
1d920 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1d930 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  e file..        
1d940 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
1d950 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45 58 43  Pager->state<EXC
1d960 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b 0a 20  LUSIVE_LOCK ){. 
1d970 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1d980 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67  lite3OsLock(pPag
1d990 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56  er->fd, EXCLUSIV
1d9a0 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  E_LOCK);.       
1d9b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1d9c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1d9d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
1d9e0 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29  rror(pPager, rc)
1d9f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
1da00 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20  to failed;.     
1da10 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1da20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1da30 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1da40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 0a 20 20  ;.        }. .  
1da50 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68        /* Open th
1da60 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
1da70 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
1da80 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
1da90 20 69 6e 20 0a 20 20 20 20 20 20 20 20 2a 2a 20   in .        ** 
1daa0 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73  exclusive-access
1dab0 20 6d 6f 64 65 20 74 68 65 20 66 69 6c 65 20 64   mode the file d
1dac0 65 73 63 72 69 70 74 6f 72 20 77 69 6c 6c 20 62  escriptor will b
1dad0 65 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 0a  e kept open and.
1dae0 20 20 20 20 20 20 20 20 2a 2a 20 70 6f 73 73 69          ** possi
1daf0 62 6c 79 20 75 73 65 64 20 66 6f 72 20 61 20 74  bly used for a t
1db00 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61 74 65 72  ransaction later
1db10 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20 73 79 73   on. On some sys
1db20 74 65 6d 73 2c 20 74 68 65 0a 20 20 20 20 20 20  tems, the.      
1db30 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61 74 65 28    ** OsTruncate(
1db40 29 20 63 61 6c 6c 20 75 73 65 64 20 69 6e 20 65  ) call used in e
1db50 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73 73 20  xclusive-access 
1db60 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71 75 69 72  mode also requir
1db70 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  es.        ** a 
1db80 72 65 61 64 2f 77 72 69 74 65 20 66 69 6c 65 20  read/write file 
1db90 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20 20 20 20  handle..        
1dba0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  */.        if( !
1dbb0 69 73 48 6f 74 20 26 26 20 70 50 61 67 65 72 2d  isHot && pPager-
1dbc0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
1dbd0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
1dbe0 20 72 65 73 20 3d 20 73 71 6c 69 74 65 33 4f 73   res = sqlite3Os
1dbf0 41 63 63 65 73 73 28 70 56 66 73 2c 70 50 61 67  Access(pVfs,pPag
1dc00 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 53 51 4c  er->zJournal,SQL
1dc10 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
1dc20 53 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  S);.          if
1dc30 28 20 72 65 73 3d 3d 31 20 29 7b 0a 20 20 20 20  ( res==1 ){.    
1dc40 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f 75 74          int fout
1dc50 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
1dc60 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49 54 45    int f = SQLITE
1dc70 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1dc80 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
1dc90 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20 20 20  _JOURNAL;.      
1dca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
1dcb0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
1dcc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
1dcd0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
1dce0 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
1dcf0 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
1dd00 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75 74 29  ->jfd, f, &fout)
1dd10 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  ;.            as
1dd20 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
1dd30 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a  _OK || pPager->j
1dd40 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a  fd->pMethods );.
1dd50 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1dd60 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
1dd70 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20 20 20  _READONLY ){.   
1dd80 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
1dd90 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20  SQLITE_BUSY;.   
1dda0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1ddb0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
1ddc0 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 20  ->jfd);.        
1ddd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1dde0 7d 65 6c 73 65 20 69 66 28 20 72 65 73 3d 3d 30  }else if( res==0
1ddf0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1de00 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  /* If the journa
1de10 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  l does not exist
1de20 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 73 6f 6d  , that means som
1de30 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 0a  e other process.
1de40 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 68              ** h
1de50 61 73 20 61 6c 72 65 61 64 79 20 72 6f 6c 6c 65  as already rolle
1de60 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a 20 20 20  d it back */.   
1de70 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
1de80 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20  LITE_BUSY;.     
1de90 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1dea0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 73 71          /* If sq
1deb0 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 29 20  lite3OsAccess() 
1dec0 72 65 74 75 72 6e 73 20 61 20 6e 65 67 61 74 69  returns a negati
1ded0 76 65 20 76 61 6c 75 65 2c 20 74 68 61 74 20 6d  ve value, that m
1dee0 65 61 6e 73 20 69 74 0a 20 20 20 20 20 20 20 20  eans it.        
1def0 20 20 20 20 2a 2a 20 66 61 69 6c 65 64 20 61 20      ** failed a 
1df00 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61 74 69 6f  memory allocatio
1df10 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  n */.           
1df20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45   rc = SQLITE_IOE
1df30 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  RR_NOMEM;.      
1df40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
1df50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
1df60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1df70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
1df80 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72  QLITE_NOMEM && r
1df90 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1dfa0 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20 20 20 20  UNLOCK .        
1dfb0 20 20 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45     && rc!=SQLITE
1dfc0 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20 0a 20 20  _IOERR_NOMEM .  
1dfd0 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
1dfe0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
1dff0 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
1e000 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67     }.          g
1e010 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20  oto failed;.    
1e020 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
1e030 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1e040 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  n = 1;.        p
1e050 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
1e060 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
1e070 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
1e080 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20  alOff = 0;.     
1e090 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61     pPager->setMa
1e0a0 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  ster = 0;.      
1e0b0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1e0c0 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20  lHdr = 0;. .    
1e0d0 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20      /* Playback 
1e0e0 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a  and delete the j
1e0f0 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68  ournal.  Drop th
1e100 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65  e database write
1e110 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  .        ** lock
1e120 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
1e130 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
1e140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
1e150 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
1e160 62 61 63 6b 28 70 50 61 67 65 72 2c 20 31 29 3b  back(pPager, 1);
1e170 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1e180 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e190 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1e1a0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
1e1b0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
1e1c0 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20  goto failed;.   
1e1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
1e1e0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74  ssert(pPager->st
1e1f0 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1e200 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20  D || .          
1e210 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75    (pPager->exclu
1e220 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67  siveMode && pPag
1e230 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f  er->state>PAGER_
1e240 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20 20  SHARED).        
1e250 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
1e260 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41    if( pPager->pA
1e270 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ll ){.        /*
1e280 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b   The shared-lock
1e290 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61   has just been a
1e2a0 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64  cquired on the d
1e2b0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20  atabase file.   
1e2c0 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72       ** and ther
1e2d0 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70 61  e are already pa
1e2e0 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68 65  ges in the cache
1e2f0 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75   (from a previou
1e300 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61  s.        ** rea
1e310 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73  d or write trans
1e320 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20  action).  Check 
1e330 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64 61  to see if the da
1e340 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a  tabase.        *
1e350 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66  * has been modif
1e360 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61 74  ied.  If the dat
1e370 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67 65  abase has change
1e380 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20  d, flush the.   
1e390 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20       ** cache.. 
1e3a0 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
1e3b0 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68    ** Database ch
1e3c0 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74 65  anges is detecte
1e3d0 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  d by looking at 
1e3e0 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69  15 bytes beginni
1e3f0 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74  ng.        ** at
1e400 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20   offset 24 into 
1e410 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66  the file.  The f
1e420 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65 20  irst 4 of these 
1e430 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20 20  16 bytes are.   
1e440 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74       ** a 32-bit
1e450 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73   counter that is
1e460 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74   incremented wit
1e470 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20  h each change.  
1e480 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  The.        ** o
1e490 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e 67  ther bytes chang
1e4a0 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20  e randomly with 
1e4b0 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65  each file change
1e4c0 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   when.        **
1e4d0 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75   a codec is in u
1e4e0 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a  se..        ** .
1e4f0 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65          ** There
1e500 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c   is a vanishingl
1e510 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74  y small chance t
1e520 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c  hat a change wil
1e530 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20  l not be .      
1e540 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20    ** detected.  
1e550 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e  The chance of an
1e560 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e   undetected chan
1e570 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74  ge is so small t
1e580 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  hat.        ** i
1e590 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74  t can be neglect
1e5a0 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ed..        */. 
1e5b0 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46 69         char dbFi
1e5c0 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50  leVers[sizeof(pP
1e5d0 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
1e5e0 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  )];.        sqli
1e5f0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1e600 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20  t(pPager);..    
1e610 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1e620 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20  errCode ){.     
1e630 20 20 20 20 20 72 63 20 3d 20 70 50 61 67 65 72       rc = pPager
1e640 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
1e650 20 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64       goto failed
1e660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
1e670 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1e680 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a 20 20 20  >dbSize>0 ){.   
1e690 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
1e6a0 22 43 4b 56 45 52 53 20 25 70 20 25 64 5c 6e 22  "CKVERS %p %d\n"
1e6b0 2c 20 70 50 61 67 65 72 2c 20 73 69 7a 65 6f 66  , pPager, sizeof
1e6c0 28 64 62 46 69 6c 65 56 65 72 73 29 29 29 3b 0a  (dbFileVers)));.
1e6d0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1e6e0 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
1e6f0 67 65 72 2d 3e 66 64 2c 20 26 64 62 46 69 6c 65  ger->fd, &dbFile
1e700 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
1e710 69 6c 65 56 65 72 73 29 2c 20 32 34 29 3b 0a 20  ileVers), 24);. 
1e720 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21           if( rc!
1e730 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e740 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66            goto f
1e750 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 20  ailed;.         
1e760 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
1e770 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73  {.          mems
1e780 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20 30  et(dbFileVers, 0
1e790 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1e7a0 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ers));.        }
1e7b0 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 65  ..        if( me
1e7c0 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62 46  mcmp(pPager->dbF
1e7d0 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65 56  ileVers, dbFileV
1e7e0 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  ers, sizeof(dbFi
1e7f0 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a 20  leVers))!=0 ){. 
1e800 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f 72           pager_r
1e810 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
1e820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
1e830 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1e840 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  ( pPager->exclus
1e850 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67 65  iveMode || pPage
1e860 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52 5f  r->state<=PAGER_
1e870 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66  SHARED );.    if
1e880 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
1e890 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
1e8a0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
1e8b0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
1e8c0 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  RED;.    }.  }..
1e8d0 20 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 72   failed:.  if( r
1e8e0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1e8f0 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 75 6e 6c      /* pager_unl
1e900 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1e910 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20 6d   for exclusive m
1e920 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65 6d 6f 72  ode and in-memor
1e930 79 20 64 61 74 61 62 61 73 65 73 2e 20 2a 2f 0a  y databases. */.
1e940 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b      pager_unlock
1e950 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
1e960 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1e970 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 20 50  .** Allocate a P
1e980 67 48 64 72 20 6f 62 6a 65 63 74 2e 20 20 20 45  gHdr object.   E
1e990 69 74 68 65 72 20 63 72 65 61 74 65 20 61 20 6e  ither create a n
1e9a0 65 77 20 6f 6e 65 20 6f 72 20 72 65 75 73 65 0a  ew one or reuse.
1e9b0 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e 67 20 6f  ** an existing o
1e9c0 6e 65 20 74 68 61 74 20 69 73 20 6e 6f 74 20 6f  ne that is not o
1e9d0 74 68 65 72 77 69 73 65 20 69 6e 20 75 73 65 2e  therwise in use.
1e9e0 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20 50 67 48  .**.** A new PgH
1e9f0 64 72 20 73 74 72 75 63 74 75 72 65 20 69 73 20  dr structure is 
1ea00 63 72 65 61 74 65 64 20 69 66 20 61 6e 79 20 6f  created if any o
1ea10 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ea20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a  are.** true:.**.
1ea30 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
1ea40 61 76 65 20 6e 6f 74 20 65 78 63 65 65 64 65 64  ave not exceeded
1ea50 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20 61 6c 6c   our maximum all
1ea60 6f 63 61 74 65 64 20 63 61 63 68 65 20 73 69 7a  ocated cache siz
1ea70 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 73  e.**          as
1ea80 20 73 65 74 20 62 79 20 74 68 65 20 22 50 52 41   set by the "PRA
1ea90 47 4d 41 20 63 61 63 68 65 5f 73 69 7a 65 22 20  GMA cache_size" 
1eaa0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20  command..**.**  
1eab0 20 20 20 28 32 29 20 20 54 68 65 72 65 20 61 72     (2)  There ar
1eac0 65 20 6e 6f 20 75 6e 75 73 65 64 20 50 67 48 64  e no unused PgHd
1ead0 72 20 6f 62 6a 65 63 74 73 20 61 76 61 69 6c 61  r objects availa
1eae0 62 6c 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  ble at this time
1eaf0 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  ..**.**     (3) 
1eb00 20 54 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   This is an in-m
1eb10 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
1eb20 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 54  **.**     (4)  T
1eb30 68 65 72 65 20 61 72 65 20 6e 6f 20 50 67 48 64  here are no PgHd
1eb40 72 20 6f 62 6a 65 63 74 73 20 74 68 61 74 20 64  r objects that d
1eb50 6f 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 20  o not require a 
1eb60 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
1eb70 20 20 20 20 66 69 6c 65 20 73 79 6e 63 20 61 6e      file sync an
1eb80 64 20 61 20 73 79 6e 63 20 6f 66 20 74 68 65 20  d a sync of the 
1eb90 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
1eba0 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20 20 20 20  currently.**    
1ebb0 20 20 20 20 20 20 70 72 6f 68 69 62 69 74 65 64        prohibited
1ebc0 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72 77 69 73  ..**.** Otherwis
1ebd0 65 2c 20 72 65 75 73 65 20 61 6e 20 65 78 69 73  e, reuse an exis
1ebe0 74 69 6e 67 20 50 67 48 64 72 2e 20 20 49 6e 20  ting PgHdr.  In 
1ebf0 6f 74 68 65 72 20 77 6f 72 64 73 2c 20 72 65 75  other words, reu
1ec00 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73 74 69 6e  se an.** existin
1ec10 67 20 50 67 48 64 72 20 69 66 20 61 6c 6c 20 6f  g PgHdr if all o
1ec20 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
1ec30 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20  are true:.**.** 
1ec40 20 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65      (1)  We have
1ec50 20 72 65 61 63 68 65 64 20 6f 72 20 65 78 63 65   reached or exce
1ec60 65 64 65 64 20 74 68 65 20 6d 61 78 69 6d 75 6d  eded the maximum
1ec70 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a 20 20   cache size.**  
1ec80 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64 20          allowed 
1ec90 62 79 20 22 50 52 41 47 4d 41 20 63 61 63 68 65  by "PRAGMA cache
1eca0 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20  _size"..**.**   
1ecb0 20 20 28 32 29 20 20 54 68 65 72 65 20 69 73 20    (2)  There is 
1ecc0 61 20 50 67 48 64 72 20 61 76 61 69 6c 61 62 6c  a PgHdr availabl
1ecd0 65 20 77 69 74 68 20 50 67 48 64 72 2d 3e 6e 52  e with PgHdr->nR
1ece0 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ef==0.**.**     
1ecf0 28 33 29 20 20 57 65 20 61 72 65 20 6e 6f 74 20  (3)  We are not 
1ed00 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  in an in-memory 
1ed10 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20  database.**.**  
1ed20 20 20 20 28 34 29 20 20 45 69 74 68 65 72 20 74     (4)  Either t
1ed30 68 65 72 65 20 69 73 20 61 6e 20 61 76 61 69 6c  here is an avail
1ed40 61 62 6c 65 20 50 67 48 64 72 20 74 68 61 74 20  able PgHdr that 
1ed50 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a  does not need.**
1ed60 20 20 20 20 20 20 20 20 20 20 74 6f 20 62 65 20            to be 
1ed70 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 6f  synced to disk o
1ed80 72 20 65 6c 73 65 20 64 69 73 6b 20 73 79 6e 63  r else disk sync
1ed90 69 6e 67 20 69 73 20 63 75 72 72 65 6e 74 6c 79  ing is currently
1eda0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
1edb0 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  owed..*/.static 
1edc0 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f 63 61 74  int pagerAllocat
1edd0 65 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61  ePage(Pager *pPa
1ede0 67 65 72 2c 20 50 67 48 64 72 20 2a 2a 70 70 50  ger, PgHdr **ppP
1edf0 67 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  g){.  int rc = S
1ee00 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50 67 48 64  QLITE_OK;.  PgHd
1ee10 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 6e 42  r *pPg;.  int nB
1ee20 79 74 65 48 64 72 3b 0a 0a 0a 20 20 2f 2a 20 43  yteHdr;...  /* C
1ee30 72 65 61 74 65 20 61 20 6e 65 77 20 50 67 48 64  reate a new PgHd
1ee40 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65 20  r if any of the 
1ee50 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e 73 20  four conditions 
1ee60 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20 61 62  defined .  ** ab
1ee70 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 0a 20 20  ove are met: .  
1ee80 2a 2f 0a 20 20 70 61 67 65 72 4d 75 74 65 78 48  */.  pagerMutexH
1ee90 65 6c 64 28 70 50 61 67 65 72 29 3b 0a 20 20 69  eld(pPager);.  i
1eea0 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  f( pPager->nPage
1eeb0 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a  <pPager->mxPage.
1eec0 20 20 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72     || pPager->lr
1eed0 75 2e 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20  u.pFirst==0 .   
1eee0 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28  || MEMDB.   || (
1eef0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1ef00 73 74 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70  stSynced==0 && p
1ef10 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63  Pager->doNotSync
1ef20 29 0a 20 20 29 7b 0a 20 20 20 20 76 6f 69 64 20  ).  ){.    void 
1ef30 2a 70 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20  *pData;.    if( 
1ef40 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70  pPager->nPage>=p
1ef50 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a  Pager->nHash ){.
1ef60 20 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 69        pager_resi
1ef70 7a 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50  ze_hash_table(pP
1ef80 61 67 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70  ager,.         p
1ef90 50 61 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36  Pager->nHash<256
1efa0 20 3f 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d   ? 256 : pPager-
1efb0 3e 6e 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20  >nHash*2);.     
1efc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61   if( pPager->nHa
1efd0 73 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  sh==0 ){.       
1efe0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
1eff0 45 4d 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  EM;.        goto
1f000 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1f010 6f 75 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  out;.      }.   
1f020 20 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76   }.    pagerLeav
1f030 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 6e  e(pPager);.    n
1f040 42 79 74 65 48 64 72 20 3d 20 73 69 7a 65 6f 66  ByteHdr = sizeof
1f050 28 2a 70 50 67 29 20 2b 20 73 69 7a 65 6f 66 28  (*pPg) + sizeof(
1f060 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
1f070 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
1f080 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
1f090 6f 66 28 50 67 48 69 73 74 6f 72 79 29 3b 0a 20  of(PgHistory);. 
1f0a0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1f0b0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64  _malloc( nByteHd
1f0c0 72 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67  r );.    if( pPg
1f0d0 20 29 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20   ){.      pData 
1f0e0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1f0f0 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  ( pPager->pageSi
1f100 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ze );.      if( 
1f110 70 44 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20  pData==0 ){.    
1f120 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1f130 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70  (pPg);.        p
1f140 50 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  Pg = 0;.      }.
1f150 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72 45      }.    pagerE
1f160 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1f170 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
1f180 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1f190 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
1f1a0 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1f1b0 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
1f1c0 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c    memset(pPg, 0,
1f1d0 20 6e 42 79 74 65 48 64 72 29 3b 0a 20 20 20 20   nByteHdr);.    
1f1e0 70 50 67 2d 3e 70 44 61 74 61 20 3d 20 70 44 61  pPg->pData = pDa
1f1f0 74 61 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61  ta;.    pPg->pPa
1f200 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
1f210 20 20 70 61 67 65 72 4d 75 74 65 78 48 65 6c 64    pagerMutexHeld
1f220 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1f230 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
1f240 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
1f250 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70  pPager->pAll = p
1f260 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  Pg;.    pPager->
1f270 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c 73 65  nPage++;.  }else
1f280 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63 6c 65  {.    /* Recycle
1f290 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   an existing pag
1f2a0 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20 72 65  e with a zero re
1f2b0 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20 20 20  f-count. */.    
1f2c0 70 61 67 65 72 4d 75 74 65 78 48 65 6c 64 28 70  pagerMutexHeld(p
1f2d0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d  Pager);.    rc =
1f2e0 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1f2f0 50 61 67 65 72 2c 20 26 70 50 67 29 3b 0a 20 20  Pager, &pPg);.  
1f300 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f310 5f 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72  _BUSY ){.      r
1f320 63 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  c = SQLITE_IOERR
1f330 5f 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a  _BLOCKED;.    }.
1f340 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1f350 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67  TE_OK ){.      g
1f360 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61  oto pager_alloca
1f370 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  te_out;.    }.  
1f380 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1f390 2d 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f  ->state>=SHARED_
1f3a0 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65  LOCK );.    asse
1f3b0 72 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a  rt(pPg);.  }.  *
1f3c0 70 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67  ppPg = pPg;..pag
1f3d0 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a  er_allocate_out:
1f3e0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f3f0 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65  ./*.** Make sure
1f400 20 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e   we have the con
1f410 74 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  tent for a page.
1f420 20 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61    If the page wa
1f430 73 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20  s.** previously 
1f440 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f  acquired with no
1f450 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e  Content==1, then
1f460 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73   the content was
1f470 0a 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c  .** just initial
1f480 69 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e  ized to zeros in
1f490 73 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72  stead of being r
1f4a0 65 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a  ead from disk..*
1f4b0 2a 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65  * But now we nee
1f4c0 64 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20  d the real data 
1f4d0 6f 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f  off of disk.  So
1f4e0 20 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a   make sure we.**
1f4f0 20 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20   have it.  Read 
1f500 69 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e  it in if we do n
1f510 6f 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61  ot have it alrea
1f520 64 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  dy..*/.static in
1f530 74 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  t pager_get_cont
1f540 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
1f550 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
1f560 52 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20  Read ){.    int 
1f570 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1f580 70 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67  pPg->pPager, pPg
1f590 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
1f5a0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1f5b0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67  _OK ){.      pPg
1f5c0 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
1f5d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1f5e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1f5f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  }.  }.  return S
1f600 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1f610 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1f620 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20  e..**.** A read 
1f630 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b  lock on the disk
1f640 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65   file is obtaine
1f650 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74  d when the first
1f660 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65   page is acquire
1f670 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64  d. .** This read
1f680 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64   lock is dropped
1f690 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70   when the last p
1f6a0 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e  age is released.
1f6b0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1f6c0 69 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e  ine works for an
1f6d0 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72  y page number gr
1f6e0 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49  eater than 0.  I
1f6f0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a  f the database.*
1f700 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65  * file is smalle
1f710 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65  r than the reque
1f720 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20  sted page, then 
1f730 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a  no actual disk.*
1f740 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e  * read occurs an
1f750 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61  d the memory ima
1f760 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69  ge of the page i
1f770 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f  s initialized to
1f780 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20  .** all zeros.  
1f790 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61  The extra data a
1f7a0 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67  ppended to a pag
1f7b0 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74  e is always init
1f7c0 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65  ialized.** to ze
1f7d0 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69  ros the first ti
1f7e0 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61  me a page is loa
1f7f0 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e  ded into memory.
1f800 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69  .**.** The acqui
1f810 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69  sition might fai
1f820 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65  l for several re
1f830 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63  asons.  In all c
1f840 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72  ases,.** an appr
1f850 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f  opriate error co
1f860 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61  de is returned a
1f870 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65  nd *ppPage is se
1f880 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a  t to NULL..**.**
1f890 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1f8a0 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20  3PagerLookup(). 
1f8b0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
1f8c0 6e 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20  ne and Lookup() 
1f8d0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
1f8e0 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
1f8f0 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
1f900 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
1f910 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
1f920 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
1f930 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
1f940 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
1f950 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
1f960 73 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75  s Lookup().** ju
1f970 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54  st returns 0.  T
1f980 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75  his routine acqu
1f990 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b  ires a read-lock
1f9a0 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1f9b0 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20  it.** has to go 
1f9c0 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75  to disk, and cou
1f9d0 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b  ld also playback
1f9e0 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20   an old journal 
1f9f0 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  if necessary..**
1fa00 20 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20   Since Lookup() 
1fa10 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69  never goes to di
1fa20 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73  sk, it never has
1fa30 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f   to deal with lo
1fa40 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61  cks.** or journa
1fa50 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
1fa60 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66  f noContent is f
1fa70 61 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63  alse, the page c
1fa80 6f 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75  ontents are actu
1fa90 61 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64  ally read from d
1faa0 69 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e  isk..** If noCon
1fab0 74 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74  tent is true, it
1fac0 20 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64   means that we d
1fad0 6f 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74  o not care about
1fae0 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a   the contents.**
1faf0 20 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20   of the page at 
1fb00 74 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f  this time, so do
1fb10 20 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72   not do a disk r
1fb20 65 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20  ead.  Just fill 
1fb30 69 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  in the.** page c
1fb40 6f 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f  ontent with zero
1fb50 73 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65  s.  But mark the
1fb60 20 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61   fact that we ha
1fb70 76 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a  ve not read the.
1fb80 2a 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65  ** content by se
1fb90 74 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e  tting the PgHdr.
1fba0 6e 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20  needRead flag.  
1fbb0 4c 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a  Later on, if .**
1fbc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
1fbd0 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f  te() is called o
1fbe0 6e 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69  n this page or i
1fbf0 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  f this routine i
1fc00 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69  s.** called agai
1fc10 6e 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74  n with noContent
1fc20 3d 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ==0, that means 
1fc30 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
1fc40 20 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e   is needed.** an
1fc50 64 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20  d the disk read 
1fc60 73 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20  should occur at 
1fc70 74 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73  that point..*/.s
1fc80 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41  tatic int pagerA
1fc90 63 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20  cquire(.  Pager 
1fca0 2a 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a  *pPager,      /*
1fcb0 20 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20   The pager open 
1fcc0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1fcd0 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  file */.  Pgno p
1fce0 67 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  gno,          /*
1fcf0 20 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   Page number to 
1fd00 66 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67  fetch */.  DbPag
1fd10 65 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f  e **ppPage,    /
1fd20 2a 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65  * Write a pointe
1fd30 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65  r to the page he
1fd40 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f  re */.  int noCo
1fd50 6e 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44  ntent       /* D
1fd60 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61  o not bother rea
1fd70 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f  ding content fro
1fd80 6d 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a  m disk if true *
1fd90 2f 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  /.){.  PgHdr *pP
1fda0 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
1fdb0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1fdc0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1fdd0 4f 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e  OCK || pPager->n
1fde0 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
1fdf0 20 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61   );..  /* The ma
1fe00 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65  ximum page numbe
1fe10 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72  r is 2^31. Retur
1fe20 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
1fe30 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20   if a page.  ** 
1fe40 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74  number greater t
1fe50 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72  han this, or zer
1fe60 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e  o, is requested.
1fe70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f  .  */.  if( pgno
1fe80 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20  >PAGER_MAX_PGNO 
1fe90 7c 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67  || pgno==0 || pg
1fea0 6e 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no==PAGER_MJ_PGN
1feb0 4f 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20  O(pPager) ){.   
1fec0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   return SQLITE_C
1fed0 4f 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d  ORRUPT_BKPT;.  }
1fee0 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
1fef0 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
1ff00 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
1ff10 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
1ff20 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
1ff30 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
1ff40 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1ff50 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
1ff60 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
1ff70 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
1ff80 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
1ff90 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 70 61  atabase file. pa
1ffa0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 29 20  gerSharedLock() 
1ffb0 69 73 20 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20  is a no-op if . 
1ffc0 20 2a 2a 20 61 20 64 61 74 61 62 61 73 65 20 6c   ** a database l
1ffd0 6f 63 6b 20 69 73 20 61 6c 72 65 61 64 79 20 68  ock is already h
1ffe0 65 6c 64 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  eld..  */.  rc =
1fff0 20 70 61 67 65 72 53 68 61 72 65 64 4c 6f 63 6b   pagerSharedLock
20000 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
20010 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20020 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
20030 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
20040 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
20050 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20  ER_UNLOCK );..  
20060 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  pPg = pager_look
20070 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29  up(pPager, pgno)
20080 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ;.  if( pPg==0 )
20090 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
200a0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
200b0 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
200c0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
200d0 20 6e 4d 61 78 3b 0a 20 20 20 20 69 6e 74 20 68   nMax;.    int h
200e0 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52  ;.    PAGER_INCR
200f0 28 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b  (pPager->nMiss);
20100 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 41  .    rc = pagerA
20110 6c 6c 6f 63 61 74 65 50 61 67 65 28 70 50 61 67  llocatePage(pPag
20120 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
20130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20140 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
20150 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
20160 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
20170 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 4d  ;.    assert( !M
20180 45 4d 44 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61  EMDB || pgno>pPa
20190 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b  ger->stmtSize );
201a0 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  .    pPg->inJour
201b0 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42 69 74  nal = sqlite3Bit
201c0 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
201d0 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  pInJournal, pgno
201e0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  );.    pPg->need
201f0 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d  Sync = 0;..    m
20200 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20  akeClean(pPg);. 
20210 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31     pPg->nRef = 1
20220 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
20230 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
20240 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
20250 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
20260 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
20270 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
20280 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
20290 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
202a0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
202b0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
202c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
202d0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
202e0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
202f0 72 72 43 6f 64 65 3b 0a 20 20 20 20 20 20 73 71  rrCode;.      sq
20300 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
20310 70 50 67 29 3b 0a 20 20 20 20 20 20 72 65 74 75  pPg);.      retu
20320 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
20330 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
20340 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
20350 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
20360 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
20370 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
20380 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
20390 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
203a0 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
203b0 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
203c0 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
203d0 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
203e0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
203f0 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
20400 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
20410 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
20420 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
20430 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
20440 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
20450 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
20460 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
20470 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
20480 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
20490 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
204a0 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
204b0 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
204c0 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
204d0 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
204e0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
204f0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
20500 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
20510 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
20520 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
20530 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
20540 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
20550 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
20560 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
20570 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
20580 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
20590 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
205a0 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
205b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
205c0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
205d0 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
205e0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
205f0 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
20600 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
20610 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
20620 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
20630 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
20640 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
20650 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
20660 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
20670 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
20680 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
20690 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
206a0 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
206b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
206c0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
206d0 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
206e0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
206f0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
20700 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
20710 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
20720 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
20730 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
20740 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
20750 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
20760 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
20770 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
20780 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
20790 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
207a0 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
207b0 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
207c0 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
207d0 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
207e0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
207f0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
20800 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
20810 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
20820 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
20830 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
20840 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
20850 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
20860 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
20870 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20  QLITE_OK;.}.int 
20880 73 71 6c 69 74 65 33 50 61 67 65 72 41 63 71 75  sqlite3PagerAcqu
20890 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
208a0 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
208b0 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
208c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
208d0 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
208e0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
208f0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
20900 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
20910 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
20920 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
20930 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
20940 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
20950 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
20960 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
20970 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
20980 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
20990 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
209a0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
209b0 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 41 63  ;.  rc = pagerAc
209c0 71 75 69 72 65 28 70 50 61 67 65 72 2c 20 70 67  quire(pPager, pg
209d0 6e 6f 2c 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f  no, ppPage, noCo
209e0 6e 74 65 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c  ntent);.  pagerL
209f0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
20a00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
20a10 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70  *.** Acquire a p
20a20 61 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72  age if it is alr
20a30 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d  eady in the in-m
20a40 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f  emory cache.  Do
20a50 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65  .** not read the
20a60 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e   page from disk.
20a70 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
20a80 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a  er to the page,.
20a90 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70  ** or 0 if the p
20aa0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61  age is not in ca
20ab0 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  che..**.** See a
20ac0 6c 73 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72  lso sqlite3Pager
20ad0 47 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  Get().  The diff
20ae0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
20af0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
20b00 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 47  nd sqlite3PagerG
20b10 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67 65  et() is that _ge
20b20 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74  t() will go to t
20b30 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64  he disk and read
20b40 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20  .** in the page 
20b50 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
20b60 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61  ot already in ca
20b70 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
20b80 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55  ne.** returns NU
20b90 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20 69  LL if the page i
20ba0 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f  s not in cache o
20bb0 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20  r if a disk I/O 
20bc0 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76  error .** has ev
20bd0 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a  er happened..*/.
20be0 44 62 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50  DbPage *sqlite3P
20bf0 61 67 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72  agerLookup(Pager
20c00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
20c10 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
20c20 50 67 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72  Pg = 0;..  asser
20c30 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
20c40 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d    assert( pgno!=
20c50 30 20 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  0 );..  pagerEnt
20c60 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
20c70 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
20c80 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b  =PAGER_UNLOCK ){
20c90 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50  .    assert( !pP
20ca0 61 67 65 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50  ager->pAll || pP
20cb0 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d  ager->exclusiveM
20cc0 6f 64 65 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ode );.  }else i
20cd0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
20ce0 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
20cf0 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
20d00 4c 4c 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20  LL ){.    /* Do 
20d10 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c  nothing */.  }el
20d20 73 65 20 69 66 28 20 28 70 50 67 20 3d 20 70 61  se if( (pPg = pa
20d30 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
20d40 72 2c 20 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a  r, pgno))!=0 ){.
20d50 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
20d60 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
20d70 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
20d80 65 74 75 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a  eturn pPg;.}../*
20d90 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
20da0 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
20db0 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
20dc0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
20dd0 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
20de0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
20df0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
20e00 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
20e10 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
20e20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
20e30 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
20e40 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
20e50 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
20e60 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
20e70 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
20e80 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 55  nt sqlite3PagerU
20e90 6e 72 65 66 28 44 62 50 61 67 65 20 2a 70 50 67  nref(DbPage *pPg
20ea0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
20eb0 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d  er;..  if( pPg==
20ec0 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
20ed0 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d  E_OK;.  pPager =
20ee0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20   pPg->pPager;.. 
20ef0 20 2f 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68   /* Decrement th
20f00 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
20f10 74 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a  t for this page.
20f20 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
20f30 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20  Pg->nRef>0 );.  
20f40 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
20f50 70 50 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e  pPager);.  pPg->
20f60 6e 52 65 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b  nRef--;..  CHECK
20f70 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f  _PAGE(pPg);..  /
20f80 2a 20 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65  * When the numbe
20f90 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
20fa0 74 6f 20 61 20 70 61 67 65 20 72 65 61 63 68 20  to a page reach 
20fb0 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a  0, call the.  **
20fc0 20 64 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20   destructor and 
20fd0 61 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20  add the page to 
20fe0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20  the freelist..  
20ff0 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  */.  if( pPg->nR
21000 65 66 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72  ef==0 ){..    lr
21010 75 4c 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20  uListAdd(pPg);. 
21020 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
21030 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
21040 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
21050 74 72 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61  tructor(pPg, pPa
21060 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
21070 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
21080 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72  When all pages r
21090 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69 73  each the freelis
210a0 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61 64  t, drop the read
210b0 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a   lock from.    *
210c0 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
210d0 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ile..    */.    
210e0 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a  pPager->nRef--;.
210f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
21100 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20  er->nRef>=0 );. 
21110 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
21120 52 65 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67  Ref==0 && (!pPag
21130 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
21140 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e || pPager->jou
21150 72 6e 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20  rnalOff>0) ){.  
21160 20 20 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41      pagerUnlockA
21170 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  ndRollback(pPage
21180 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
21190 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
211a0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
211b0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
211c0 20 43 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61   Create a journa
211d0 6c 20 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65  l file for pPage
211e0 72 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  r.  There should
211f0 20 61 6c 72 65 61 64 79 20 62 65 20 61 20 52 45   already be a RE
21200 53 45 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43  SERVED.** or EXC
21210 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
21220 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
21230 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
21240 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  ne is called..**
21250 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54  .** Return SQLIT
21260 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
21270 6e 67 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65  ng.  Return an e
21280 72 72 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65  rror code and re
21290 6c 65 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69  lease the.** wri
212a0 74 65 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68  te lock if anyth
212b0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a  ing goes wrong..
212c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
212d0 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
212e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
212f0 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
21300 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
21310 56 66 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73  Vfs;.  int flags
21320 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f   = (SQLITE_OPEN_
21330 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
21340 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c  _OPEN_EXCLUSIVE|
21350 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
21360 54 45 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a  TE);..  int rc;.
21370 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
21380 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
21390 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
213a0 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20  ER_RESERVED );. 
213b0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
213c0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
213d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
213e0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >pInJournal==0 )
213f0 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  ;.  sqlite3Pager
21400 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
21410 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
21420 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
21430 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->pInJournal = 
21440 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65  sqlite3BitvecCre
21450 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69  ate(pPager->dbSi
21460 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65  ze);.  pagerEnte
21470 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
21480 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21490 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
214a0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
214b0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
214c0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
214d0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
214e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
214f0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ==0 ){.    if( p
21500 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
21510 29 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  ){.      flags |
21520 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44  = (SQLITE_OPEN_D
21530 45 4c 45 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c  ELETEONCLOSE|SQL
21540 49 54 45 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f  ITE_OPEN_TEMP_JO
21550 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73  URNAL);.    }els
21560 65 7b 0a 20 20 20 20 20 20 66 6c 61 67 73 20 7c  e{.      flags |
21570 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  = (SQLITE_OPEN_M
21580 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
21590 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54    }.#ifdef SQLIT
215a0 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f  E_ENABLE_ATOMIC_
215b0 57 52 49 54 45 0a 20 20 20 20 72 63 20 3d 20 73  WRITE.    rc = s
215c0 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65  qlite3JournalOpe
215d0 6e 28 0a 20 20 20 20 20 20 20 20 70 56 66 73 2c  n(.        pVfs,
215e0 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
215f0 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
21600 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
21610 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
21620 20 20 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72    );.#else.    r
21630 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
21640 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
21650 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72  zJournal, pPager
21660 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c 20 30 29  ->jfd, flags, 0)
21670 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 61 73 73  ;.#endif.    ass
21680 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
21690 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66  OK || pPager->jf
216a0 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20  d->pMethods );. 
216b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
216c0 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 70  alOff = 0;.    p
216d0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
216e0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
216f0 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30  ->journalHdr = 0
21700 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
21710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
21720 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
21730 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 20  NOMEM ){.       
21740 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
21750 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
21760 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
21770 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
21780 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
21790 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20  ournal;.    }.  
217a0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
217b0 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70  nalOpen = 1;.  p
217c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
217d0 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  arted = 0;.  pPa
217e0 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
217f0 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77  0;.  pPager->alw
21800 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b  aysRollback = 0;
21810 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  .  pPager->nRec 
21820 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
21830 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
21840 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
21850 72 72 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f  rrCode;.    goto
21860 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
21870 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70  journal;.  }.  p
21880 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21890 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
218a0 7a 65 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  ze;..  rc = writ
218b0 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
218c0 65 72 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67  er);..  if( pPag
218d0 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
218e0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
218f0 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
21900 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
21910 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
21920 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
21930 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
21940 54 45 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d  TE_NOMEM && rc!=
21950 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d  SQLITE_IOERR_NOM
21960 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
21970 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
21980 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 30 29 3b  tion(pPager, 0);
21990 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
219a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
219b0 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c  rc = SQLITE_FULL
219c0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
219d0 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64  turn rc;..failed
219e0 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
219f0 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  :.  sqlite3Bitve
21a00 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d  cDestroy(pPager-
21a10 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >pInJournal);.  
21a20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21a30 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  al = 0;.  return
21a40 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63   rc;.}../*.** Ac
21a50 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c 6f  quire a write-lo
21a60 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
21a70 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69 73  se.  The lock is
21a80 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a   removed when.**
21a90 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65 20   the any of the 
21aa0 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e  following happen
21ab0 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  :.**.**   *  sql
21ac0 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
21ad0 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61 6c  haseTwo() is cal
21ae0 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
21af0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
21b00 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
21b10 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50 61  *   *  sqlite3Pa
21b20 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63 61  gerClose() is ca
21b30 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
21b40 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
21b50 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
21b60 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
21b70 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
21b80 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
21b90 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
21ba0 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
21bb0 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
21bc0 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
21bd0 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
21be0 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
21bf0 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
21c00 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
21c10 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
21c20 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
21c30 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
21c40 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
21c50 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
21c60 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
21c70 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
21c80 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
21c90 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
21ca0 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
21cb0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
21cc0 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
21cd0 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
21ce0 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
21cf0 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
21d00 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
21d10 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
21d20 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
21d30 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
21d40 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
21d50 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
21d60 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
21d70 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
21d80 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
21d90 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
21da0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
21db0 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
21dc0 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
21dd0 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
21de0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
21df0 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
21e00 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
21e10 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
21e20 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
21e30 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
21e40 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
21e50 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
21e60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
21e70 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
21e80 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
21e90 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
21ea0 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
21eb0 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
21ec0 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
21ed0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
21ee0 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
21ef0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
21f00 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50 61  3PagerBegin(DbPa
21f10 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78 46  ge *pPg, int exF
21f20 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  lag){.  Pager *p
21f30 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
21f40 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ger;.  int rc = 
21f50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67  SQLITE_OK;.  pag
21f60 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
21f70 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
21f80 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
21f90 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
21fa0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
21fb0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
21fc0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
21fd0 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
21fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
21ff0 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
22000 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
22010 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
22020 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
22030 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
22040 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
22050 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
22060 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
22080 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
22090 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a  RESERVED_LOCK);.
220a0 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
220b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
220c0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
220d0 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56 45   = PAGER_RESERVE
220e0 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 65  D;.        if( e
220f0 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20 20  xFlag ){.       
22100 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
22110 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
22120 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  r, EXCLUSIVE_LOC
22130 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  K);.        }.  
22140 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
22150 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
22160 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c 65  .        pagerLe
22170 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
22180 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22190 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
221a0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
221b0 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47 45   = 0;.      PAGE
221c0 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43  RTRACE2("TRANSAC
221d0 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
221e0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
221f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22200 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
22210 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a  Pager->tempFile.
22220 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
22230 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
22240 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
22250 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
22260 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
22270 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
22280 61 67 65 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ager);.      }. 
22290 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28     }.  }else if(
222a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
222b0 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
222c0 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b  journalOff==0 ){
222d0 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 70  .    /* This hap
222e0 70 65 6e 73 20 77 68 65 6e 20 74 68 65 20 70 61  pens when the pa
222f0 67 65 72 20 77 61 73 20 69 6e 20 65 78 63 6c 75  ger was in exclu
22300 73 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65  sive-access mode
22310 20 74 68 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a   the last.    **
22320 20 74 69 6d 65 20 61 20 28 72 65 61 64 20 6f 72   time a (read or
22330 20 77 72 69 74 65 29 20 74 72 61 6e 73 61 63 74   write) transact
22340 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73 73 66  ion was successf
22350 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20  ully concluded. 
22360 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20 63 6f     ** by this co
22370 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  nnection. Instea
22380 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20 74 68  d of deleting th
22390 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  e journal file i
223a0 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65  t was .    ** ke
223b0 70 74 20 6f 70 65 6e 20 61 6e 64 20 65 69 74 68  pt open and eith
223c0 65 72 20 77 61 73 20 74 72 75 6e 63 61 74 65 64  er was truncated
223d0 20 74 6f 20 30 20 62 79 74 65 73 20 6f 72 20 69   to 0 bytes or i
223e0 74 73 20 68 65 61 64 65 72 20 77 61 73 0a 20 20  ts header was.  
223f0 20 20 2a 2a 20 6f 76 65 72 77 72 69 74 74 65 6e    ** overwritten
22400 20 77 69 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20   with zeros..   
22410 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
22420 70 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20  pPager->nRec==0 
22430 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
22440 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
22450 65 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  e==0 );.    asse
22460 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a  rt( pPager->pInJ
22470 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
22480 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
22490 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
224a0 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
224b0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
224c0 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
224d0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
224e0 65 61 74 65 28 20 70 50 61 67 65 72 2d 3e 64 62  eate( pPager->db
224f0 53 69 7a 65 20 29 3b 0a 20 20 20 20 70 61 67 65  Size );.    page
22500 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  rEnter(pPager);.
22510 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
22520 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  >pInJournal ){. 
22530 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
22540 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
22550 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
22560 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
22570 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20  ager->dbSize;.  
22580 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
22590 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
225a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
225b0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6a  sert( !pPager->j
225c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50  ournalOpen || pP
225d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
225e0 3e 30 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45  >0 || rc!=SQLITE
225f0 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  _OK );.  pagerLe
22600 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
22610 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
22620 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
22630 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
22640 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
22650 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
22660 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
22670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
22680 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
22690 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
226a0 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
226b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
226c0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
226d0 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
226e0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
226f0 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
22700 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
22710 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
22720 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
22730 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
22740 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
22750 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
22760 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
22770 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
22780 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
22790 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
227a0 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
227b0 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
227c0 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
227d0 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
227e0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
227f0 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
22800 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
22810 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
22820 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
22830 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
22840 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
22850 28 20 70 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70  ( pPg->pDirty->p
22860 50 72 65 76 44 69 72 74 79 3d 3d 70 50 67 20 29  PrevDirty==pPg )
22870 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 44 69  ;.      pPg->pDi
22880 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20  rty->pPrevDirty 
22890 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  = pPg->pPrevDirt
228a0 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  y;.    }.    if(
228b0 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79   pPg->pPrevDirty
228c0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
228d0 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74  ( pPg->pPrevDirt
228e0 79 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29  y->pDirty==pPg )
228f0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72  ;.      pPg->pPr
22900 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79 20  evDirty->pDirty 
22910 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
22920 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22930 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61  assert( pPg->pPa
22940 67 65 72 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67  ger->pDirty==pPg
22950 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
22960 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d 20  Pager->pDirty = 
22970 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
22980 20 7d 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   }.  }.}.../*.**
22990 20 4d 61 72 6b 20 61 20 64 61 74 61 20 70 61 67   Mark a data pag
229a0 65 20 61 73 20 77 72 69 74 65 61 62 6c 65 2e 20  e as writeable. 
229b0 20 54 68 65 20 70 61 67 65 20 69 73 20 77 72 69   The page is wri
229c0 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f  tten into the jo
229d0 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20  urnal .** if it 
229e0 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
229f0 65 61 64 79 2e 20 20 54 68 69 73 20 72 6f 75 74  eady.  This rout
22a00 69 6e 65 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ine must be call
22a10 65 64 20 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67  ed before making
22a20 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 61  .** changes to a
22a30 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
22a40 20 66 69 72 73 74 20 74 69 6d 65 20 74 68 69 73   first time this
22a50 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
22a60 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 63 72  ed, the pager cr
22a70 65 61 74 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a  eates a new.** j
22a80 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63 71 75 69  ournal and acqui
22a90 72 65 73 20 61 20 52 45 53 45 52 56 45 44 20 6c  res a RESERVED l
22aa0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
22ab0 61 73 65 2e 20 20 49 66 20 74 68 65 20 52 45 53  ase.  If the RES
22ac0 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f  ERVED.** lock co
22ad0 75 6c 64 20 6e 6f 74 20 62 65 20 61 63 71 75 69  uld not be acqui
22ae0 72 65 64 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  red, this routin
22af0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
22b00 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63  _BUSY.  The.** c
22b10 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d  alling routine m
22b20 75 73 74 20 63 68 65 63 6b 20 66 6f 72 20 74 68  ust check for th
22b30 61 74 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  at return value 
22b40 61 6e 64 20 62 65 20 63 61 72 65 66 75 6c 20 6e  and be careful n
22b50 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20  ot to.** change 
22b60 61 6e 79 20 70 61 67 65 20 64 61 74 61 20 75 6e  any page data un
22b70 74 69 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  til this routine
22b80 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
22b90 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  OK..**.** If the
22ba0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f   journal file co
22bb0 75 6c 64 20 6e 6f 74 20 62 65 20 77 72 69 74 74  uld not be writt
22bc0 65 6e 20 62 65 63 61 75 73 65 20 74 68 65 20 64  en because the d
22bd0 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20  isk is full,.** 
22be0 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
22bf0 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45  e returns SQLITE
22c00 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61  _FULL and does a
22c10 6e 20 69 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c  n immediate roll
22c20 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62  back..** All sub
22c30 73 65 71 75 65 6e 74 20 77 72 69 74 65 20 61 74  sequent write at
22c40 74 65 6d 70 74 73 20 61 6c 73 6f 20 72 65 74 75  tempts also retu
22c50 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75  rn SQLITE_FULL u
22c60 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73  ntil there.** is
22c70 20 61 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74   a call to sqlit
22c80 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 28 29 20  e3PagerCommit() 
22c90 6f 72 20 73 71 6c 69 74 65 33 50 61 67 65 72 52  or sqlite3PagerR
22ca0 6f 6c 6c 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20  ollback() to.** 
22cb0 72 65 73 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  reset..*/.static
22cc0 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
22cd0 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
22ce0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 50 47  void *pData = PG
22cf0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
22d00 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
22d10 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
22d20 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
22d30 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65  TE_OK;..  /* Che
22d40 63 6b 20 66 6f 72 20 65 72 72 6f 72 73 0a 20 20  ck for errors.  
22d50 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
22d60 3e 65 72 72 43 6f 64 65 20 29 7b 20 0a 20 20 20  >errCode ){ .   
22d70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
22d80 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69  errCode;.  }.  i
22d90 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  f( pPager->readO
22da0 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72  nly ){.    retur
22db0 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20  n SQLITE_PERM;. 
22dc0 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70   }..  assert( !p
22dd0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
22de0 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47   );..  CHECK_PAG
22df0 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  E(pPg);..  /* If
22e00 20 74 68 69 73 20 70 61 67 65 20 77 61 73 20 70   this page was p
22e10 72 65 76 69 6f 75 73 6c 79 20 61 63 71 75 69 72  reviously acquir
22e20 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e  ed with noConten
22e30 74 3d 3d 31 2c 20 74 68 61 74 20 6d 65 61 6e 73  t==1, that means
22e40 0a 20 20 2a 2a 20 77 65 20 64 69 64 6e 27 74 20  .  ** we didn't 
22e50 72 65 61 6c 6c 79 20 72 65 61 64 20 69 6e 20 74  really read in t
22e60 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68  he content of th
22e70 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 63 61  e page.  This ca
22e80 6e 20 68 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66  n happen.  ** (f
22e90 6f 72 20 65 78 61 6d 70 6c 65 29 20 77 68 65 6e  or example) when
22ea0 20 74 68 65 20 70 61 67 65 20 69 73 20 62 65 69   the page is bei
22eb0 6e 67 20 6d 6f 76 65 64 20 74 6f 20 74 68 65 20  ng moved to the 
22ec0 66 72 65 65 6c 69 73 74 2e 20 20 42 75 74 0a 20  freelist.  But. 
22ed0 20 2a 2a 20 6e 6f 77 20 77 65 20 61 72 65 20 28   ** now we are (
22ee0 70 65 72 68 61 70 73 29 20 6d 6f 76 69 6e 67 20  perhaps) moving 
22ef0 74 68 65 20 70 61 67 65 20 6f 66 66 20 6f 66 20  the page off of 
22f00 74 68 65 20 66 72 65 65 6c 69 73 74 20 66 6f 72  the freelist for
22f10 0a 20 20 2a 2a 20 72 65 75 73 65 20 61 6e 64 20  .  ** reuse and 
22f20 77 65 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20  we need to know 
22f30 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e  its original con
22f40 74 65 6e 74 20 73 6f 20 74 68 61 74 20 63 6f 6e  tent so that con
22f50 74 65 6e 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65  tent.  ** can be
22f60 20 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 72   stored in the r
22f70 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
22f80 20 20 53 6f 20 64 6f 20 74 68 65 20 72 65 61 64    So do the read
22f90 20 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 74 69   at this.  ** ti
22fa0 6d 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  me..  */.  rc = 
22fb0 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e  pager_get_conten
22fc0 74 28 70 50 67 29 3b 0a 20 20 69 66 28 20 72 63  t(pPg);.  if( rc
22fd0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
22fe0 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72  c;.  }..  /* Mar
22ff0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
23000 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
23010 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
23020 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
23030 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
23040 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
23050 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
23060 2a 2f 0a 20 20 6d 61 6b 65 44 69 72 74 79 28 70  */.  makeDirty(p
23070 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
23080 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 61  inJournal && (pa
23090 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
230a0 67 29 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74  g) || pPager->st
230b0 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20  mtInUse==0) ){. 
230c0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
230d0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70  Cache = 1;.    p
230e0 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65  Pager->dbModifie
230f0 64 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  d = 1;.  }else{.
23100 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65  .    /* If we ge
23110 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d  t this far, it m
23120 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61  eans that the pa
23130 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20  ge needs to be. 
23140 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f     ** written to
23150 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
23160 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20   journal or the 
23170 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e  ckeckpoint journ
23180 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74  al.    ** or bot
23190 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
231a0 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20   First check to 
231b0 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72 61  see that the tra
231c0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
231d0 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20   exists and.    
231e0 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66 20  ** create it if 
231f0 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20  it does not..   
23200 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
23210 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
23220 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20  AGER_UNLOCK );. 
23230 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23240 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30  agerBegin(pPg, 0
23250 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
23260 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
23270 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
23280 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
23290 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
232a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
232b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
232c0 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
232d0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
232e0 61 6c 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  al.          && 
232f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d  pPager->journalM
23300 6f 64 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e  ode!=PAGER_JOURN
23310 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20  ALMODE_OFF ){.  
23320 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
23330 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
23340 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
23350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
23360 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23370 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
23380 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 20 20  yCache = 1;.    
23390 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69  pPager->dbModifi
233a0 65 64 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  ed = 1;.  .    /
233b0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
233c0 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
233d0 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
233e0 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
233f0 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
23400 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
23410 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
23420 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
23430 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
23440 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
23450 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
23460 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
23470 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
23480 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
23490 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
234a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
234b0 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
234c0 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
234d0 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
234e0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
234f0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
23500 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
23510 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
23520 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
23530 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
23540 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
23550 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
23560 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
23570 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
23580 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
23590 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
235a0 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
235b0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
235c0 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  rig = sqlite3_ma
235d0 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
235e0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
235f0 20 20 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e      if( !pHist->
23600 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
23610 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
23620 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
23630 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
23640 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
23650 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
23660 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
23670 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
23680 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23690 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
236a0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
236b0 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
236c0 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
236d0 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
236e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
236f0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
23700 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
23710 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
23720 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
23730 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
23740 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
23750 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
23760 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
23770 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
23780 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
23790 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
237a0 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
237b0 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
237c0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
237d0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
237e0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
237f0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
23800 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
23810 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
23820 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
23830 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
23840 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
23850 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
23860 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23870 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
23880 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
23890 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
238a0 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
238b0 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
238c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
238d0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
238e0 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
238f0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
23900 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
23910 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
23920 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+4;.          
23930 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
23940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23950 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
23960 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
23970 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
23980 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
23990 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
239a0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
239b0 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
239c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
239d0 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
239e0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
239f0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
23a00 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
23a10 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
23a20 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
23a30 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
23a40 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
23a50 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
23a60 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
23a70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  t);.          PA
23a80 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
23a90 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
23aa0 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
23ab0 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
23ac0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
23ad0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
23ae0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
23af0 63 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  c, pager_pagehas
23b00 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20  h(pPg));..      
23b10 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
23b20 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
23b30 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
23b40 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
23b50 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
23b60 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
23b70 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
23b80 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
23b90 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
23ba0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23bb0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
23bc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
23bd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
23be0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
23bf0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
23c00 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23c10 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
23c20 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
23c30 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
23c40 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
23c50 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
23c60 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
23c70 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
23c80 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
23c90 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
23ca0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
23cb0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
23cc0 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
23cd0 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
23ce0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
23cf0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23d00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23d10 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
23d20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
23d30 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
23d40 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
23d50 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
23d60 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
23d70 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
23d80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
23d90 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
23da0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
23db0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
23dc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
23dd0 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
23de0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
23df0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
23e00 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
23e10 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
23e20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
23e30 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
23e40 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
23e50 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
23e60 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
23e70 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
23e80 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
23e90 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
23ea0 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
23eb0 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
23ec0 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
23ed0 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
23ee0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
23ef0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
23f00 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
23f10 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
23f20 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
23f30 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
23f40 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
23f50 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20  ->stmtInUse .   
23f60 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74    && !pageInStat
23f70 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20  ement(pPg) .    
23f80 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
23f90 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
23fa0 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Size .    ){.   
23fb0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
23fc0 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
23fd0 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
23fe0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
23ff0 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
24000 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
24010 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
24020 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
24030 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
24040 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
24050 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
24060 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
24070 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  tmt = sqlite3_ma
24080 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
24090 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
240a0 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
240b0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
240c0 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
240d0 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
240e0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
240f0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
24100 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
24110 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
24120 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
24130 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
24140 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
24150 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  o);.        page
24160 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
24170 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65  t(pPg);.      }e
24180 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
24190 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
241a0 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
241b0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
241c0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
241d0 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
241e0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
241f0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
24200 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
24210 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74  2bits(pPager->st
24220 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
24230 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
24240 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
24250 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
24260 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
24270 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
24280 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
24290 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
242a0 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+4);.        }.
242b0 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
242c0 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
242d0 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
242e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
242f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
24300 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
24310 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
24320 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
24330 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24340 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
24350 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
24360 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
24370 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
24380 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
24390 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
243a0 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
243b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
243c0 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
243d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
243e0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
243f0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
24400 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
24410 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
24420 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
24430 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
24440 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
24450 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
24460 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
24470 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
24480 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
24490 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
244a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
244b0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
244c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
244d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
244e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
244f0 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
24500 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
24510 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
24520 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
24530 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
24540 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
24550 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
24560 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
24570 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
24580 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
24590 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
245a0 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
245b0 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
245c0 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
245d0 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
245e0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
245f0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
24600 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
24610 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
24620 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
24630 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
24640 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
24650 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
24660 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
24670 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
24680 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
24690 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
246a0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
246b0 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
246c0 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
246d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
246e0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
246f0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
24700 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
24710 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
24720 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
24730 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
24740 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
24750 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72  eSize);..  pager
24760 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
24770 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
24780 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
24790 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
247a0 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
247b0 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
247c0 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
247d0 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
247e0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
247f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
24800 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
24810 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
24820 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
24830 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
24840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
24850 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
24860 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
24870 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
24880 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
24890 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
248a0 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
248b0 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
248c0 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
248d0 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
248e0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
248f0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
24900 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
24910 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
24920 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
24930 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
24940 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
24950 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
24960 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
24970 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
24980 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
24990 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
249a0 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
249b0 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
249c0 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
249d0 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
249e0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
249f0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
24a00 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
24a10 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
24a20 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
24a30 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
24a40 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
24a50 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
24a60 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
24a70 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
24a80 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
24a90 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
24aa0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
24ab0 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
24ac0 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
24ad0 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
24ae0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
24af0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
24b00 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
24b10 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
24b20 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
24b30 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
24b40 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
24b50 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
24b60 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
24b70 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
24b80 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
24b90 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
24ba0 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
24bb0 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
24bc0 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
24bd0 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
24be0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
24bf0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
24c00 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
24c10 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
24c20 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
24c30 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
24c40 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
24c50 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
24c60 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
24c70 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
24c80 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
24c90 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
24ca0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
24cb0 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
24cc0 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
24cd0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
24ce0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
24cf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
24d00 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
24d10 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
24d20 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
24d30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24d40 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
24d50 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
24d60 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
24d70 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
24d80 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
24d90 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24da0 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
24db0 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
24dc0 70 50 61 67 65 72 2c 20 70 67 29 29 21 3d 30 20  pPager, pg))!=0 
24dd0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
24de0 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29  Page->needSync )
24df0 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 65 65 64  {.          need
24e00 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
24e10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24e20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  }..    /* If the
24e30 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
24e40 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f 72 20  flag is set for 
24e50 61 6e 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65  any of the nPage
24e60 20 70 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73   pages .    ** s
24e70 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20  tarting at pg1, 
24e80 74 68 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f  then it needs to
24e90 20 62 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20   be set for all 
24ea0 6f 66 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65  of them. Because
24eb0 0a 20 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20  .    ** writing 
24ec0 74 6f 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20  to any of these 
24ed0 6e 50 61 67 65 20 70 61 67 65 73 20 6d 61 79 20  nPage pages may 
24ee0 64 61 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72  damage the other
24ef0 73 2c 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f  s, the.    ** jo
24f00 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
24f10 63 6f 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64  contain sync()ed
24f20 20 63 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f   copies of all o
24f30 66 20 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65  f them.    ** be
24f40 66 6f 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d  fore any of them
24f50 20 63 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20   can be written 
24f60 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
24f70 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f  ase file..    */
24f80 0a 20 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e  .    if( needSyn
24f90 63 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  c ){.      for(i
24fa0 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26  i=0; ii<nPage &&
24fb0 20 6e 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29   needSync; ii++)
24fc0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20  {.        PgHdr 
24fd0 2a 70 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c  *pPage = pager_l
24fe0 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
24ff0 31 2b 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69  1+ii);.        i
25000 66 28 20 70 50 61 67 65 20 29 20 70 50 61 67 65  f( pPage ) pPage
25010 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
25020 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
25030 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65  sert(pPager->nee
25040 64 53 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20  dSync);.    }.. 
25050 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25060 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20  r->doNotSync==1 
25070 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
25080 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20  oNotSync = 0;.  
25090 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
250a0 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62 50  pager_write(pDbP
250b0 61 67 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  age);.  }.  page
250c0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
250d0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
250e0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
250f0 45 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69  E if the page gi
25100 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d  ven in the argum
25110 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73  ent was previous
25120 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20  ly passed.** to 
25130 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
25140 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
25150 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
25160 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
25170 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
25180 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
25190 67 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  ge..*/.#ifndef N
251a0 44 45 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65  DEBUG.int sqlite
251b0 33 50 61 67 65 72 49 73 77 72 69 74 65 61 62 6c  3PagerIswriteabl
251c0 65 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  e(DbPage *pPg){.
251d0 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69    return pPg->di
251e0 72 74 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  rty;.}.#endif../
251f0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
25200 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
25210 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
25220 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
25230 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
25240 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
25250 20 6f 6e 20 70 61 67 65 20 70 50 67 20 62 61 63   on page pPg bac
25260 6b 20 74 6f 20 74 68 65 20 64 69 73 6b 2c 20 65  k to the disk, e
25270 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68  ven though.** th
25280 61 74 20 70 61 67 65 20 6d 69 67 68 74 20 62 65  at page might be
25290 20 6d 61 72 6b 65 64 20 61 73 20 64 69 72 74 79   marked as dirty
252a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72  ..**.** The over
252b0 6c 79 69 6e 67 20 73 6f 66 74 77 61 72 65 20 6c  lying software l
252c0 61 79 65 72 20 63 61 6c 6c 73 20 74 68 69 73 20  ayer calls this 
252d0 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c  routine when all
252e0 20 6f 66 20 74 68 65 20 64 61 74 61 0a 2a 2a 20   of the data.** 
252f0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
25300 65 20 69 73 20 75 6e 75 73 65 64 2e 20 20 54 68  e is unused.  Th
25310 65 20 70 61 67 65 72 20 6d 61 72 6b 73 20 74 68  e pager marks th
25320 65 20 70 61 67 65 20 61 73 20 63 6c 65 61 6e 20  e page as clean 
25330 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74 20 64 6f  so.** that it do
25340 65 73 20 6e 6f 74 20 67 65 74 20 77 72 69 74 74  es not get writt
25350 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a  en to disk..**.*
25360 2a 20 54 65 73 74 73 20 73 68 6f 77 20 74 68 61  * Tests show tha
25370 74 20 74 68 69 73 20 6f 70 74 69 6d 69 7a 61 74  t this optimizat
25380 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72 20 77 69  ion, together wi
25390 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  th the.** sqlite
253a0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
253b0 63 6b 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65  ck() below, more
253c0 20 74 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65   than double the
253d0 20 73 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72   speed.** of lar
253e0 67 65 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74  ge INSERT operat
253f0 69 6f 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70  ions and quadrup
25400 6c 65 20 74 68 65 20 73 70 65 65 64 20 6f 66 20  le the speed of 
25410 6c 61 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a  large DELETEs..*
25420 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
25430 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
25440 2c 20 73 65 74 20 74 68 65 20 61 6c 77 61 79 73  , set the always
25450 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f  Rollback flag to
25460 20 74 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71   true..** Subseq
25470 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71  uent calls to sq
25480 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
25490 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
254a0 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
254b0 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
254c0 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
254d0 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
254e0 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
254f0 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
25500 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
25510 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
25520 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
25530 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
25540 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
25550 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
25560 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
25570 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
25580 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
25590 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
255a0 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
255b0 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
255c0 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
255d0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
255e0 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
255f0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
25600 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
25610 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
25620 74 52 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74  tRollback() rout
25630 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20  ine is called.  
25640 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65 0a  But because the.
25650 2a 2a 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73  ** page contains
25660 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20   critical data, 
25670 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f  we still need to
25680 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73   be sure it gets
25690 0a 2a 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  .** rolled back 
256a0 69 6e 20 73 70 69 74 65 20 6f 66 20 74 68 65 20  in spite of the 
256b0 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
256c0 52 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e  Rollback() call.
256d0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
256e0 50 61 67 65 72 44 6f 6e 74 57 72 69 74 65 28 44  PagerDontWrite(D
256f0 62 50 61 67 65 20 2a 70 44 62 50 61 67 65 29 7b  bPage *pDbPage){
25700 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
25710 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72  pDbPage;.  Pager
25720 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
25730 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d  pPager;..  if( M
25740 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
25750 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
25760 65 72 29 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61  er);.  pPg->alwa
25770 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a  ysRollback = 1;.
25780 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79    if( pPg->dirty
25790 20 26 26 20 21 70 50 61 67 65 72 2d 3e 73 74 6d   && !pPager->stm
257a0 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
257b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
257c0 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45  ate>=PAGER_SHARE
257d0 44 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  D );.    if( pPa
257e0 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e  ger->dbSize==(in
257f0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70  t)pPg->pgno && p
25800 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
25810 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e<pPager->dbSize
25820 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20   ){.      /* If 
25830 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74 68  this pages is th
25840 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74  e last page in t
25850 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  he file and the 
25860 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20  file has grown. 
25870 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74       ** during t
25880 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73  he current trans
25890 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20  action, then do 
258a0 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67  NOT mark the pag
258b0 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20  e as clean..    
258c0 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61    ** When the da
258d0 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77  tabase file grow
258e0 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20  s, we must make 
258f0 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c 61  sure that the la
25900 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a  st page.      **
25910 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61 74   gets written at
25920 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74   least once so t
25930 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c  hat the disk fil
25940 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f  e will be the co
25950 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73  rrect.      ** s
25960 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e  ize. If you do n
25970 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70 61  ot write this pa
25980 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20  ge and the size 
25990 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  of the file.    
259a0 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b    ** on the disk
259b0 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74   ends up being t
259c0 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63  oo small, that c
259d0 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62  an lead to datab
259e0 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72  ase.      ** cor
259f0 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74  ruption during t
25a00 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74  he next transact
25a10 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion..      */.  
25a20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 50    }else{.      P
25a30 41 47 45 52 54 52 41 43 45 33 28 22 44 4f 4e 54  AGERTRACE3("DONT
25a40 5f 57 52 49 54 45 20 70 61 67 65 20 25 64 20 6f  _WRITE page %d o
25a50 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
25a60 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
25a70 65 72 29 29 3b 0a 20 20 20 20 20 20 49 4f 54 52  er));.      IOTR
25a80 41 43 45 28 28 22 43 4c 45 41 4e 20 25 70 20 25  ACE(("CLEAN %p %
25a90 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
25aa0 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20 20 20 20  g->pgno)).      
25ab0 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
25ac0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48  #ifdef SQLITE_CH
25ad0 45 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20  ECK_PAGES.      
25ae0 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20  pPg->pageHash = 
25af0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
25b00 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Pg);.#endif.    
25b10 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61  }.  }.  pagerLea
25b20 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f  ve(pPager);.}../
25b30 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
25b40 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
25b50 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
25b60 20 69 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f   if a rollback o
25b70 63 63 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20  ccurs,.** it is 
25b80 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
25b90 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
25ba0 61 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70  a on the given p
25bb0 61 67 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65  age.  This.** me
25bc0 61 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67  ans that the pag
25bd0 65 72 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65  er does not have
25be0 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67   to record the g
25bf0 69 76 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65  iven page in the
25c00 0a 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  .** rollback jou
25c10 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  rnal..**.** If w
25c20 65 20 68 61 76 65 20 6e 6f 74 20 79 65 74 20 61  e have not yet a
25c30 63 74 75 61 6c 6c 79 20 72 65 61 64 20 74 68 65  ctually read the
25c40 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 69 73   content of this
25c50 20 70 61 67 65 20 28 69 66 0a 2a 2a 20 74 68 65   page (if.** the
25c60 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
25c70 66 6c 61 67 20 69 73 20 73 65 74 29 20 74 68 65  flag is set) the
25c80 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  n this routine a
25c90 63 74 73 20 61 73 20 61 20 70 72 6f 6d 69 73 65  cts as a promise
25ca0 0a 2a 2a 20 74 68 61 74 20 77 65 20 77 69 6c 6c  .** that we will
25cb0 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f 20 72   never need to r
25cc0 65 61 64 20 74 68 65 20 70 61 67 65 20 63 6f 6e  ead the page con
25cd0 74 65 6e 74 20 69 6e 20 74 68 65 20 66 75 74 75  tent in the futu
25ce0 72 65 2e 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65  re..** so the ne
25cf0 65 64 52 65 61 64 20 66 6c 61 67 20 63 61 6e 20  edRead flag can 
25d00 62 65 20 63 6c 65 61 72 65 64 20 61 74 20 74 68  be cleared at th
25d10 69 73 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69  is point..*/.voi
25d20 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
25d30 6e 74 52 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67  ntRollback(DbPag
25d40 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
25d50 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
25d60 70 50 61 67 65 72 3b 0a 0a 20 20 70 61 67 65 72  pPager;..  pager
25d70 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
25d80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25d90 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
25da0 53 45 52 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20  SERVED );..  /* 
25db0 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  If the journal f
25dc0 69 6c 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c  ile is not open,
25dd0 20 6f 72 20 44 6f 6e 74 57 72 69 74 65 28 29 20   or DontWrite() 
25de0 68 61 73 20 62 65 65 6e 20 63 61 6c 6c 65 64 20  has been called 
25df0 6f 6e 0a 20 20 2a 2a 20 74 68 69 73 20 70 61 67  on.  ** this pag
25e00 65 20 28 44 6f 6e 74 57 72 69 74 65 28 29 20 73  e (DontWrite() s
25e10 65 74 73 20 74 68 65 20 61 6c 77 61 79 73 52 6f  ets the alwaysRo
25e20 6c 6c 62 61 63 6b 20 66 6c 61 67 29 2c 20 74 68  llback flag), th
25e30 65 6e 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e  en this.  ** fun
25e40 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
25e50 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
25e60 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
25e70 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61  ==0 || pPg->alwa
25e80 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50  ysRollback || pP
25e90 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
25ea0 62 61 63 6b 20 29 7b 0a 20 20 20 20 70 61 67 65  back ){.    page
25eb0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
25ec0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
25ed0 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
25ee0 20 29 3b 20 20 20 20 2f 2a 20 46 6f 72 20 61 20   );    /* For a 
25ef0 6d 65 6d 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a  memdb, pPager->j
25f00 6f 75 72 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c  ournalOpen is al
25f10 77 61 79 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65  ways 0 */..#ifde
25f20 66 20 53 51 4c 49 54 45 5f 53 45 43 55 52 45 5f  f SQLITE_SECURE_
25f30 44 45 4c 45 54 45 0a 20 20 69 66 28 20 70 50 67  DELETE.  if( pPg
25f40 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
25f50 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20  int)pPg->pgno > 
25f60 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
25f70 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
25f80 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20  ;.  }.#endif..  
25f90 2f 2a 20 49 66 20 53 45 43 55 52 45 5f 44 45 4c  /* If SECURE_DEL
25fa0 45 54 45 20 69 73 20 64 69 73 61 62 6c 65 64 2c  ETE is disabled,
25fb0 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
25fc0 6f 20 77 61 79 20 74 68 61 74 20 74 68 69 73 0a  o way that this.
25fd0 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e    ** routine can
25fe0 20 62 65 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20   be called on a 
25ff0 70 61 67 65 20 66 6f 72 20 77 68 69 63 68 20 73  page for which s
26000 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 57  qlite3PagerDontW
26010 72 69 74 65 28 29 0a 20 20 2a 2a 20 68 61 73 20  rite().  ** has 
26020 6e 6f 74 20 62 65 65 6e 20 70 72 65 76 69 6f 75  not been previou
26030 73 6c 79 20 63 61 6c 6c 65 64 20 64 75 72 69 6e  sly called durin
26040 67 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  g the same trans
26050 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64  action..  ** And
26060 20 69 66 20 44 6f 6e 74 57 72 69 74 65 28 29 20   if DontWrite() 
26070 68 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 62  has previously b
26080 65 65 6e 20 63 61 6c 6c 65 64 2c 20 74 68 65 20  een called, the 
26090 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
260a0 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
260b0 65 20 6d 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73  e met..  */.  as
260c0 73 65 72 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f  sert( !pPg->inJo
260d0 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50  urnal && (int)pP
260e0 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
260f0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
26100 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
26110 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->pInJournal!=
26120 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 42 69  0 );.  sqlite3Bi
26130 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e  tvecSet(pPager->
26140 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d  pInJournal, pPg-
26150 3e 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69  >pgno);.  pPg->i
26160 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
26170 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
26180 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
26190 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
261a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
261b0 2d 3e 73 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50  ->stmtSize >= pP
261c0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
261d0 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 42   );.    sqlite3B
261e0 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72 2d  itvecSet(pPager-
261f0 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70  >pInStmt, pPg->p
26200 67 6e 6f 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45  gno);.  }.  PAGE
26210 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
26220 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
26230 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
26240 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
26250 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28  er));.  IOTRACE(
26260 28 22 47 41 52 42 41 47 45 20 25 70 20 25 64 5c  ("GARBAGE %p %d\
26270 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
26280 3e 70 67 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c  >pgno)).  pagerL
26290 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a  eave(pPager);.}.
262a0 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
262b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74  tine is called t
262c0 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20  o increment the 
262d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68  database file ch
262e0 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a  ange-counter,.**
262f0 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20   stored at byte 
26300 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20  24 of the pager 
26310 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  file..*/.static 
26320 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  int pager_incr_c
26330 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67  hangecounter(Pag
26340 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
26350 69 73 44 69 72 65 63 74 29 7b 0a 20 20 50 67 48  isDirect){.  PgH
26360 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
26370 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
26380 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
26390 49 54 45 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21  ITE_OK;..  if( !
263a0 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
263b0 75 6e 74 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f  untDone ){.    /
263c0 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
263d0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
263e0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63  iting. */.    rc
263f0 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 47   = sqlite3PagerG
26400 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70  et(pPager, 1, &p
26410 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
26420 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26430 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
26440 69 66 28 20 21 69 73 44 69 72 65 63 74 20 29 7b  if( !isDirect ){
26450 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26460 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
26470 67 48 64 72 29 3b 0a 20 20 20 20 20 20 69 66 28  gHdr);.      if(
26480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
26490 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
264a0 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48  3PagerUnref(pPgH
264b0 64 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  dr);.        ret
264c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
264d0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e      }..    /* In
264e0 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
264f0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
26500 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
26510 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20   byte 24. */.   
26520 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
26530 3d 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74  = sqlite3Get4byt
26540 65 28 28 75 38 2a 29 70 50 61 67 65 72 2d 3e 64  e((u8*)pPager->d
26550 62 46 69 6c 65 56 65 72 73 29 3b 0a 20 20 20 20  bFileVers);.    
26560 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b  change_counter++
26570 3b 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28  ;.    put32bits(
26580 28 28 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f  ((char*)PGHDR_TO
26590 5f 44 41 54 41 28 70 50 67 48 64 72 29 29 2b 32  _DATA(pPgHdr))+2
265a0 34 2c 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65  4, change_counte
265b0 72 29 3b 0a 0a 20 20 20 20 69 66 28 20 69 73 44  r);..    if( isD
265c0 69 72 65 63 74 20 26 26 20 70 50 61 67 65 72 2d  irect && pPager-
265d0 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b  >fd->pMethods ){
265e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69  .      const voi
265f0 64 20 2a 7a 42 75 66 20 3d 20 50 47 48 44 52 5f  d *zBuf = PGHDR_
26600 54 4f 5f 44 41 54 41 28 70 50 67 48 64 72 29 3b  TO_DATA(pPgHdr);
26610 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
26620 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
26630 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50 61  r->fd, zBuf, pPa
26640 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30  ger->pageSize, 0
26650 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
26660 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67   Release the pag
26670 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a  e reference. */.
26680 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
26690 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20  Unref(pPgHdr);. 
266a0 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
266b0 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a  eCountDone = 1;.
266c0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
266d0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74  .}../*.** Sync t
266e0 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 74 6f  he pager file to
266f0 20 64 69 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71   disk..*/.int sq
26700 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28 50  lite3PagerSync(P
26710 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
26720 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
26730 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
26740 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
26750 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
26760 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
26770 67 73 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  gs);.  pagerLeav
26780 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
26790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
267a0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
267b0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
267c0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
267d0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
267e0 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
267f0 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
26800 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
26810 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
26820 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
26830 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
26840 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
26850 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
26860 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
26870 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
26880 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
26890 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
268a0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
268b0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
268c0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
268d0 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
268e0 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
268f0 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
26900 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
26910 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26920 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
26930 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
26940 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
26950 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
26960 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
26970 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
26980 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
26990 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
269a0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
269b0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
269c0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
269d0 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
269e0 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
269f0 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
26a00 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65  o an sqlite3Page
26a10 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
26a20 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ) call..**.** If
26a30 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e   parameter nTrun
26a40 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  c is non-zero, t
26a50 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69  hen the pager fi
26a60 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20  le is truncated 
26a70 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67  to.** nTrunc pag
26a80 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64  es (this is used
26a90 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20   by auto-vacuum 
26aa0 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a  databases)..**.*
26ab0 2a 20 49 66 20 74 68 65 20 66 69 6e 61 6c 20 70  * If the final p
26ac0 61 72 61 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e  arameter - noSyn
26ad0 63 20 2d 20 69 73 20 74 72 75 65 2c 20 74 68 65  c - is true, the
26ae0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
26af0 69 6c 65 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73  ile itself.** is
26b00 20 6e 6f 74 20 73 79 6e 63 65 64 2e 20 54 68 65   not synced. The
26b10 20 63 61 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c   caller must cal
26b20 6c 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 79  l sqlite3PagerSy
26b30 6e 63 28 29 20 64 69 72 65 63 74 6c 79 20 74 6f  nc() directly to
26b40 0a 2a 2a 20 73 79 6e 63 20 74 68 65 20 64 61 74  .** sync the dat
26b50 61 62 61 73 65 20 66 69 6c 65 20 62 65 66 6f 72  abase file befor
26b60 65 20 63 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74  e calling Commit
26b70 50 68 61 73 65 54 77 6f 28 29 20 74 6f 20 64 65  PhaseTwo() to de
26b80 6c 65 74 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  lete the.** jour
26b90 6e 61 6c 20 66 69 6c 65 20 69 6e 20 74 68 69 73  nal file in this
26ba0 20 63 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   case..*/.int sq
26bb0 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
26bc0 50 68 61 73 65 4f 6e 65 28 0a 20 20 50 61 67 65  PhaseOne(.  Page
26bd0 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 63 6f  r *pPager, .  co
26be0 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  nst char *zMaste
26bf0 72 2c 20 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e  r, .  Pgno nTrun
26c00 63 2c 0a 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a  c,.  int noSync.
26c10 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
26c20 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49  LITE_OK;..  /* I
26c30 66 20 6e 6f 20 63 68 61 6e 67 65 73 20 68 61 76  f no changes hav
26c40 65 20 62 65 65 6e 20 6d 61 64 65 2c 20 77 65 20  e been made, we 
26c50 63 61 6e 20 6c 65 61 76 65 20 74 68 65 20 74 72  can leave the tr
26c60 61 6e 73 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e  ansaction early.
26c70 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
26c80 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d  er->dbModified==
26c90 30 20 26 26 0a 20 20 20 20 20 20 20 20 28 70 50  0 &&.        (pP
26ca0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64  ager->journalMod
26cb0 65 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c  e!=PAGER_JOURNAL
26cc0 4d 4f 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20  MODE_DELETE ||. 
26cd0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
26ce0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d  >exclusiveMode!=
26cf0 30 29 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  0) ){.    assert
26d00 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
26d10 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65  ache==0 || pPage
26d20 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
26d30 30 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 );.    return 
26d40 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
26d50 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22 44    PAGERTRACE4("D
26d60 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
26d70 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
26d80 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
26d90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
26da0 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
26db0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 70 61 67  , nTrunc);.  pag
26dc0 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
26dd0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69  ..  /* If this i
26de0 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  s an in-memory d
26df0 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73 20 68  b, or no pages h
26e00 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ave been written
26e10 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a   to, or this.  *
26e20 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73 20 61  * function has a
26e30 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61 6c 6c  lready been call
26e40 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f  ed, it is a no-o
26e50 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  p..  */.  if( pP
26e60 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
26e70 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21 4d 45  ER_SYNCED && !ME
26e80 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64  MDB && pPager->d
26e90 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20 20 20  irtyCache ){.   
26ea0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69   PgHdr *pPg;..#i
26eb0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
26ec0 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a  LE_ATOMIC_WRITE.
26ed0 20 20 20 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69      /* The atomi
26ee0 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69 7a 61  c-write optimiza
26ef0 74 69 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64  tion can be used
26f00 20 69 66 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20   if all of the. 
26f10 20 20 20 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20     ** following 
26f20 61 72 65 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a  are true:.    **
26f30 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65  .    **    + The
26f40 20 66 69 6c 65 2d 73 79 73 74 65 6d 20 73 75 70   file-system sup
26f50 70 6f 72 74 73 20 74 68 65 20 61 74 6f 6d 69 63  ports the atomic
26f60 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79 20  -write property 
26f70 66 6f 72 0a 20 20 20 20 2a 2a 20 20 20 20 20 20  for.    **      
26f80 62 6c 6f 63 6b 73 20 6f 66 20 73 69 7a 65 20 70  blocks of size p
26f90 61 67 65 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20  age-size, and.  
26fa0 20 20 2a 2a 20 20 20 20 2b 20 54 68 69 73 20 63    **    + This c
26fb0 6f 6d 6d 69 74 20 69 73 20 6e 6f 74 20 70 61 72  ommit is not par
26fc0 74 20 6f 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c  t of a multi-fil
26fd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61  e transaction, a
26fe0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 45  nd.    **    + E
26ff0 78 61 63 74 6c 79 20 6f 6e 65 20 70 61 67 65 20  xactly one page 
27000 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
27010 64 20 61 6e 64 20 73 74 6f 72 65 20 69 6e 20 74  d and store in t
27020 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
27030 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
27040 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69  f the optimizati
27050 6f 6e 20 63 61 6e 20 62 65 20 75 73 65 64 2c 20  on can be used, 
27060 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
27070 20 66 69 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72   file will never
27080 0a 20 20 20 20 2a 2a 20 62 65 20 63 72 65 61 74  .    ** be creat
27090 65 64 20 66 6f 72 20 74 68 69 73 20 74 72 61 6e  ed for this tran
270a0 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  saction..    */.
270b0 20 20 20 20 69 6e 74 20 75 73 65 41 74 6f 6d 69      int useAtomi
270c0 63 57 72 69 74 65 20 3d 20 28 0a 20 20 20 20 20  cWrite = (.     
270d0 20 20 20 21 7a 4d 61 73 74 65 72 20 26 26 20 0a     !zMaster && .
270e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
270f0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20  journalOpen &&. 
27100 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
27110 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42  ournalOff==jrnlB
27120 75 66 66 65 72 53 69 7a 65 28 70 50 61 67 65 72  ufferSize(pPager
27130 29 20 26 26 20 0a 20 20 20 20 20 20 20 20 6e 54  ) && .        nT
27140 72 75 6e 63 3d 3d 30 20 26 26 20 0a 20 20 20 20  runc==0 && .    
27150 20 20 20 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e      (0==pPager->
27160 70 44 69 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61  pDirty || 0==pPa
27170 67 65 72 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69  ger->pDirty->pDi
27180 72 74 79 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  rty).    );.    
27190 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
271a0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70  journalOpen || p
271b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f  Pager->journalMo
271c0 64 65 3d 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41  de==PAGER_JOURNA
271d0 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20  LMODE_OFF );.   
271e0 20 69 66 28 20 75 73 65 41 74 6f 6d 69 63 57 72   if( useAtomicWr
271f0 69 74 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ite ){.      /* 
27200 55 70 64 61 74 65 20 74 68 65 20 6e 52 65 63 20  Update the nRec 
27210 66 69 65 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75  field in the jou
27220 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20  rnal file. */.  
27230 20 20 20 20 69 6e 74 20 6f 66 66 73 65 74 20 3d      int offset =
27240 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27250 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
27260 75 72 6e 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20  urnalMagic);.   
27270 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
27280 2d 3e 6e 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20  ->nRec==1);.    
27290 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
272a0 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ts(pPager->jfd, 
272b0 6f 66 66 73 65 74 2c 20 70 50 61 67 65 72 2d 3e  offset, pPager->
272c0 6e 52 65 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  nRec);..      /*
272d0 20 55 70 64 61 74 65 20 74 68 65 20 64 62 20 66   Update the db f
272e0 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e 74  ile change count
272f0 65 72 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  er. The followin
27300 67 20 63 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69  g call will modi
27310 66 79 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20  fy.      ** the 
27320 69 6e 2d 6d 65 6d 6f 72 79 20 72 65 70 72 65 73  in-memory repres
27330 65 6e 74 61 74 69 6f 6e 20 6f 66 20 70 61 67 65  entation of page
27340 20 31 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 68   1 to include th
27350 65 20 75 70 64 61 74 65 64 0a 20 20 20 20 20 20  e updated.      
27360 2a 2a 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65  ** change counte
27370 72 20 61 6e 64 20 74 68 65 6e 20 77 72 69 74 65  r and then write
27380 20 70 61 67 65 20 31 20 64 69 72 65 63 74 6c 79   page 1 directly
27390 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
273a0 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20  .      ** file. 
273b0 42 65 63 61 75 73 65 20 6f 66 20 74 68 65 20 61  Because of the a
273c0 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
273d0 65 72 74 79 20 6f 66 20 74 68 65 20 68 6f 73 74  erty of the host
273e0 20 66 69 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20   file-system, . 
273f0 20 20 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20       ** this is 
27400 73 61 66 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  safe..      */. 
27410 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
27420 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
27430 20 20 72 63 20 3d 20 70 61 67 65 72 5f 69 6e 63    rc = pager_inc
27440 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
27450 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20 20 20  pPager, 1);.    
27460 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
27470 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
27480 33 4a 6f 75 72 6e 61 6c 43 72 65 61 74 65 28 70  3JournalCreate(p
27490 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
274a0 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 75 73 65   }..    if( !use
274b0 41 74 6f 6d 69 63 57 72 69 74 65 20 26 26 20 72  AtomicWrite && r
274c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23  c==SQLITE_OK ).#
274d0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66  endif..    /* If
274e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
274f0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
27500 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
27510 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
27520 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
27530 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
27540 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
27550 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
27560 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
27570 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
27580 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
27590 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
275a0 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
275b0 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
275c0 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
275d0 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
275e0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
275f0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
27600 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
27610 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
27620 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
27630 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
27640 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
27650 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
27660 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
27670 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 2c  ecounter(pPager,
27680 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
27690 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
276a0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23  oto sync_exit;.#
276b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
276c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
276d0 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d      if( nTrunc!=
276e0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
276f0 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  If this transact
27700 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65  ion has made the
27710 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65   database smalle
27720 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  r, then all page
27730 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69  s.        ** bei
27740 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79 20  ng discarded by 
27750 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d  the truncation m
27760 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20 74  ust be written t
27770 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20  o the journal.  
27780 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20        ** file.. 
27790 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
277a0 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20    Pgno i;.      
277b0 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50 41    int iSkip = PA
277c0 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
277d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  er);.        for
277e0 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c  ( i=nTrunc+1; i<
277f0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
27800 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20  ize; i++ ){.    
27810 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
27820 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50 61  e3BitvecTest(pPa
27830 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c  ger->pInJournal,
27840 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70 20   i) && i!=iSkip 
27850 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
27860 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27870 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26  Get(pPager, i, &
27880 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pPg);.          
27890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
278a0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
278b0 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
278c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
278d0 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a 20  gerWrite(pPg);. 
278e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
278f0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
27900 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27920 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27930 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
27940 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
27950 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
27960 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
27970 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
27980 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
27990 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
279a0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
279b0 74 3b 0a 20 20 20 20 20 20 70 61 67 65 72 4d 75  t;.      pagerMu
279c0 74 65 78 48 65 6c 64 28 70 50 61 67 65 72 29 3b  texHeld(pPager);
279d0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
279e0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
279f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
27a00 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27a10 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a  oto sync_exit;..
27a20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
27a30 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
27a40 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30     if( nTrunc!=0
27a50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
27a60 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
27a70 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
27a80 6e 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  nc);.      if( r
27a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
27aa0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
27ab0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20     }.#endif..   
27ac0 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69   /* Write all di
27ad0 72 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65  rty pages to the
27ae0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
27af0 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
27b00 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
27b10 70 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20  pages(pPager);. 
27b20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
27b30 69 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67  ite_pagelist(pPg
27b40 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
27b50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
27b60 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
27b70 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
27b80 45 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54  ED );.      /* T
27b90 68 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68  he error might h
27ba0 61 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72  ave left the dir
27bb0 74 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c  ty list all foul
27bc0 65 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20  ed up here,.    
27bd0 20 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f    ** but that do
27be0 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65  es not matter be
27bf0 63 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20  cause if the if 
27c00 74 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64  the dirty list d
27c10 69 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20  id.      ** get 
27c20 63 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20  corrupted, then 
27c30 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
27c40 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61  will roll back a
27c50 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63  nd.      ** disc
27c60 61 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69  ard the dirty li
27c70 73 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e  st.  There is an
27c80 20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20   assert in.     
27c90 20 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c   ** pager_get_al
27ca0 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20  l_dirty_pages() 
27cb0 74 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68  that verifies th
27cc0 61 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20  at no attempt.  
27cd0 20 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74      ** is made t
27ce0 6f 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64  o use an invalid
27cf0 20 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20   dirty list..   
27d00 20 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f     */.      goto
27d10 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20   sync_exit;.    
27d20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  }.    pPager->pD
27d30 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  irty = 0;..    /
27d40 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62  * Sync the datab
27d50 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  ase file. */.   
27d60 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f   if( !pPager->no
27d70 53 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20  Sync && !noSync 
27d80 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
27d90 6c 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67  lite3OsSync(pPag
27da0 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
27db0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
27dc0 20 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28   }.    IOTRACE((
27dd0 22 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  "DBSYNC %p\n", p
27de0 50 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61  Pager))..    pPa
27df0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
27e00 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c  ER_SYNCED;.  }el
27e10 73 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20  se if( MEMDB && 
27e20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20  nTrunc!=0 ){.   
27e30 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
27e40 65 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  erTruncate(pPage
27e50 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a  r, nTrunc);.  }.
27e60 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66  .sync_exit:.  if
27e70 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  ( rc==SQLITE_IOE
27e80 52 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  RR_BLOCKED ){.  
27e90 20 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f    /* pager_incr_
27ea0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20  changecounter() 
27eb0 6d 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f  may attempt to o
27ec0 62 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69  btain an exclusi
27ed0 76 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74  ve.     * lock t
27ee0 6f 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68  o spill the cach
27ef0 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45  e and return IOE
27f00 52 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20  RR_BLOCKED. But 
27f10 73 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68  since .     * th
27f20 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65  ere is no chance
27f30 20 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e   the cache is in
27f40 63 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69  consistent, it i
27f50 73 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20  s.     * better 
27f60 74 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  to return SQLITE
27f70 5f 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20  _BUSY..     */. 
27f80 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42     rc = SQLITE_B
27f90 55 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  USY;.  }.  pager
27fa0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
27fb0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
27fc0 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c  /*.** Commit all
27fd0 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20   changes to the 
27fe0 64 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c  database and rel
27ff0 65 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c  ease the write l
28000 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ock..**.** If th
28010 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66  e commit fails f
28020 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61  or any reason, a
28030 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70   rollback attemp
28040 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64  t is made.** and
28050 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69   an error code i
28060 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20  s returned.  If 
28070 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65  the commit worke
28080 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20  d, SQLITE_OK.** 
28090 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
280a0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
280b0 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50  CommitPhaseTwo(P
280c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
280d0 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
280e0 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
280f0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b  ager->errCode ){
28100 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67  .    return pPag
28110 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d  er->errCode;.  }
28120 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
28130 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52  tate<PAGER_RESER
28140 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72  VED ){.    retur
28150 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
28160 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
28170 2d 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20  ->dbModified==0 
28180 26 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67  &&.        (pPag
28190 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21  er->journalMode!
281a0 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
281b0 44 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20  DE_DELETE ||.   
281c0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65         pPager->e
281d0 78 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29  xclusiveMode!=0)
281e0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
281f0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
28200 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d  he==0 || pPager-
28210 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
28220 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
28230 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
28240 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
28250 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
28260 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
28270 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28280 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
28290 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
282a0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
282b0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
282c0 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
282d0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
282e0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
282f0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
28300 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72  er);.      clear
28310 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
28320 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
28330 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
28340 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
28350 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
28360 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
28370 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
28380 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
28390 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
283a0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
283b0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
283c0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
283d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
283e0 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
283f0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
28400 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
28410 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
28420 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
28430 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
28440 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
28450 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
28460 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
28470 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
28480 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
28490 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
284a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
284b0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
284c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
284d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
284e0 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
284f0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
28500 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67  _SHARED;.    pag
28510 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28520 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
28530 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
28540 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
28550 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
28560 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72   || !pPager->dir
28570 74 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20  tyCache );.  rc 
28580 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e  = pager_end_tran
28590 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20  saction(pPager, 
285a0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
285b0 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72  r);.  rc = pager
285c0 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
285d0 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65  c);.  pagerLeave
285e0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
285f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
28600 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61  Rollback all cha
28610 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62  nges.  The datab
28620 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74  ase falls back t
28630 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d  o PAGER_SHARED m
28640 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d  ode..** All in-m
28650 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65  emory cache page
28660 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69  s revert to thei
28670 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20  r original data 
28680 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65  contents..** The
28690 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65   journal is dele
286a0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ted..**.** This 
286b0 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66  routine cannot f
286c0 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20  ail unless some 
286d0 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73  other process is
286e0 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   not following.*
286f0 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f  * the correct lo
28700 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f  cking protocol o
28710 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74  r unless some ot
28720 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69  her.** process i
28730 73 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20  s writing trash 
28740 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
28750 20 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f   file (SQLITE_CO
28760 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c  RRUPT) or.** unl
28770 65 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c  ess a prior mall
28780 6f 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c  oc() failed (SQL
28790 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70  ITE_NOMEM).  App
287a0 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a  ropriate error.*
287b0 2a 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75  * codes are retu
287c0 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65  rned for all the
287d0 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f  se occasions.  O
287e0 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c  therwise,.** SQL
287f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
28800 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
28810 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28  e3PagerRollback(
28820 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28830 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45    int rc;.  PAGE
28840 52 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43  RTRACE2("ROLLBAC
28850 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
28860 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
28870 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67   MEMDB ){.    Pg
28880 48 64 72 20 2a 70 3b 0a 20 20 20 20 70 61 67 65  Hdr *p;.    page
28890 72 4d 75 74 65 78 48 65 6c 64 28 70 50 61 67 65  rMutexHeld(pPage
288a0 72 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 70 50  r);.    for(p=pP
288b0 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70  ager->pAll; p; p
288c0 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  =p->pNextAll){. 
288d0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
288e0 70 48 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73  pHist;.      ass
288f0 65 72 74 28 20 21 70 2d 3e 61 6c 77 61 79 73 52  ert( !p->alwaysR
28900 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
28910 20 69 66 28 20 21 70 2d 3e 64 69 72 74 79 20 29   if( !p->dirty )
28920 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
28930 28 20 21 28 28 50 67 48 69 73 74 6f 72 79 20 2a  ( !((PgHistory *
28940 29 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  )PGHDR_TO_HIST(p
28950 2c 20 70 50 61 67 65 72 29 29 2d 3e 70 4f 72 69  , pPager))->pOri
28960 67 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  g );.        ass
28970 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
28980 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
28990 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
289a0 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
289b0 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
289c0 7d 0a 0a 20 20 20 20 20 20 70 48 69 73 74 20 3d  }..      pHist =
289d0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
289e0 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
289f0 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72 69   if( pHist->pOri
28a00 67 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d  g ){.        mem
28a10 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  cpy(PGHDR_TO_DAT
28a20 41 28 70 29 2c 20 70 48 69 73 74 2d 3e 70 4f 72  A(p), pHist->pOr
28a30 69 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ig, pPager->page
28a40 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 50  Size);.        P
28a50 41 47 45 52 54 52 41 43 45 33 28 22 52 4f 4c 4c  AGERTRACE3("ROLL
28a60 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
28a70 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
28a80 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
28a90 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
28aa0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
28ab0 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
28ac0 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
28ad0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
28ae0 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
28af0 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
28b00 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
28b10 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
28b20 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
28b30 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
28b40 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30  Hist->inStmt = 0
28b50 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
28b60 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
28b70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
28b80 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
28b90 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
28ba0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
28bb0 78 52 65 69 6e 69 74 65 72 28 70 2c 20 70 50 61  xReiniter(p, pPa
28bc0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
28bd0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
28be0 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79    pPager->pDirty
28bf0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
28c00 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
28c10 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
28c20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
28c30 53 69 7a 65 3b 0a 20 20 20 20 70 61 67 65 72 5f  Size;.    pager_
28c40 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
28c50 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
28c60 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
28c70 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
28c80 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
28c90 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
28ca0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
28cb0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
28cc0 67 65 72 29 3b 0a 20 20 69 66 28 20 21 70 50 61  ger);.  if( !pPa
28cd0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
28ce0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
28cf0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
28d00 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72  c = pager_end_tr
28d10 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72  ansaction(pPager
28d20 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73  , pPager->setMas
28d30 74 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72 4c  ter);.    pagerL
28d40 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
28d50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
28d60 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
28d70 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65  errCode && pPage
28d80 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49  r->errCode!=SQLI
28d90 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  TE_FULL ){.    i
28da0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
28db0 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
28dc0 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
28dd0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
28de0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
28df0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
28e00 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 70  r);.    return p
28e10 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
28e20 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
28e30 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52  ->state==PAGER_R
28e40 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69  ESERVED ){.    i
28e50 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d  nt rc2;.    rc =
28e60 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
28e70 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
28e80 72 63 32 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f  rc2 = pager_end_
28e90 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67  transaction(pPag
28ea0 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d  er, pPager->setM
28eb0 61 73 74 65 72 29 3b 0a 20 20 20 20 69 66 28 20  aster);.    if( 
28ec0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
28ed0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
28ee0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
28ef0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
28f00 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
28f10 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 61 67  0);.  }.  /* pag
28f20 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
28f30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
28f40 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20 20 2f  bSize = -1;..  /
28f50 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63  * If an error oc
28f60 63 75 72 73 20 64 75 72 69 6e 67 20 61 20 52 4f  curs during a RO
28f70 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e 20 6e  LLBACK, we can n
28f80 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74 20 74  o longer trust t
28f90 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20 63 61  he pager.  ** ca
28fa0 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70 61 67  che. So call pag
28fb0 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20 74 68  er_error() on th
28fc0 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d 61 6b  e way out to mak
28fd0 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20 20 2a  e any error .  *
28fe0 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a 20 20  * persistent..  
28ff0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
29000 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
29010 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
29020 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
29030 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
29040 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
29050 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
29060 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f  is opened read-o
29070 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c  nly.  Return FAL
29080 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74  SE.** if the dat
29090 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65  abase is (in the
290a0 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a  ory) writable..*
290b0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
290c0 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  erIsreadonly(Pag
290d0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
290e0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
290f0 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
29100 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
29110 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
29120 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e 0a 2a   to the pager..*
29130 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
29140 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67 65 72  erRefcount(Pager
29150 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
29160 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  urn pPager->nRef
29170 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  ;.}..#ifdef SQLI
29180 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 54 68  TE_TEST./*.** Th
29190 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73  is routine is us
291a0 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61  ed for testing a
291b0 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79  nd analysis only
291c0 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74 65  ..*/.int *sqlite
291d0 33 50 61 67 65 72 53 74 61 74 73 28 50 61 67 65  3PagerStats(Page
291e0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 74  r *pPager){.  st
291f0 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d 3b 0a  atic int a[11];.
29200 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65 72 2d    a[0] = pPager-
29210 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20 3d 20  >nRef;.  a[1] = 
29220 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b 0a 20  pPager->nPage;. 
29230 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[2] = pPager->
29240 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d 20 3d  mxPage;.  a[3] =
29250 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
29260 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67 65 72  .  a[4] = pPager
29270 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35 5d 20  ->state;.  a[5] 
29280 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  = pPager->errCod
29290 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50 61 67  e;.  a[6] = pPag
292a0 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b 37 5d  er->nHit;.  a[7]
292b0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73   = pPager->nMiss
292c0 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20 20 2f  ;.  a[8] = 0;  /
292d0 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70 50 61  * Used to be pPa
292e0 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a 20 20  ger->nOvfl */.  
292f0 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
29300 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
29310 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
29320 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 23 65    return a;.}.#e
29330 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  ndif../*.** Set 
29340 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f  the statement ro
29350 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a  llback point..**
29360 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
29370 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65   should be calle
29380 64 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73  d with the trans
29390 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61  action journal a
293a0 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20  lready.** open. 
293b0 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74   A new statement
293c0 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61   journal is crea
293d0 74 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20  ted that can be 
293e0 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b  used to rollback
293f0 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61  .** changes of a
29400 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d   single SQL comm
29410 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72  and within a lar
29420 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ger transaction.
29430 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
29440 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61  agerStmtBegin(Pa
29450 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
29460 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
29470 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  ( !pPager->stmtI
29480 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74  nUse );.  assert
29490 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
294a0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
294b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
294c0 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 3b 0a  r->dbSize>=0 );.
294d0 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53    PAGERTRACE2("S
294e0 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c  TMT-BEGIN %d\n",
294f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
29500 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29  );.  if( MEMDB )
29510 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
29520 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20  mtInUse = 1;.   
29530 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
29540 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
29550 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  ze;.    return S
29560 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
29570 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  if( !pPager->jou
29580 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20  rnalOpen ){.    
29590 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
295a0 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65  open = 1;.    re
295b0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
295c0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
295d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
295e0 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  n );.  pagerLeav
295f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73  e(pPager);.  ass
29600 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
29610 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50 61  Stmt==0 );.  pPa
29620 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 73  ger->pInStmt = s
29630 71 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61  qlite3BitvecCrea
29640 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  te(pPager->dbSiz
29650 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  e);.  pagerEnter
29660 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
29670 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 3d  pPager->pInStmt=
29680 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c  =0 ){.    /* sql
29690 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65  ite3OsLock(pPage
296a0 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f  r->fd, SHARED_LO
296b0 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65 74 75  CK); */.    retu
296c0 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
296d0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
296e0 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65  tmtJSize = pPage
296f0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
29700 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
29710 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
29720 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  ze;.  pPager->st
29730 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20  mtHdrOff = 0;.  
29740 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
29750 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  m = pPager->cksu
29760 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50  mInit;.  if( !pP
29770 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
29780 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
29790 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d 70 28  e3PagerOpentemp(
297a0 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50  pPager->pVfs, pP
297b0 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 50 61 67  ager->stfd, pPag
297c0 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c 0a 20  er->zStmtJrnl,. 
297d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
297f0 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f 55 52  ITE_OPEN_SUBJOUR
29800 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  NAL);.    if( rc
29810 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 73   ){.      goto s
29820 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
29830 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
29840 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
29850 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
29860 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
29870 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
29880 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
29890 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
298a0 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
298b0 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
298c0 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  pInStmt ){.    s
298d0 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74  qlite3BitvecDest
298e0 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 53  roy(pPager->pInS
298f0 74 6d 74 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tmt);.    pPager
29900 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->pInStmt = 0;. 
29910 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
29920 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
29930 65 72 53 74 6d 74 42 65 67 69 6e 28 50 61 67 65  erStmtBegin(Page
29940 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
29950 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
29960 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
29970 20 3d 20 70 61 67 65 72 53 74 6d 74 42 65 67 69   = pagerStmtBegi
29980 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  n(pPager);.  pag
29990 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
299a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
299b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20  ./*.** Commit a 
299c0 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
299d0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
299e0 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  mtCommit(Pager *
299f0 70 50 61 67 65 72 29 7b 0a 20 20 70 61 67 65 72  pPager){.  pager
29a00 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
29a10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
29a20 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 67  tInUse ){.    Pg
29a30 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
29a40 3b 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45  ;.    PAGERTRACE
29a50 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25  2("STMT-COMMIT %
29a60 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29a70 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
29a80 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
29a90 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e  /* sqlite3OsTrun
29aa0 63 61 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66  cate(pPager->stf
29ab0 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20  d, 0); */.      
29ac0 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65 73  sqlite3BitvecDes
29ad0 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e  troy(pPager->pIn
29ae0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 70 50 61  Stmt);.      pPa
29af0 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
29b00 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29b10 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
29b20 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70  r->pStmt; pPg; p
29b30 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  Pg=pNext){.     
29b40 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
29b50 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
29b60 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
29b70 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74 20  ;.        pNext 
29b80 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74  = pHist->pNextSt
29b90 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  mt;.        asse
29ba0 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d  rt( pHist->inStm
29bb0 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  t );.        pHi
29bc0 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  st->inStmt = 0;.
29bd0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
29be0 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
29bf0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
29c00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
29c10 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
29c20 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69  mt);.        pHi
29c30 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  st->pStmt = 0;. 
29c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29c50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
29c60 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  c = 0;.    pPage
29c70 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
29c80 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  ;.    pPager->pS
29c90 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  tmt = 0;.  }.  p
29ca0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
29cb0 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72  pen = 0;.  pager
29cc0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
29cd0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29ce0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c  K;.}../*.** Roll
29cf0 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74  back a statement
29d00 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
29d10 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c 62 61 63  PagerStmtRollbac
29d20 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
29d30 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 70 61  {.  int rc;.  pa
29d40 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
29d50 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
29d60 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
29d70 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
29d80 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e  MT-ROLLBACK %d\n
29d90 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
29da0 72 29 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d  r));.    if( MEM
29db0 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64  DB ){.      PgHd
29dc0 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 50 67  r *pPg;.      Pg
29dd0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
29de0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
29df0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
29e00 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e 70 4e 65  ; pPg=pHist->pNe
29e10 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
29e20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
29e30 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
29e40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
29e50 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b   pHist->pStmt ){
29e60 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70  .          memcp
29e70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  y(PGHDR_TO_DATA(
29e80 70 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74  pPg), pHist->pSt
29e90 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  mt, pPager->page
29ea0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
29eb0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
29ec0 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20  ist->pStmt);.   
29ed0 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
29ee0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tmt = 0;.       
29ef0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
29f00 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
29f10 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  = pPager->stmtSi
29f20 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f  ze;.      pager_
29f30 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 70  truncate_cache(p
29f40 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63  Pager);.      rc
29f50 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
29f60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
29f70 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70  c = pager_stmt_p
29f80 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
29f90 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
29fa0 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
29fb0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65 6c  t(pPager);.  }el
29fc0 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  se{.    rc = SQL
29fd0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 50  ITE_OK;.  }.  pP
29fe0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
29ff0 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 4c  en = 0;.  pagerL
2a000 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
2a010 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
2a020 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
2a030 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
2a040 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a050 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
2a060 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69   *sqlite3PagerFi
2a070 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
2a080 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2a090 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
2a0a0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
2a0b0 72 6e 20 74 68 65 20 56 46 53 20 73 74 72 75 63  rn the VFS struc
2a0c0 74 75 72 65 20 66 6f 72 20 74 68 65 20 70 61 67  ture for the pag
2a0d0 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 73 71 6c  er..*/.const sql
2a0e0 69 74 65 33 5f 76 66 73 20 2a 73 71 6c 69 74 65  ite3_vfs *sqlite
2a0f0 33 50 61 67 65 72 56 66 73 28 50 61 67 65 72 20  3PagerVfs(Pager 
2a100 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2a110 72 6e 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b  rn pPager->pVfs;
2a120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
2a130 20 74 68 65 20 66 69 6c 65 20 68 61 6e 64 6c 65   the file handle
2a140 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61 73   for the databas
2a150 65 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  e file associate
2a160 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20 70 61  d.** with the pa
2a170 67 65 72 2e 20 20 54 68 69 73 20 6d 69 67 68 74  ger.  This might
2a180 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20   return NULL if 
2a190 74 68 65 20 66 69 6c 65 20 68 61 73 0a 2a 2a 20  the file has.** 
2a1a0 6e 6f 74 20 79 65 74 20 62 65 65 6e 20 6f 70 65  not yet been ope
2a1b0 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74 65 33 5f  ned..*/.sqlite3_
2a1c0 66 69 6c 65 20 2a 73 71 6c 69 74 65 33 50 61 67  file *sqlite3Pag
2a1d0 65 72 46 69 6c 65 28 50 61 67 65 72 20 2a 70 50  erFile(Pager *pP
2a1e0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
2a1f0 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f  pPager->fd;.}../
2a200 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
2a210 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74 68 65  directory of the
2a220 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
2a230 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
2a240 71 6c 69 74 65 33 50 61 67 65 72 44 69 72 6e 61  qlite3PagerDirna
2a250 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
2a260 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
2a270 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 3b 0a  er->zDirectory;.
2a280 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
2a290 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d  the full pathnam
2a2a0 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
2a2b0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
2a2c0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
2a2d0 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61  erJournalname(Pa
2a2e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a2f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
2a300 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  Journal;.}../*.*
2a310 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
2a320 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73 20 61   fsync() calls a
2a330 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f 72 20  re disabled for 
2a340 74 68 69 73 20 70 61 67 65 72 2e 20 20 52 65 74  this pager.  Ret
2a350 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20  urn FALSE.** if 
2a360 66 73 79 6e 63 28 29 73 20 61 72 65 20 65 78 65  fsync()s are exe
2a370 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79 2e 0a  cuted normally..
2a380 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a390 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65 72 20  gerNosync(Pager 
2a3a0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2a3b0 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  rn pPager->noSyn
2a3c0 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  c;.}..#ifdef SQL
2a3d0 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 2f 2a  ITE_HAS_CODEC./*
2a3e0 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f 64 65  .** Set the code
2a3f0 63 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  c for this pager
2a400 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2a410 50 61 67 65 72 53 65 74 43 6f 64 65 63 28 0a 20  PagerSetCodec(. 
2a420 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 0a   Pager *pPager,.
2a430 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
2a440 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
2a450 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69 64 20  no,int),.  void 
2a460 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a 20 20  *pCodecArg.){.  
2a470 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63 20 3d  pPager->xCodec =
2a480 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61 67 65   xCodec;.  pPage
2a490 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d 20 70  r->pCodecArg = p
2a4a0 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65 6e 64  CodecArg;.}.#end
2a4b0 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  if..#ifndef SQLI
2a4c0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
2a4d0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
2a4e0 65 20 70 61 67 65 20 70 50 67 20 74 6f 20 6c 6f  e page pPg to lo
2a4f0 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
2a500 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54  he file..**.** T
2a510 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20  here must be no 
2a520 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
2a530 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73 6c  e page previousl
2a540 79 20 6c 6f 63 61 74 65 64 20 61 74 0a 2a 2a 20  y located at.** 
2a550 70 67 6e 6f 20 28 77 68 69 63 68 20 77 65 20 63  pgno (which we c
2a560 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74 68 6f 75  all pPgOld) thou
2a570 67 68 20 74 68 61 74 20 70 61 67 65 20 69 73 20  gh that page is 
2a580 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 0a 2a 2a  allowed to be.**
2a590 20 69 6e 20 63 61 63 68 65 2e 20 20 49 66 20 74   in cache.  If t
2a5a0 68 65 20 70 61 67 65 20 70 72 65 76 69 6f 75 73  he page previous
2a5b0 20 6c 6f 63 61 74 65 64 20 61 74 20 70 67 6e 6f   located at pgno
2a5c0 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a   is not already.
2a5d0 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61  ** in the rollba
2a5e0 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74 20 69  ck journal, it i
2a5f0 73 20 6e 6f 74 20 70 75 74 20 74 68 65 72 65 20  s not put there 
2a600 62 79 20 62 79 20 74 68 69 73 20 72 6f 75 74 69  by by this routi
2a610 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72 65  ne..**.** Refere
2a620 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65  nces to the page
2a630 20 70 50 67 20 72 65 6d 61 69 6e 20 76 61 6c 69   pPg remain vali
2a640 64 2e 20 55 70 64 61 74 69 6e 67 20 61 6e 79 0a  d. Updating any.
2a650 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20 61 73 73  ** meta-data ass
2a660 6f 63 69 61 74 65 64 20 77 69 74 68 20 70 50 67  ociated with pPg
2a670 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72   (i.e. data stor
2a680 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61  ed in the nExtra
2a690 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61   bytes.** alloca
2a6a0 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74  ted along with t
2a6b0 68 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20  he page) is the 
2a6c0 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f  responsibility o
2a6d0 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a  f the caller..**
2a6e0 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f  .** A transactio
2a6f0 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65  n must be active
2a700 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
2a710 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74  ne is called. It
2a720 20 75 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72   used to be.** r
2a730 65 71 75 69 72 65 64 20 74 68 61 74 20 61 20 73  equired that a s
2a740 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
2a750 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74  tion was not act
2a760 69 76 65 2c 20 62 75 74 20 74 68 69 73 20 72 65  ive, but this re
2a770 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73  striction.** has
2a780 20 62 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43   been removed (C
2a790 52 45 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64  REATE INDEX need
2a7a0 73 20 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65  s to move a page
2a7b0 20 77 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e   when a statemen
2a7c0 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
2a7d0 20 69 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a   is active)..*/.
2a7e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a7f0 4d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  Movepage(Pager *
2a800 70 50 61 67 65 72 2c 20 44 62 50 61 67 65 20 2a  pPager, DbPage *
2a810 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
2a820 0a 20 20 50 67 48 64 72 20 2a 70 50 67 4f 6c 64  .  PgHdr *pPgOld
2a830 3b 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 62  ;  /* The page b
2a840 65 69 6e 67 20 6f 76 65 72 77 72 69 74 74 65 6e  eing overwritten
2a850 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b 0a 20 20  . */.  int h;.  
2a860 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50 67 6e  Pgno needSyncPgn
2a870 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67 65 72 45  o = 0;..  pagerE
2a880 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
2a890 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
2a8a0 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47 45 52 54  f>0 );..  PAGERT
2a8b0 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
2a8c0 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
2a8d0 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
2a8e0 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
2a8f0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
2a900 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
2a910 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20  dSync, pgno);.  
2a920 49 4f 54 52 41 43 45 28 28 22 4d 4f 56 45 20 25  IOTRACE(("MOVE %
2a930 70 20 25 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  p %d %d\n", pPag
2a940 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
2a950 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65 72 5f 67  gno))..  pager_g
2a960 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b  et_content(pPg);
2a970 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64  .  if( pPg->need
2a980 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64  Sync ){.    need
2a990 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e  SyncPgno = pPg->
2a9a0 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74  pgno;.    assert
2a9b0 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
2a9c0 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
2a9d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
2a9e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
2a9f0 70 50 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  pPg->dirty );.  
2aa00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
2aa10 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20  ->needSync );.  
2aa20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70  }..  /* Unlink p
2aa30 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  Pg from its hash
2aa40 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69  -chain */.  unli
2aa50 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
2aa60 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  er, pPg);..  /* 
2aa70 49 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e  If the cache con
2aa80 74 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74  tains a page wit
2aa90 68 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67  h page-number pg
2aaa0 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20  no, remove it.  
2aab0 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  ** from its hash
2aac0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
2aad0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
2aae0 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
2aaf0 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
2ab00 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
2ab10 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
2ab20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
2ab30 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
2ab40 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
2ab50 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d  ere..  */.  pPg-
2ab60 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
2ab70 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f   pPgOld = pager_
2ab80 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70  lookup(pPager, p
2ab90 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f  gno);.  if( pPgO
2aba0 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ld ){.    assert
2abb0 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d  ( pPgOld->nRef==
2abc0 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48  0 );.    unlinkH
2abd0 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
2abe0 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61   pPgOld);.    ma
2abf0 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b  keClean(pPgOld);
2ac00 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
2ac10 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65  nc = pPgOld->nee
2ac20 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a  dSync;.  }else{.
2ac30 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
2ac40 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67  c = 0;.  }.  pPg
2ac50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  ->inJournal = sq
2ac60 6c 69 74 65 33 42 69 74 76 65 63 54 65 73 74 28  lite3BitvecTest(
2ac70 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
2ac80 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 2f 2a  al, pgno);..  /*
2ac90 20 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65   Change the page
2aca0 20 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20   number for pPg 
2acb0 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
2acc0 74 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d  to the new hash-
2acd0 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65  chain. */.  asse
2ace0 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20  rt( pgno!=0 );. 
2acf0 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e   pPg->pgno = pgn
2ad00 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  o;.  h = pgno & 
2ad10 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
2ad20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
2ad30 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20  >aHash[h] ){.   
2ad40 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
2ad50 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
2ad60 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70  Hash==0 );.    p
2ad70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d  Pager->aHash[h]-
2ad80 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
2ad90 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
2ada0 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
2adb0 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61  >aHash[h];.  pPa
2adc0 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
2add0 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  pPg;.  pPg->pPre
2ade0 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61  vHash = 0;..  ma
2adf0 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20  keDirty(pPg);.  
2ae00 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
2ae10 68 65 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  he = 1;.  pPager
2ae20 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d 20 31  ->dbModified = 1
2ae30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
2ae40 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
2ae50 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
2ae60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
2ae70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
2ae80 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
2ae90 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
2aea0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
2aeb0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
2aec0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
2aed0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
2aee0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
2aef0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
2af00 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
2af10 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
2af20 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70 49 6e      ** Pager.pIn
2af30 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
2af40 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
2af50 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
2af60 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
2af70 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
2af80 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
2af90 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
2afa0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
2afb0 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
2afc0 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61 74      ** If the at
2afd0 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74 68  tempt to load th
2afe0 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
2aff0 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c 73  page-cache fails
2b000 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74 6f  , (due.    ** to
2b010 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20 49   a malloc() or I
2b020 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65 61  O failure), clea
2b030 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68 65  r the bit in the
2b040 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20 20   pInJournal[].  
2b050 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68 65    ** array. Othe
2b060 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70 61  rwise, if the pa
2b070 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e 64  ge is loaded and
2b080 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20 69   written again i
2b090 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74 72  n.    ** this tr
2b0a0 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d 61  ansaction, it ma
2b0b0 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  y be written to 
2b0c0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2b0d0 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a 20  e before.    ** 
2b0e0 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e 74  it is synced int
2b0f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
2b100 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69 74  le. This way, it
2b110 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a 20   may end up in. 
2b120 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61     ** the journa
2b130 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62 75  l file twice, bu
2b140 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
2b150 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a 0a  problem..    **.
2b160 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
2b170 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61 6c  e3PagerGet() cal
2b180 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
2b190 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
2b1a0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
2b1b0 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
2b1c0 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
2b1d0 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
2b1e0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
2b1f0 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20  PgHdr *pPgHdr;. 
2b200 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
2b210 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20  r->needSync );. 
2b220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
2b230 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
2b240 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70  needSyncPgno, &p
2b250 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20  PgHdr);.    if( 
2b260 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b270 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
2b280 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26 26  r->pInJournal &&
2b290 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50 67   (int)needSyncPg
2b2a0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67  no<=pPager->orig
2b2b0 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  DbSize ){.      
2b2c0 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43    sqlite3BitvecC
2b2d0 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49 6e  lear(pPager->pIn
2b2e0 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79 6e  Journal, needSyn
2b2f0 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 0a  cPgno);.      }.
2b300 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
2b310 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
2b320 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
2b330 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
2b340 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70  dSync = 1;.    p
2b350 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63 20  PgHdr->needSync 
2b360 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d  = 1;.    pPgHdr-
2b370 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
2b380 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50      makeDirty(pP
2b390 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69 74  gHdr);.    sqlit
2b3a0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
2b3b0 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61 67  Hdr);.  }..  pag
2b3c0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
2b3d0 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
2b3e0 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
2b3f0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f  *.** Return a po
2b400 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61 74  inter to the dat
2b410 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  a for the specif
2b420 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69  ied page..*/.voi
2b430 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 47  d *sqlite3PagerG
2b440 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a 70  etData(DbPage *p
2b450 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg){.  return PG
2b460 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
2b470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
2b480 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
2b490 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61 20  he Pager.nExtra 
2b4a0 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61 22  bytes of "extra"
2b4b0 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f 63   space .** alloc
2b4c0 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20  ated along with 
2b4d0 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70 61  the specified pa
2b4e0 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c  ge..*/.void *sql
2b4f0 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74 72  ite3PagerGetExtr
2b500 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
2b510 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
2b520 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
2b530 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72 3f   return (pPager?
2b540 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
2b550 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b 0a  Pg, pPager):0);.
2b560 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65 74  }../*.** Get/set
2b570 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64   the locking-mod
2b580 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
2b590 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f 64  . Parameter eMod
2b5a0 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a 2a  e must be one.**
2b5b0 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   of PAGER_LOCKIN
2b5c0 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41 47  GMODE_QUERY, PAG
2b5d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 4e  ER_LOCKINGMODE_N
2b5e0 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41 47  ORMAL or .** PAG
2b5f0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45  ER_LOCKINGMODE_E
2b600 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68 65  XCLUSIVE. If the
2b610 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e 6f   parameter is no
2b620 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a 2a  t _QUERY, then.*
2b630 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  * the locking-mo
2b640 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  de is set to the
2b650 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65 64   value specified
2b660 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
2b670 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65 69  rned value is ei
2b680 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ther PAGER_LOCKI
2b690 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f 72  NGMODE_NORMAL or
2b6a0 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  .** PAGER_LOCKIN
2b6b0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 2c  GMODE_EXCLUSIVE,
2b6c0 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65 20   indicating the 
2b6d0 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62 6c  current (possibl
2b6e0 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c 6f  y updated).** lo
2b6f0 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69  cking-mode..*/.i
2b700 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nt sqlite3PagerL
2b710 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65 72  ockingMode(Pager
2b720 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65 4d   *pPager, int eM
2b730 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ode){.  assert( 
2b740 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
2b750 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a 20  KINGMODE_QUERY. 
2b760 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2b770 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2b780 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20 20  NGMODE_NORMAL.  
2b790 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d 6f            || eMo
2b7a0 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  de==PAGER_LOCKIN
2b7b0 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20  GMODE_EXCLUSIVE 
2b7c0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
2b7d0 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51  ER_LOCKINGMODE_Q
2b7e0 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65  UERY<0 );.  asse
2b7f0 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  rt( PAGER_LOCKIN
2b800 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30 20  GMODE_NORMAL>=0 
2b810 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  && PAGER_LOCKING
2b820 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e 3d  MODE_EXCLUSIVE>=
2b830 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65  0 );.  if( eMode
2b840 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d 3e  >=0 && !pPager->
2b850 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20 20  tempFile ){.    
2b860 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
2b870 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a 20  eMode = eMode;. 
2b880 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e 74   }.  return (int
2b890 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  )pPager->exclusi
2b8a0 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  veMode;.}../*.**
2b8b0 20 47 65 74 2f 73 65 74 20 74 68 65 20 6a 6f 75   Get/set the jou
2b8c0 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72 20 74 68  rnal-mode for th
2b8d0 69 73 20 70 61 67 65 72 2e 20 50 61 72 61 6d 65  is pager. Parame
2b8e0 74 65 72 20 65 4d 6f 64 65 20 6d 75 73 74 20 62  ter eMode must b
2b8f0 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50 41 47 45  e one.** of PAGE
2b900 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55  R_JOURNALMODE_QU
2b910 45 52 59 2c 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ERY, PAGER_JOURN
2b920 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 20 6f 72  ALMODE_DELETE or
2b930 20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f 55 52 4e   .** PAGER_JOURN
2b940 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 2e 20  ALMODE_PERSIST. 
2b950 49 66 20 74 68 65 20 70 61 72 61 6d 65 74 65 72  If the parameter
2b960 20 69 73 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20   is not _QUERY, 
2b970 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  then.** the jour
2b980 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73 65 74 20  nal-mode is set 
2b990 74 6f 20 74 68 65 20 76 61 6c 75 65 20 73 70 65  to the value spe
2b9a0 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  cified..**.** Th
2b9b0 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c 75 65  e returned value
2b9c0 20 69 73 20 65 69 74 68 65 72 20 50 41 47 45 52   is either PAGER
2b9d0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c  _JOURNALMODE_DEL
2b9e0 45 54 45 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f  ETE or.** PAGER_
2b9f0 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53  JOURNALMODE_PERS
2ba00 49 53 54 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  IST, indicating 
2ba10 74 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73  the current (pos
2ba20 73 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a  sibly updated).*
2ba30 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 2e 0a  * journal-mode..
2ba40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2ba50 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64 65 28 50  gerJournalMode(P
2ba60 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
2ba70 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65  t eMode){.  asse
2ba80 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52  rt( eMode==PAGER
2ba90 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
2baa0 52 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c  RY.            |
2bab0 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a  | eMode==PAGER_J
2bac0 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54  OURNALMODE_DELET
2bad0 45 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  E.            ||
2bae0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
2baf0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2bb00 54 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  T.            ||
2bb10 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4a 4f   eMode==PAGER_JO
2bb20 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46 20 29 3b  URNALMODE_OFF );
2bb30 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
2bb40 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 51 55 45  _JOURNALMODE_QUE
2bb50 52 59 3c 30 20 29 3b 0a 20 20 61 73 73 65 72 74  RY<0 );.  assert
2bb60 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  ( PAGER_JOURNALM
2bb70 4f 44 45 5f 44 45 4c 45 54 45 3e 3d 30 20 26 26  ODE_DELETE>=0 &&
2bb80 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f   PAGER_JOURNALMO
2bb90 44 45 5f 50 45 52 53 49 53 54 3e 3d 30 20 29 3b  DE_PERSIST>=0 );
2bba0 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20  .  if( eMode>=0 
2bbb0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  ){.    pPager->j
2bbc0 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20 65 4d 6f  ournalMode = eMo
2bbd0 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  de;.  }.  return
2bbe0 20 28 69 6e 74 29 70 50 61 67 65 72 2d 3e 6a 6f   (int)pPager->jo
2bbf0 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a 0a 23 69  urnalMode;.}..#i
2bc00 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
2bc10 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
2bc20 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
2bc30 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
2bc40 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
2bc50 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
2bc60 74 65 33 50 61 67 65 72 52 65 66 64 75 6d 70 28  te3PagerRefdump(
2bc70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
2bc80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
2bc90 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
2bca0 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
2bcb0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
2bcc0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66     if( pPg->nRef
2bcd0 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  <=0 ) continue;.
2bce0 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
2bcf0 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33 64  Printf("PAGE %3d
2bd00 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64   addr=%p nRef=%d
2bd10 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67  \n", .       pPg
2bd20 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f  ->pgno, PGHDR_TO
2bd30 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
2bd40 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65  >nRef);.  }.}.#e
2bd50 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20  ndif..#endif /* 
2bd60 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b  SQLITE_OMIT_DISK
2bd70 49 4f 20 2a 2f 0a                                IO */.