MBG SQLite
Not logged in

Artifact 44bc914aaeb2971d2a58e3aa97c0e1ed93506727:


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 69 6e 74 20 69 49 6e 55 73 65 4d 4d 3b 20 20   int iInUseMM;  
4cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
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 69 6e 74 20 69 49 6e 55 73 65 44 42 3b  .  int iInUseDB;
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
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 23 65 6e  _memory() */.#en
4d70: 64 69 66 0a 20 20 63 68 61 72 20 2a 70 54 6d 70  dif.  char *pTmp
4d80: 53 70 61 63 65 3b 20 20 20 20 20 20 20 20 20 20  Space;          
4d90: 20 20 2f 2a 20 50 61 67 65 72 2e 70 61 67 65 53    /* Pager.pageS
4da0: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 73 70 61  ize bytes of spa
4db0: 63 65 20 66 6f 72 20 74 6d 70 20 75 73 65 20 2a  ce for tmp use *
4dc0: 2f 0a 20 20 63 68 61 72 20 64 62 46 69 6c 65 56  /.  char dbFileV
4dd0: 65 72 73 5b 31 36 5d 3b 20 20 20 20 20 20 20 20  ers[16];        
4de0: 2f 2a 20 43 68 61 6e 67 65 73 20 77 68 65 6e 65  /* Changes whene
4df0: 76 65 72 20 64 61 74 61 62 61 73 65 20 66 69 6c  ver database fil
4e00: 65 20 63 68 61 6e 67 65 73 20 2a 2f 0a 7d 3b 0a  e changes */.};.
4e10: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
4e20: 77 69 6e 67 20 67 6c 6f 62 61 6c 20 76 61 72 69  wing global vari
4e30: 61 62 6c 65 73 20 68 6f 6c 64 20 63 6f 75 6e 74  ables hold count
4e40: 65 72 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20  ers used for.** 
4e50: 74 65 73 74 69 6e 67 20 70 75 72 70 6f 73 65 73  testing purposes
4e60: 20 6f 6e 6c 79 2e 20 20 54 68 65 73 65 20 76 61   only.  These va
4e70: 72 69 61 62 6c 65 73 20 64 6f 20 6e 6f 74 20 65  riables do not e
4e80: 78 69 73 74 20 69 6e 0a 2a 2a 20 61 20 6e 6f 6e  xist in.** a non
4e90: 2d 74 65 73 74 69 6e 67 20 62 75 69 6c 64 2e 20  -testing build. 
4ea0: 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65 73   These variables
4eb0: 20 61 72 65 20 6e 6f 74 20 74 68 72 65 61 64 2d   are not thread-
4ec0: 73 61 66 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  safe..*/.#ifdef 
4ed0: 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74 20  SQLITE_TEST.int 
4ee0: 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
4ef0: 61 64 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  addb_count = 0; 
4f00: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
4f10: 66 75 6c 6c 20 70 61 67 65 73 20 72 65 61 64 20  full pages read 
4f20: 66 72 6f 6d 20 44 42 20 2a 2f 0a 69 6e 74 20 73  from DB */.int s
4f30: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4f40: 74 65 64 62 5f 63 6f 75 6e 74 20 3d 20 30 3b 20  tedb_count = 0; 
4f50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
4f60: 75 6c 6c 20 70 61 67 65 73 20 77 72 69 74 74 65  ull pages writte
4f70: 6e 20 74 6f 20 44 42 20 2a 2f 0a 69 6e 74 20 73  n to DB */.int s
4f80: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
4f90: 74 65 6a 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  tej_count = 0;  
4fa0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
4fb0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4fc0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 69 6e 74 20 73  journal */.int s
4fd0: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
4fe0: 72 65 65 5f 63 6f 75 6e 74 20 3d 20 30 3b 20 20  ree_count = 0;  
4ff0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
5000: 61 63 68 65 20 70 61 67 65 73 20 66 72 65 65 64  ache pages freed
5010: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 50 41 47   */.# define PAG
5020: 45 52 5f 49 4e 43 52 28 76 29 20 20 76 2b 2b 0a  ER_INCR(v)  v++.
5030: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 50  #else.# define P
5040: 41 47 45 52 5f 49 4e 43 52 28 76 29 0a 23 65 6e  AGER_INCR(v).#en
5050: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66  dif../*.** The f
5060: 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c  ollowing variabl
5070: 65 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  e points to the 
5080: 68 65 61 64 20 6f 66 20 61 20 64 6f 75 62 6c 65  head of a double
5090: 2d 6c 69 6e 6b 65 64 20 6c 69 73 74 0a 2a 2a 20  -linked list.** 
50a0: 6f 66 20 61 6c 6c 20 70 61 67 65 72 73 20 74 68  of all pagers th
50b0: 61 74 20 61 72 65 20 65 6c 69 67 69 62 6c 65 20  at are eligible 
50c0: 66 6f 72 20 70 61 67 65 20 73 74 65 61 6c 69 6e  for page stealin
50d0: 67 20 62 79 20 74 68 65 0a 2a 2a 20 73 71 6c 69  g by the.** sqli
50e0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
50f0: 72 79 28 29 20 69 6e 74 65 72 66 61 63 65 2e 20  ry() interface. 
5100: 20 41 63 63 65 73 73 20 74 6f 20 74 68 69 73 20   Access to this 
5110: 6c 69 73 74 20 69 73 0a 2a 2a 20 70 72 6f 74 65  list is.** prote
5120: 63 74 65 64 20 62 79 20 74 68 65 20 53 51 4c 49  cted by the SQLI
5130: 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
5140: 4d 45 4d 32 20 6d 75 74 65 78 2e 0a 2a 2f 0a 23  MEM2 mutex..*/.#
5150: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
5160: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
5170: 45 4d 45 4e 54 0a 73 74 61 74 69 63 20 50 61 67  EMENT.static Pag
5180: 65 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  er *sqlite3Pager
5190: 4c 69 73 74 20 3d 20 30 3b 0a 73 74 61 74 69 63  List = 0;.static
51a0: 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 73 71   PagerLruList sq
51b0: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
51c0: 20 3d 20 7b 30 2c 20 30 2c 20 30 7d 3b 0a 23 65   = {0, 0, 0};.#e
51d0: 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75  ndif.../*.** Jou
51e0: 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69 6e  rnal files begin
51f0: 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f 77   with the follow
5200: 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e 67  ing magic string
5210: 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20 77  .  The data.** w
5220: 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  as obtained from
5230: 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20 49   /dev/random.  I
5240: 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20 61  t is used only a
5250: 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63 6b  s a sanity check
5260: 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76 65  ..**.** Since ve
5270: 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68 65  rsion 2.8.0, the
5280: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
5290: 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69 6f  contains additio
52a0: 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63 68  nal sanity.** ch
52b0: 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ecking informati
52c0: 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77 65  on.  If the powe
52d0: 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74 68  r fails while th
52e0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 67  e journal is beg
52f0: 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20 73  in.** written, s
5300: 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62 61  emi-random garba
5310: 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61 70  ge data might ap
5320: 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  pear in the jour
5330: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74 65  nal.** file afte
5340: 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  r power is resto
5350: 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74 65  red.  If an atte
5360: 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64 65  mpt is then made
5370: 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65 20  .** to roll the 
5380: 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74 68  journal back, th
5390: 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c 64  e database could
53a0: 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20 20   be corrupted.  
53b0: 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a 2a  The additional.*
53c0: 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  * sanity checkin
53d0: 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74 74  g data is an att
53e0: 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65 72  empt to discover
53f0: 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e 20   the garbage in 
5400: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  the.** journal a
5410: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a 2a  nd ignore it..**
5420: 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20 63  .** The sanity c
5430: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
5440: 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77 20  ion for the new 
5450: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 63  journal format c
5460: 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61 20  onsists.** of a 
5470: 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d 20  32-bit checksum 
5480: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66 20  on each page of 
5490: 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63 6b  data.  The check
54a0: 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68 0a  sum covers both.
54b0: 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ** the page numb
54c0: 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67 65  er and the pPage
54d0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65  r->pageSize byte
54e0: 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74 68  s of data for th
54f0: 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20  e page..** This 
5500: 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61 6c  cksum is initial
5510: 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69 74  ized to a 32-bit
5520: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74 68   random value th
5530: 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74 68  at appears in th
5540: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
5550: 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74 68  e right after th
5560: 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20 72  e header.  The r
5570: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 65  andom initialize
5580: 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c 0a  r is important,.
5590: 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62 61  ** because garba
55a0: 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70 70  ge data that app
55b0: 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64 20  ears at the end 
55c0: 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73 20  of a journal is 
55d0: 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74  likely.** data t
55e0: 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e 20  hat was once in 
55f0: 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61 74  other files that
5600: 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20 64   have now been d
5610: 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65 0a  eleted.  If the.
5620: 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61 20  ** garbage data 
5630: 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62 73  came from an obs
5640: 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66 69  olete journal fi
5650: 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75 6d  le, the checksum
5660: 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63 6f  s might.** be co
5670: 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20 69  rrect.  But by i
5680: 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65 20  nitializing the 
5690: 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e 64  checksum to rand
56a0: 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a 2a  om value which.*
56b0: 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  * is different f
56c0: 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61 6c  or every journal
56d0: 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74 68  , we minimize th
56e0: 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  at risk..*/.stat
56f0: 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e 65  ic const unsigne
5700: 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c 4d  d char aJournalM
5710: 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78 64  agic[] = {.  0xd
5720: 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20 30  9, 0xd5, 0x05, 0
5730: 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31 2c  xf9, 0x20, 0xa1,
5740: 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b 0a   0x63, 0xd7,.};.
5750: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65 20  ./*.** The size 
5760: 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61 6e  of the header an
5770: 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20 69  d of each page i
5780: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
5790: 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20 62   determined.** b
57a0: 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  y the following 
57b0: 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66 69  macros..*/.#defi
57c0: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a  ne JOURNAL_PG_SZ
57d0: 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61 67  (pPager)  ((pPag
57e0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b 20  er->pageSize) + 
57f0: 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  8)../*.** The jo
5800: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69 7a  urnal header siz
5810: 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 72  e for this pager
5820: 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65 2c  . In the future,
5830: 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a 2a   this could be.*
5840: 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76 61  * set to some va
5850: 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68  lue read from th
5860: 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c 65  e disk controlle
5870: 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e 74  r. The important
5880: 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73 74  .** characterist
5890: 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69 73  ic is that it is
58a0: 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20 61   the same size a
58b0: 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72 2e  s a disk sector.
58c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52  .*/.#define JOUR
58d0: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
58e0: 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74  r) (pPager->sect
58f0: 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20 54  orSize)../*.** T
5900: 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20 69  he macro MEMDB i
5910: 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65  s true if we are
5920: 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61 6e   dealing with an
5930: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
5940: 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74 68  ase..** We do th
5950: 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73 6f  is as a macro so
5960: 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51 4c   that if the SQL
5970: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
5980: 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c 0a  B macro is set,.
5990: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
59a0: 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61 20  MEMDB will be a 
59b0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68 65  constant and the
59c0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 6f   compiler will o
59d0: 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20 63  ptimize.** out c
59e0: 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20 6e  ode that would n
59f0: 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a 2f  ever execute..*/
5a00: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
5a10: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20 64  MIT_MEMORYDB.# d
5a20: 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23 65  efine MEMDB 0.#e
5a30: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  lse.# define MEM
5a40: 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  DB pPager->memDb
5a50: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50  .#endif../*.** P
5a60: 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52  age number PAGER
5a70: 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65  _MJ_PGNO is neve
5a80: 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c  r used in an SQL
5a90: 69 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74  ite database (it
5aa0: 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20   is.** reserved 
5ab0: 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75  for working arou
5ac0: 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73  nd a windows/pos
5ad0: 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69  ix incompatibili
5ae0: 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73  ty). It is.** us
5af0: 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ed in the journa
5b00: 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61  l to signify tha
5b10: 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20  t the remainder 
5b20: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
5b30: 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74  ile .** is devot
5b40: 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20  ed to storing a 
5b50: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
5b60: 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20  ame - there are 
5b70: 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f  no more pages to
5b80: 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53  .** roll back. S
5b90: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20  ee comments for 
5ba0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61  function writeMa
5bb0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f  sterJournal() fo
5bc0: 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a  r details..*/./*
5bd0: 20 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d   #define PAGER_M
5be0: 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49  J_PGNO(x) (PENDI
5bf0: 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61  NG_BYTE/((x)->pa
5c00: 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66  geSize)) */.#def
5c10: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5c20: 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42  O(x) ((PENDING_B
5c30: 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69  YTE/((x)->pageSi
5c40: 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54  ze))+1)../*.** T
5c50: 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c  he maximum legal
5c60: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
5c70: 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23  (2^31 - 1)..*/.#
5c80: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58  define PAGER_MAX
5c90: 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37  _PGNO 2147483647
5ca0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
5cb0: 72 45 6e 74 65 72 28 29 20 61 6e 64 20 70 61 67  rEnter() and pag
5cc0: 65 72 4c 65 61 76 65 28 29 20 72 6f 75 74 69 6e  erLeave() routin
5cd0: 65 73 20 61 63 71 75 69 72 65 20 61 6e 64 20 72  es acquire and r
5ce0: 65 6c 65 61 73 65 0a 2a 2a 20 61 20 6d 75 74 65  elease.** a mute
5cf0: 78 20 6f 6e 20 65 61 63 68 20 70 61 67 65 72 2e  x on each pager.
5d00: 20 20 54 68 65 20 6d 75 74 65 78 20 69 73 20 72    The mutex is r
5d10: 65 63 75 72 73 69 76 65 2e 0a 2a 2a 0a 2a 2a 20  ecursive..**.** 
5d20: 54 68 69 73 20 69 73 20 61 20 73 70 65 63 69 61  This is a specia
5d30: 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65 78 2e  l-purpose mutex.
5d40: 20 20 49 74 20 6f 6e 6c 79 20 70 72 6f 76 69 64    It only provid
5d50: 65 73 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73  es mutual exclus
5d60: 69 6f 6e 0a 2a 2a 20 62 65 74 77 65 65 6e 20 74  ion.** between t
5d70: 68 65 20 42 74 72 65 65 20 61 6e 64 20 74 68 65  he Btree and the
5d80: 20 4d 65 6d 6f 72 79 20 4d 61 6e 61 67 65 6d 65   Memory Manageme
5d90: 6e 74 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  nt sqlite3_relea
5da0: 73 65 5f 6d 65 6d 6f 72 79 28 29 0a 2a 2a 20 66  se_memory().** f
5db0: 75 6e 63 74 69 6f 6e 2e 20 20 49 74 20 64 6f 65  unction.  It doe
5dc0: 73 20 6e 6f 74 20 70 72 65 76 65 6e 74 2c 20 66  s not prevent, f
5dd0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 74 77 6f 20  or example, two 
5de0: 42 74 72 65 65 73 20 66 72 6f 6d 20 61 63 63 65  Btrees from acce
5df0: 73 73 69 6e 67 0a 2a 2a 20 74 68 65 20 73 61 6d  ssing.** the sam
5e00: 65 20 70 61 67 65 72 20 61 74 20 74 68 65 20 73  e pager at the s
5e10: 61 6d 65 20 74 69 6d 65 2e 20 20 4f 74 68 65 72  ame time.  Other
5e20: 20 67 65 6e 65 72 61 6c 2d 70 75 72 70 6f 73 65   general-purpose
5e30: 20 6d 75 74 65 78 65 73 20 69 6e 0a 2a 2a 20 74   mutexes in.** t
5e40: 68 65 20 62 74 72 65 65 20 6c 61 79 65 72 20 68  he btree layer h
5e50: 61 6e 64 6c 65 20 74 68 61 74 20 63 68 6f 72 65  andle that chore
5e60: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
5e70: 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
5e80: 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 73 74  _MANAGEMENT.  st
5e90: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 45  atic void pagerE
5ea0: 6e 74 65 72 28 50 61 67 65 72 20 2a 70 29 7b 0a  nter(Pager *p){.
5eb0: 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2b      p->iInUseDB+
5ec0: 2b 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 49  +;.    if( p->iI
5ed0: 6e 55 73 65 4d 4d 20 26 26 20 70 2d 3e 69 49 6e  nUseMM && p->iIn
5ee0: 55 73 65 44 42 3d 3d 31 20 29 7b 0a 23 69 66 6e  UseDB==1 ){.#ifn
5ef0: 64 65 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58  def SQLITE_MUTEX
5f00: 5f 4e 4f 4f 50 0a 20 20 20 20 20 20 73 71 6c 69  _NOOP.      sqli
5f10: 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
5f20: 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d 20  ;.      mutex = 
5f30: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
5f40: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
5f50: 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23  _STATIC_MEM2);.#
5f60: 65 6e 64 69 66 0a 20 20 20 20 20 20 70 2d 3e 69  endif.      p->i
5f70: 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 20  InUseDB = 0;.   
5f80: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
5f90: 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20  _enter(mutex);. 
5fa0: 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44 42       p->iInUseDB
5fb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
5fc0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
5fd0: 6d 75 74 65 78 29 3b 0a 20 20 20 20 7d 0a 20 20  mutex);.    }.  
5fe0: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e    assert( p->iIn
5ff0: 55 73 65 4d 4d 3d 3d 30 20 29 3b 0a 20 20 7d 0a  UseMM==0 );.  }.
6000: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
6010: 67 65 72 4c 65 61 76 65 28 50 61 67 65 72 20 2a  gerLeave(Pager *
6020: 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49 6e 55 73  p){.    p->iInUs
6030: 65 44 42 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  eDB--;.    asser
6040: 74 28 20 70 2d 3e 69 49 6e 55 73 65 44 42 3e 3d  t( p->iInUseDB>=
6050: 30 20 29 3b 0a 20 20 7d 0a 23 65 6c 73 65 0a 23  0 );.  }.#else.#
6060: 20 64 65 66 69 6e 65 20 70 61 67 65 72 45 6e 74   define pagerEnt
6070: 65 72 28 58 29 0a 23 20 64 65 66 69 6e 65 20 70  er(X).# define p
6080: 61 67 65 72 4c 65 61 76 65 28 58 29 0a 23 65 6e  agerLeave(X).#en
6090: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 70  dif../*.** Add p
60a0: 61 67 65 20 70 50 67 20 74 6f 20 74 68 65 20 65  age pPg to the e
60b0: 6e 64 20 6f 66 20 74 68 65 20 6c 69 6e 6b 65 64  nd of the linked
60c0: 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62 79   list managed by
60d0: 20 73 74 72 75 63 74 75 72 65 0a 2a 2a 20 70 4c   structure.** pL
60e0: 69 73 74 20 28 70 50 67 20 62 65 63 6f 6d 65 73  ist (pPg becomes
60f0: 20 74 68 65 20 6c 61 73 74 20 65 6e 74 72 79 20   the last entry 
6100: 69 6e 20 74 68 65 20 6c 69 73 74 20 2d 20 74 68  in the list - th
6110: 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 6c 79 20  e most recently 
6120: 0a 2a 2a 20 75 73 65 64 29 2e 20 41 72 67 75 6d  .** used). Argum
6130: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
6140: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6150: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
6160: 67 2d 3e 67 66 72 65 65 2c 0a 2a 2a 20 64 65 70  g->gfree,.** dep
6170: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 65 74 68 65  ending on whethe
6180: 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20 61  r pPg is being a
6190: 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67 65  dded to the page
61a0: 72 2d 73 70 65 63 69 66 69 63 20 6f 72 0a 2a 2a  r-specific or.**
61b0: 20 67 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74   global LRU list
61c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
61d0: 20 6c 69 73 74 41 64 64 28 50 61 67 65 72 4c 72   listAdd(PagerLr
61e0: 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50 61  uList *pList, Pa
61f0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e  gerLruLink *pLin
6200: 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  k, PgHdr *pPg){.
6210: 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d    pLink->pNext =
6220: 20 30 3b 0a 20 20 70 4c 69 6e 6b 2d 3e 70 50 72   0;.  pLink->pPr
6230: 65 76 20 3d 20 70 4c 69 73 74 2d 3e 70 4c 61 73  ev = pList->pLas
6240: 74 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  t;..#ifdef SQLIT
6250: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6260: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73  MANAGEMENT.  ass
6270: 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d  ert(pLink==&pPg-
6280: 3e 66 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d  >free || pLink==
6290: 26 70 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20  &pPg->gfree);.  
62a0: 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70  assert(pLink==&p
62b0: 50 67 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69  Pg->gfree || pLi
62c0: 73 74 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50  st!=&sqlite3LruP
62d0: 61 67 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66  ageList);.#endif
62e0: 0a 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70  ..  if( pList->p
62f0: 4c 61 73 74 20 29 7b 0a 20 20 20 20 69 6e 74 20  Last ){.    int 
6300: 69 4f 66 66 20 3d 20 28 63 68 61 72 20 2a 29 70  iOff = (char *)p
6310: 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20 2a 29 70  Link - (char *)p
6320: 50 67 3b 0a 20 20 20 20 50 61 67 65 72 4c 72 75  Pg;.    PagerLru
6330: 4c 69 6e 6b 20 2a 70 4c 61 73 74 4c 69 6e 6b 20  Link *pLastLink 
6340: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
6350: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 73 74  *)(&((u8 *)pList
6360: 2d 3e 70 4c 61 73 74 29 5b 69 4f 66 66 5d 29 3b  ->pLast)[iOff]);
6370: 0a 20 20 20 20 70 4c 61 73 74 4c 69 6e 6b 2d 3e  .    pLastLink->
6380: 70 4e 65 78 74 20 3d 20 70 50 67 3b 0a 20 20 7d  pNext = pPg;.  }
6390: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
63a0: 28 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 29  (!pList->pFirst)
63b0: 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  ;.    pList->pFi
63c0: 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 0a  rst = pPg;.  }..
63d0: 20 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d    pList->pLast =
63e0: 20 70 50 67 3b 0a 20 20 69 66 28 20 21 70 4c 69   pPg;.  if( !pLi
63f0: 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  st->pFirstSynced
6400: 20 26 26 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   && pPg->needSyn
6410: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  c==0 ){.    pLis
6420: 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  t->pFirstSynced 
6430: 3d 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  = pPg;.  }.}../*
6440: 0a 2a 2a 20 52 65 6d 6f 76 65 20 70 50 67 20 66  .** Remove pPg f
6450: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6d 61 6e  rom the list man
6460: 61 67 65 64 20 62 79 20 74 68 65 20 73 74 72 75  aged by the stru
6470: 63 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f  cture pointed to
6480: 20 62 79 20 70 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a   by pList..**.**
6490: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
64a0: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
64b0: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
64c0: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 20   or pPg->gfree, 
64d0: 64 65 70 65 6e 64 69 6e 67 20 0a 2a 2a 20 6f 6e  depending .** on
64e0: 20 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20   whether pPg is 
64f0: 62 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74  being added to t
6500: 68 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69  he pager-specifi
6510: 63 20 6f 72 20 67 6c 6f 62 61 6c 20 4c 52 55 20  c or global LRU 
6520: 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
6530: 76 6f 69 64 20 6c 69 73 74 52 65 6d 6f 76 65 28  void listRemove(
6540: 50 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c  PagerLruList *pL
6550: 69 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e  ist, PagerLruLin
6560: 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20  k *pLink, PgHdr 
6570: 2a 70 50 67 29 7b 0a 20 20 69 6e 74 20 69 4f 66  *pPg){.  int iOf
6580: 66 20 3d 20 28 63 68 61 72 20 2a 29 70 4c 69 6e  f = (char *)pLin
6590: 6b 20 2d 20 28 63 68 61 72 20 2a 29 70 50 67 3b  k - (char *)pPg;
65a0: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
65b0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
65c0: 4e 41 47 45 4d 45 4e 54 0a 20 20 61 73 73 65 72  NAGEMENT.  asser
65d0: 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66  t(pLink==&pPg->f
65e0: 72 65 65 20 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70  ree || pLink==&p
65f0: 50 67 2d 3e 67 66 72 65 65 29 3b 0a 20 20 61 73  Pg->gfree);.  as
6600: 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26 70 50 67  sert(pLink==&pPg
6610: 2d 3e 67 66 72 65 65 20 7c 7c 20 70 4c 69 73 74  ->gfree || pList
6620: 21 3d 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67  !=&sqlite3LruPag
6630: 65 4c 69 73 74 29 3b 0a 23 65 6e 64 69 66 0a 0a  eList);.#endif..
6640: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6650: 2d 3e 70 46 69 72 73 74 20 29 7b 0a 20 20 20 20  ->pFirst ){.    
6660: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
6670: 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20  pLink->pNext;.  
6680: 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69  }.  if( pPg==pLi
6690: 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20 20  st->pLast ){.   
66a0: 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 3d 20   pList->pLast = 
66b0: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20  pLink->pPrev;.  
66c0: 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d 3e 70  }.  if( pLink->p
66d0: 50 72 65 76 20 29 7b 0a 20 20 20 20 50 61 67 65  Prev ){.    Page
66e0: 72 4c 72 75 4c 69 6e 6b 20 2a 70 50 72 65 76 4c  rLruLink *pPrevL
66f0: 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72 75 4c  ink = (PagerLruL
6700: 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29 70  ink *)(&((u8 *)p
6710: 4c 69 6e 6b 2d 3e 70 50 72 65 76 29 5b 69 4f 66  Link->pPrev)[iOf
6720: 66 5d 29 3b 0a 20 20 20 20 70 50 72 65 76 4c 69  f]);.    pPrevLi
6730: 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e  nk->pNext = pLin
6740: 6b 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  k->pNext;.  }.  
6750: 69 66 28 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  if( pLink->pNext
6760: 20 29 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75   ){.    PagerLru
6770: 4c 69 6e 6b 20 2a 70 4e 65 78 74 4c 69 6e 6b 20  Link *pNextLink 
6780: 3d 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  = (PagerLruLink 
6790: 2a 29 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b  *)(&((u8 *)pLink
67a0: 2d 3e 70 4e 65 78 74 29 5b 69 4f 66 66 5d 29 3b  ->pNext)[iOff]);
67b0: 0a 20 20 20 20 70 4e 65 78 74 4c 69 6e 6b 2d 3e  .    pNextLink->
67c0: 70 50 72 65 76 20 3d 20 70 4c 69 6e 6b 2d 3e 70  pPrev = pLink->p
67d0: 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Prev;.  }.  if( 
67e0: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
67f0: 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20  stSynced ){.    
6800: 50 67 48 64 72 20 2a 70 20 3d 20 70 4c 69 6e 6b  PgHdr *p = pLink
6810: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 77 68 69  ->pNext;.    whi
6820: 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
6830: 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 50 61  Sync ){.      Pa
6840: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 20 3d  gerLruLink *pL =
6850: 20 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a   (PagerLruLink *
6860: 29 28 26 28 28 75 38 20 2a 29 70 29 5b 69 4f 66  )(&((u8 *)p)[iOf
6870: 66 5d 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  f]);.      p = p
6880: 4c 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  L->pNext;.    }.
6890: 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73      pList->pFirs
68a0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
68b0: 0a 0a 20 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74  ..  pLink->pNext
68c0: 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20   = pLink->pPrev 
68d0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 41  = 0;.}../* .** A
68e0: 64 64 20 70 61 67 65 20 70 50 67 20 74 6f 20 74  dd page pPg to t
68f0: 68 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20  he list of free 
6900: 70 61 67 65 73 20 66 6f 72 20 74 68 65 20 70 61  pages for the pa
6910: 67 65 72 2e 20 49 66 20 0a 2a 2a 20 6d 65 6d 6f  ger. If .** memo
6920: 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73  ry-management is
6930: 20 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 61   enabled, also a
6940: 64 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74  dd the page to t
6950: 68 65 20 67 6c 6f 62 61 6c 20 0a 2a 2a 20 6c 69  he global .** li
6960: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
6970: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
6980: 20 6c 72 75 4c 69 73 74 41 64 64 28 50 67 48 64   lruListAdd(PgHd
6990: 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69 74  r *pPg){.  sqlit
69a0: 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73  e3_mutex_enter(s
69b0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
69c0: 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
69d0: 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20  STATIC_LRU));.  
69e0: 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70 50  listAdd(&pPg->pP
69f0: 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d  ager->lru, &pPg-
6a00: 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69 66  >free, pPg);.#if
6a10: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
6a20: 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d  E_MEMORY_MANAGEM
6a30: 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  ENT.  if( !pPg->
6a40: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6a50: 0a 20 20 20 20 6c 69 73 74 41 64 64 28 26 73 71  .    listAdd(&sq
6a60: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6a70: 2c 20 26 70 50 67 2d 3e 67 66 72 65 65 2c 20 70  , &pPg->gfree, p
6a80: 50 67 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  Pg);.  }.#endif.
6a90: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6aa0: 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
6ab0: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6ac0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6ad0: 55 29 29 3b 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52  U));.}../* .** R
6ae0: 65 6d 6f 76 65 20 70 61 67 65 20 70 50 67 20 66  emove page pPg f
6af0: 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20  rom the list of 
6b00: 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20 74  free pages for t
6b10: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  he associated pa
6b20: 67 65 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72  ger..** If memor
6b30: 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
6b40: 65 6e 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65  enabled, also re
6b50: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
6b60: 65 20 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a  e global list.**
6b70: 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a   of free pages..
6b80: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6b90: 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48  ruListRemove(PgH
6ba0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 73 71 6c 69  dr *pPg){.  sqli
6bb0: 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
6bc0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6bd0: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6be0: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6bf0: 20 6c 69 73 74 52 65 6d 6f 76 65 28 26 70 50 67   listRemove(&pPg
6c00: 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26  ->pPager->lru, &
6c10: 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b  pPg->free, pPg);
6c20: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
6c30: 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
6c40: 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70  AGEMENT.  if( !p
6c50: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44  Pg->pPager->memD
6c60: 62 20 29 7b 0a 20 20 20 20 6c 69 73 74 52 65 6d  b ){.    listRem
6c70: 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50  ove(&sqlite3LruP
6c80: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6c90: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 7d 0a  free, pPg);.  }.
6ca0: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
6cb0: 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
6cc0: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
6cd0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
6ce0: 41 54 49 43 5f 4c 52 55 29 29 3b 0a 7d 0a 0a 2f  ATIC_LRU));.}../
6cf0: 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  * .** This funct
6d00: 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75  ion is called ju
6d10: 73 74 20 61 66 74 65 72 20 74 68 65 20 6e 65 65  st after the nee
6d20: 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62  dSync flag has b
6d30: 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66  een cleared.** f
6d40: 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61  rom all pages ma
6d50: 6e 61 67 65 64 20 62 79 20 70 50 61 67 65 72 20  naged by pPager 
6d60: 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65  (usually because
6d70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
6d80: 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65  e.** has just be
6d90: 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75  en synced). It u
6da0: 70 64 61 74 65 73 20 74 68 65 20 70 50 61 67 65  pdates the pPage
6db0: 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e  r->lru.pFirstSyn
6dc0: 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20  ced variable.** 
6dd0: 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d  and, if memory-m
6de0: 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61  anagement is ena
6df0: 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65  bled, the sqlite
6e00: 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69  3LruPageList.pFi
6e10: 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72  rstSynced.** var
6e20: 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73  iable also..*/.s
6e30: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
6e40: 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64  stSetFirstSynced
6e50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
6e60: 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70  .  pPager->lru.p
6e70: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
6e80: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6e90: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6ea0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6eb0: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6ec0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b  pPager->memDb ){
6ed0: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20  .    PgHdr *p;. 
6ee0: 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
6ef0: 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
6f00: 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
6f10: 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
6f20: 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d  RU));.    for(p=
6f30: 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
6f40: 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20  st.pFirst; p && 
6f50: 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70  p->needSync; p=p
6f60: 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a  ->gfree.pNext);.
6f70: 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50      assert(p==pP
6f80: 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
6f90: 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c  Synced || p==sql
6fa0: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
6fb0: 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20  pFirstSynced);. 
6fc0: 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67     sqlite3LruPag
6fd0: 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63  eList.pFirstSync
6fe0: 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69  ed = p;.    sqli
6ff0: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
7000: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
7010: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
7020: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
7030: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a   }.#endif.}../*.
7040: 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  ** Return true i
7050: 66 20 70 61 67 65 20 2a 70 50 67 20 68 61 73 20  f page *pPg has 
7060: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
7070: 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74  tten to the stat
7080: 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ement.** journal
7090: 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73   (or statement s
70a0: 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e  napshot has been
70b0: 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50   created, if *pP
70c0: 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20  g is part.** of 
70d0: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
70e0: 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69  abase)..*/.stati
70f0: 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74  c int pageInStat
7100: 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67  ement(PgHdr *pPg
7110: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
7120: 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
7130: 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
7140: 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47 48 44  .    return PGHD
7150: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
7160: 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a  Pager)->inStmt;.
7170: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
7180: 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74 76 65  urn sqlite3Bitve
7190: 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49  cTest(pPager->pI
71a0: 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
71b0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
71c0: 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a 65 20  Change the size 
71d0: 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73  of the pager has
71e0: 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20 20 4e  h table to N.  N
71f0: 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77 65 72   must be a power
7200: 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f 0a 73  .** of two..*/.s
7210: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7220: 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
7230: 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  le(Pager *pPager
7240: 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67 48 64  , int N){.  PgHd
7250: 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50 67 3b  r **aHash, *pPg;
7260: 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30 20 26  .  assert( N>0 &
7270: 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30 20 29  & (N&(N-1))==0 )
7280: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
7290: 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49 4d 49  MALLOC_SOFT_LIMI
72a0: 54 0a 20 20 69 66 28 20 4e 2a 73 69 7a 65 6f 66  T.  if( N*sizeof
72b0: 28 61 48 61 73 68 5b 30 5d 29 3e 53 51 4c 49 54  (aHash[0])>SQLIT
72c0: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
72d0: 4d 49 54 20 29 7b 0a 20 20 20 20 4e 20 3d 20 53  MIT ){.    N = S
72e0: 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46  QLITE_MALLOC_SOF
72f0: 54 5f 4c 49 4d 49 54 2f 73 69 7a 65 6f 66 28 61  T_LIMIT/sizeof(a
7300: 48 61 73 68 5b 30 5d 29 3b 0a 20 20 7d 0a 20 20  Hash[0]);.  }.  
7310: 69 66 28 20 4e 3d 3d 70 50 61 67 65 72 2d 3e 6e  if( N==pPager->n
7320: 48 61 73 68 20 29 20 72 65 74 75 72 6e 3b 0a 23  Hash ) return;.#
7330: 65 6e 64 69 66 0a 20 20 70 61 67 65 72 4c 65 61  endif.  pagerLea
7340: 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  ve(pPager);.  if
7350: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 21  ( pPager->aHash!
7360: 3d 30 20 29 20 73 71 6c 69 74 65 33 46 61 75 6c  =0 ) sqlite3Faul
7370: 74 42 65 67 69 6e 42 65 6e 69 67 6e 28 53 51 4c  tBeginBenign(SQL
7380: 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f  ITE_FAULTINJECTO
7390: 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 61 48 61  R_MALLOC);.  aHa
73a0: 73 68 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c  sh = sqlite3Mall
73b0: 6f 63 5a 65 72 6f 28 20 73 69 7a 65 6f 66 28 61  ocZero( sizeof(a
73c0: 48 61 73 68 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20  Hash[0])*N );.  
73d0: 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
73e0: 68 21 3d 30 20 29 20 73 71 6c 69 74 65 33 46 61  h!=0 ) sqlite3Fa
73f0: 75 6c 74 45 6e 64 42 65 6e 69 67 6e 28 53 51 4c  ultEndBenign(SQL
7400: 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f  ITE_FAULTINJECTO
7410: 52 5f 4d 41 4c 4c 4f 43 29 3b 0a 20 20 70 61 67  R_MALLOC);.  pag
7420: 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
7430: 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30 20  .  if( aHash==0 
7440: 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75 72  ){.    /* Failur
7450: 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20 6e  e to rehash is n
7460: 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49 74  ot an error.  It
7470: 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66 6f   is only a perfo
7480: 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a 20  rmance hit. */. 
7490: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
74a0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
74b0: 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20  ager->aHash);.  
74c0: 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20  pPager->nHash = 
74d0: 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  N;.  pPager->aHa
74e0: 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66 6f  sh = aHash;.  fo
74f0: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7500: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7510: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7520: 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28 20   int h;.    if( 
7530: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
7540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
7550: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30 20  g->pNextHash==0 
7560: 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  && pPg->pPrevHas
7570: 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63 6f  h==0 );.      co
7580: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20 20  ntinue;.    }.  
7590: 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20    h = pPg->pgno 
75a0: 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50 67  & (N-1);.    pPg
75b0: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61 48  ->pNextHash = aH
75c0: 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28 20  ash[h];.    if( 
75d0: 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
75e0: 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65    aHash[h]->pPre
75f0: 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
7600: 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d 20   }.    aHash[h] 
7610: 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d 3e  = pPg;.    pPg->
7620: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 20  pPrevHash = 0;. 
7630: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64   }.}../*.** Read
7640: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
7650: 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65 6e  r from the given
7660: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
7670: 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e 74  .  Store the int
7680: 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73 20  eger.** that is 
7690: 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20 20  read in *pRes.  
76a0: 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
76b0: 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20 77   if everything w
76c0: 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a 20  orked, or an.** 
76d0: 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f  error code is so
76e0: 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  mething goes wro
76f0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76 61  ng..**.** All va
7700: 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64 20  lues are stored 
7710: 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d 65  on disk as big-e
7720: 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  ndian..*/.static
7730: 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73 28   int read32bits(
7740: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64  sqlite3_file *fd
7750: 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75 33  , i64 offset, u3
7760: 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69  2 *pRes){.  unsi
7770: 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b  gned char ac[4];
7780: 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69  .  int rc = sqli
7790: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63  te3OsRead(fd, ac
77a0: 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f 66  , sizeof(ac), of
77b0: 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63 3d  fset);.  if( rc=
77c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
77d0: 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74 65    *pRes = sqlite
77e0: 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a 20  3Get4byte(ac);. 
77f0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
7800: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 61  }../*.** Write a
7810: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 20   32-bit integer 
7820: 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62 75  into a string bu
7830: 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64 69  ffer in big-endi
7840: 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a 2a  an byte order..*
7850: 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32 62  /.#define put32b
7860: 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74 65  its(A,B)  sqlite
7870: 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29 41  3Put4byte((u8*)A
7880: 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  ,B)../*.** Write
7890: 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65   a 32-bit intege
78a0: 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e  r into the given
78b0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
78c0: 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
78d0: 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73  _OK.** on succes
78e0: 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f  s or an error co
78f0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
7900: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
7910: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33  tatic int write3
7920: 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69  2bits(sqlite3_fi
7930: 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73  le *fd, i64 offs
7940: 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20 20  et, u32 val){.  
7950: 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70 75  char ac[4];.  pu
7960: 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c 29  t32bits(ac, val)
7970: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
7980: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
7990: 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d 0a  , 4, offset);.}.
79a0: 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20 70  ./*.** If file p
79b0: 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c 6c  Fd is open, call
79c0: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
79d0: 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74 61  () on it..*/.sta
79e0: 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63 6b  tic int osUnlock
79f0: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70  (sqlite3_file *p
7a00: 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b 0a  Fd, int eLock){.
7a10: 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65 74    if( !pFd->pMet
7a20: 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74 75  hods ){.    retu
7a30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
7a40: 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  }.  return sqlit
7a50: 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c 20  e3OsUnlock(pFd, 
7a60: 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  eLock);.}../*.**
7a70: 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 64   This function d
7a80: 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65  etermines whethe
7a90: 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74 6f  r or not the ato
7aa0: 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d 69  mic-write optimi
7ab0: 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62 65  zation.** can be
7ac0: 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73 20   used with this 
7ad0: 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69 6d  pager. The optim
7ae0: 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
7af0: 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20 28  sed if:.**.**  (
7b00: 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74  a) the value ret
7b10: 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69 63  urned by OsDevic
7b20: 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
7b30: 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68 61  () indicates tha
7b40: 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74 61  t.**      a data
7b50: 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62 65  base page may be
7b60: 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
7b70: 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62 29  lly, and.**  (b)
7b80: 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72   the value retur
7b90: 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72 53  ned by OsSectorS
7ba0: 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74 68  ize() is less th
7bb0: 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20 20  an or equal.**  
7bc0: 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65 20      to the page 
7bd0: 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  size..**.** If t
7be0: 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
7bf0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c 20  cannot be used, 
7c00: 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 49  0 is returned. I
7c10: 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65 64  f it can be used
7c20: 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76 61  ,.** then the va
7c30: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
7c40: 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20  the size of the 
7c50: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65  journal file whe
7c60: 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e 73  n it.** contains
7c70: 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20 66   rollback data f
7c80: 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70  or exactly one p
7c90: 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  age..*/.#ifdef S
7ca0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
7cb0: 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69 63  MIC_WRITE.static
7cc0: 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72 53   int jrnlBufferS
7cd0: 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ize(Pager *pPage
7ce0: 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20 20  r){.  int dc;   
7cf0: 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69 63          /* Devic
7d00: 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69 63  e characteristic
7d10: 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63 74  s */.  int nSect
7d20: 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63 74  or;      /* Sect
7d30: 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e 74  or size */.  int
7d40: 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20 2f   nPage;        /
7d50: 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a 20  * Page size */. 
7d60: 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66   sqlite3_file *f
7d70: 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  d = pPager->fd;.
7d80: 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74 68  .  if( fd->pMeth
7d90: 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d 20  ods ){.    dc = 
7da0: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
7db0: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 66  haracteristics(f
7dc0: 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72 20  d);.    nSector 
7dd0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
7de0: 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20 6e  rSize(fd);.    n
7df0: 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e 70  Page = pPager->p
7e00: 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20 20  ageSize;.  }..  
7e10: 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f  assert(SQLITE_IO
7e20: 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28  CAP_ATOMIC512==(
7e30: 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73 65  512>>8));.  asse
7e40: 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f  rt(SQLITE_IOCAP_
7e50: 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35 33  ATOMIC64K==(6553
7e60: 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20 21  6>>8));..  if( !
7e70: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c 20  fd->pMethods || 
7e80: 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43 41  (dc&(SQLITE_IOCA
7e90: 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67 65 3e  P_ATOMIC|(nPage>
7ea0: 3e 38 29 29 26 26 6e 53 65 63 74 6f 72 3c 3d 6e  >8))&&nSector<=n
7eb0: 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65 74  Page) ){.    ret
7ec0: 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  urn JOURNAL_HDR_
7ed0: 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f 55  SZ(pPager) + JOU
7ee0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
7ef0: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
7f00: 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
7f10: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
7f20: 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c  n should be call
7f30: 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72  ed when an error
7f40: 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20 74   occurs within t
7f50: 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65  he pager.** code
7f60: 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67 75  . The first argu
7f70: 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65  ment is a pointe
7f80: 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20 73  r to the pager s
7f90: 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a  tructure, the.**
7fa0: 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f   second the erro
7fb0: 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20  r-code about to 
7fc0: 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 61  be returned by a
7fd0: 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63 74   pager API funct
7fe0: 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c  ion. .** The val
7ff0: 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20 61  ue returned is a
8000: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63   copy of the sec
8010: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20  ond argument to 
8020: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a  this function. .
8030: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63  **.** If the sec
8040: 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20  ond argument is 
8050: 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51  SQLITE_IOERR, SQ
8060: 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72  LITE_CORRUPT, or
8070: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20   SQLITE_FULL.** 
8080: 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65  the error become
8090: 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55 6e  s persistent. Un
80a0: 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74 65  til the persiste
80b0: 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61 72  n error is clear
80c0: 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65 6e  ed,.** subsequen
80d0: 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20 74  t API calls on t
80e0: 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20 69  his Pager will i
80f0: 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75 72  mmediately retur
8100: 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20 65  n the same .** e
8110: 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a 2a  rror code..**.**
8120: 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65 72   A persistent er
8130: 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74 68  ror indicates th
8140: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20  at the contents 
8150: 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  of the pager-cac
8160: 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65  he .** cannot be
8170: 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20 73   trusted. This s
8180: 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65 61  tate can be clea
8190: 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65 6c  red by completel
81a0: 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a 2a  y discarding .**
81b0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
81c0: 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65   the pager-cache
81d0: 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  . If a transacti
81e0: 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77 68  on was active wh
81f0: 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69 73  en.** the persis
8200: 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75 72  tent error occur
8210: 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f 6c  ed, then the rol
8220: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d 61  lback journal ma
8230: 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65 20  y need.** to be 
8240: 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74 61  replayed..*/.sta
8250: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 75  tic void pager_u
8260: 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  nlock(Pager *pPa
8270: 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e 74  ger);.static int
8280: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
8290: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
82a0: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
82b0: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
82c0: 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50 61  sert(.       pPa
82d0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
82e0: 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20  LITE_FULL ||.   
82f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43      pPager->errC
8300: 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c  ode==SQLITE_OK |
8310: 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65 72  |.       (pPager
8320: 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66 66  ->errCode & 0xff
8330: 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 0a  )==SQLITE_IOERR.
8340: 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72    );.  if(.    r
8350: 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  c2==SQLITE_FULL 
8360: 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49  ||.    rc2==SQLI
8370: 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20  TE_IOERR ||.    
8380: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52  rc2==SQLITE_CORR
8390: 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61  UPT.  ){.    pPa
83a0: 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72  ger->errCode = r
83b0: 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  c;.    if( pPage
83c0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
83d0: 55 4e 4c 4f 43 4b 20 26 26 20 70 50 61 67 65 72  UNLOCK && pPager
83e0: 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ->nRef==0 ){.   
83f0: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
8400: 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75 6e  er is already un
8410: 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61 67  locked, call pag
8420: 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77 20  er_unlock() now 
8430: 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65 61  to.      ** clea
8440: 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61 74  r the error stat
8450: 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68 61  e and ensure tha
8460: 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  t the pager-cach
8470: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 63  e is .      ** c
8480: 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 2e  ompletely empty.
8490: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
84a0: 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61  pager_unlock(pPa
84b0: 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
84c0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
84d0: 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45 5f  /*.** If SQLITE_
84e0: 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20 64  CHECK_PAGES is d
84f0: 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20 64  efined then we d
8500: 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63 68  o some sanity ch
8510: 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68 65  ecking.** on the
8520: 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20 68   cache using a h
8530: 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20 54  ash function.  T
8540: 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72 20  his is used for 
8550: 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20 64  testing.** and d
8560: 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a 2a  ebugging only..*
8570: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
8580: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a 2a  CHECK_PAGES./*.*
8590: 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62 69  * Return a 32-bi
85a0: 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70 61  t hash of the pa
85b0: 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61 67  ge data for pPag
85c0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32  e..*/.static u32
85d0: 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28   pager_datahash(
85e0: 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69 67  int nByte, unsig
85f0: 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61 29  ned char *pData)
8600: 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20 30  {.  u32 hash = 0
8610: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  ;.  int i;.  for
8620: 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20 69  (i=0; i<nByte; i
8630: 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d 20  ++){.    hash = 
8640: 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70 44  (hash*1039) + pD
8650: 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72 65  ata[i];.  }.  re
8660: 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74 61  turn hash;.}.sta
8670: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
8680: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
8690: 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  age){.  return p
86a0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70 50  ager_datahash(pP
86b0: 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67  age->pPager->pag
86c0: 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20 20  eSize, .        
86d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
86e0: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a  (unsigned char *
86f0: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
8700: 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Page));.}../*.**
8710: 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45 20   The CHECK_PAGE 
8720: 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50 67  macro takes a Pg
8730: 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75 6d  Hdr* as an argum
8740: 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f 43  ent. If SQLITE_C
8750: 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69 73  HECK_PAGES.** is
8760: 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e 44   defined, and ND
8770: 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66 69  EBUG is not defi
8780: 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28 29  ned, an assert()
8790: 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63 6b   statement check
87a0: 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  s.** that the pa
87b0: 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69 72  ge is either dir
87c0: 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74 63  ty or still matc
87d0: 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61 74  hes the calculat
87e0: 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a 2f  ed page-hash..*/
87f0: 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50  .#define CHECK_P
8800: 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67 65  AGE(x) checkPage
8810: 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  (x).static void 
8820: 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72 20  checkPage(PgHdr 
8830: 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
8840: 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
8850: 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28 20  ager;.  assert( 
8860: 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 7c  !pPg->pageHash |
8870: 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  | pPager->errCod
8880: 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70 50  e || MEMDB || pP
8890: 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20 20  g->dirty || .   
88a0: 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
88b0: 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  ==pager_pagehash
88c0: 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c 73  (pPg) );.}..#els
88d0: 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  e.#define pager_
88e0: 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20 30  datahash(X,Y)  0
88f0: 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f 70  .#define pager_p
8900: 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23 64  agehash(X)  0.#d
8910: 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47 45  efine CHECK_PAGE
8920: 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (x).#endif../*.*
8930: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
8940: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
8950: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
8960: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
8970: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
8980: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8990: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
89a0: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
89b0: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
89c0: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
89d0: 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20 74  ry supplied by t
89e0: 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a 2a  he caller. .**.*
89f0: 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20 70  * zMaster must p
8a00: 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
8a10: 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d 61   of at least nMa
8a20: 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f 63  ster bytes alloc
8a30: 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20 63  ated by.** the c
8a40: 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f 75  aller. This shou
8a50: 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76 66  ld be sqlite3_vf
8a60: 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20 28  s.mxPathname+1 (
8a70: 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65 20  to ensure there 
8a80: 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70 61  is.** enough spa
8a90: 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  ce to write the 
8aa0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8ab0: 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61 73  ame). If the mas
8ac0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 6e  ter journal.** n
8ad0: 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ame in the journ
8ae0: 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68 61  al is longer tha
8af0: 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  n nMaster bytes 
8b00: 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a 20  (including a.** 
8b10: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29 2c  nul-terminator),
8b20: 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68 61   then this is ha
8b30: 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20 6d  ndled as if no m
8b40: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
8b50: 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73 65  me.** were prese
8b60: 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  nt in the journa
8b70: 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d  l..**.** If no m
8b80: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8b90: 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73 65  le name is prese
8ba0: 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69 73  nt zMaster[0] is
8bb0: 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a 2a   set to 0 and.**
8bc0: 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72   SQLITE_OK retur
8bd0: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
8be0: 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75  nt readMasterJou
8bf0: 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69 6c  rnal(sqlite3_fil
8c00: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
8c10: 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d 61  zMaster, int nMa
8c20: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8c30: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
8c40: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
8c50: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
8c60: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
8c70: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
8c80: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
8c90: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
8ca0: 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d 20  .  zMaster[0] = 
8cb0: 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73 71  '\0';..  rc = sq
8cc0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
8cd0: 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20  pJrnl, &szJ);.  
8ce0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8cf0: 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65  K || szJ<16 ) re
8d00: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
8d10: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8d20: 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e 29  l, szJ-16, &len)
8d30: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d40: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
8d50: 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d 6e  c;..  if( len>=n
8d60: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 65  Master ){.    re
8d70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8d80: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
8d90: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73 7a  32bits(pJrnl, sz
8da0: 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  J-12, &cksum);. 
8db0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8dc0: 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
8dd0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8de0: 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61  sRead(pJrnl, aMa
8df0: 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b 0a  gic, 8, szJ-8);.
8e00: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8e10: 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d  _OK || memcmp(aM
8e20: 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  agic, aJournalMa
8e30: 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e  gic, 8) ) return
8e40: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8e50: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8e60: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c 20  , zMaster, len, 
8e70: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
8e80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8e90: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
8ea0: 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65 72  c;.  }.  zMaster
8eb0: 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20  [len] = '\0';.. 
8ec0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
8ed0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
8ee0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8ef0: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
8f00: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
8f10: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
8f20: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20 7d  zMaster[i];.   }
8f30: 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a  .  if( cksum ){.
8f40: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63 68      /* If the ch
8f50: 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20 61  ecksum doesn't a
8f60: 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20  dd up, then one 
8f70: 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20 64  or more of the d
8f80: 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20 20  isk sectors.    
8f90: 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ** containing th
8fa0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8fb0: 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72   filename is cor
8fc0: 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65 61  rupted. This mea
8fd0: 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e 69  ns.    ** defini
8fe0: 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20  tely roll back, 
8ff0: 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20 53  so just return S
9000: 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70  QLITE_OK and rep
9010: 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20 20  ort a (nul).    
9020: 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61  ** master-journa
9030: 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20  l filename..    
9040: 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b 30  */.    zMaster[0
9050: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
9060: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
9070: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
9080: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
9090: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
90a0: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
90b0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
90c0: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
90d0: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
90e0: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
90f0: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
9100: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
9110: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
9120: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
9130: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
9140: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
9150: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
9160: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
9170: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
9180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
91a0: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
91b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91c0: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
91e0: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
91f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9200: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
9210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9220: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
9230: 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a 6f  atic void seekJo
9240: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
9250: 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f  pPager){.  i64 o
9260: 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34  ffset = 0;.  i64
9270: 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75   c = pPager->jou
9280: 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63  rnalOff;.  if( c
9290: 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d   ){.    offset =
92a0: 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f   ((c-1)/JOURNAL_
92b0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b  HDR_SZ(pPager) +
92c0: 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44   1) * JOURNAL_HD
92d0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  R_SZ(pPager);.  
92e0: 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  }.  assert( offs
92f0: 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  et%JOURNAL_HDR_S
9300: 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a  Z(pPager)==0 );.
9310: 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74    assert( offset
9320: 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=c );.  assert(
9330: 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52   (offset-c)<JOUR
9340: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
9350: 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  r) );.  pPager->
9360: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66  journalOff = off
9370: 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72  set;.}../*.** Wr
9380: 69 74 65 20 7a 65 72 6f 73 20 6f 76 65 72 20 74  ite zeros over t
9390: 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65  he header of the
93a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
93b0: 54 68 69 73 20 68 61 73 20 74 68 65 0a 2a 2a 20  This has the.** 
93c0: 65 66 66 65 63 74 20 6f 66 20 69 6e 76 61 6c 69  effect of invali
93d0: 64 61 74 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e  dating the journ
93e0: 61 6c 20 66 69 6c 65 20 61 6e 64 20 63 6f 6d 6d  al file and comm
93f0: 69 74 74 69 6e 67 20 74 68 65 0a 2a 2a 20 74 72  itting the.** tr
9400: 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  ansaction..*/.st
9410: 61 74 69 63 20 69 6e 74 20 7a 65 72 6f 4a 6f 75  atic int zeroJou
9420: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
9430: 50 61 67 65 72 2c 20 69 6e 74 20 64 6f 54 72 75  Pager, int doTru
9440: 6e 63 61 74 65 29 7b 0a 20 20 69 6e 74 20 72 63  ncate){.  int rc
9450: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9460: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
9470: 72 20 7a 65 72 6f 48 64 72 5b 32 38 5d 3b 0a 0a  r zeroHdr[28];..
9480: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
9490: 75 72 6e 61 6c 4f 66 66 20 29 7b 0a 20 20 20 20  urnalOff ){.    
94a0: 49 4f 54 52 41 43 45 28 28 22 4a 5a 45 52 4f 48  IOTRACE(("JZEROH
94b0: 44 52 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72  DR %p\n", pPager
94c0: 29 29 0a 20 20 20 20 69 66 28 20 64 6f 54 72 75  )).    if( doTru
94d0: 6e 63 61 74 65 20 29 7b 0a 20 20 20 20 20 20 72  ncate ){.      r
94e0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75  c = sqlite3OsTru
94f0: 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  ncate(pPager->jf
9500: 64 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  d, 0);.    }else
9510: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
9520: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9530: 65 72 2d 3e 6a 66 64 2c 20 7a 65 72 6f 48 64 72  er->jfd, zeroHdr
9540: 2c 20 73 69 7a 65 6f 66 28 7a 65 72 6f 48 64 72  , sizeof(zeroHdr
9550: 29 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ), 0);.    }.   
9560: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
9570: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
9580: 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
9590: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 53 51 4c 49  Pager->jfd, SQLI
95a0: 54 45 5f 53 59 4e 43 5f 44 41 54 41 4f 4e 4c 59  TE_SYNC_DATAONLY
95b0: 7c 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  |pPager->sync_fl
95c0: 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ags);.    }.  }.
95d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
95e0: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
95f0: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
9600: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
9610: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
9620: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
9630: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
9640: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
9650: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
9660: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
9670: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
9680: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
9690: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
96a0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
96b0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
96c0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
96d0: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
96e0: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
96f0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
9700: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
9710: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
9720: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
9730: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
9740: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
9750: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
9760: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
9770: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
9780: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
9790: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
97a0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
97b0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
97c0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
97d0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 2d 20 34 20 62  ournal..** - 4 b
97e0: 79 74 65 73 3a 20 44 61 74 61 62 61 73 65 20 70  ytes: Database p
97f0: 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 20 0a 2a 2a  age size..** .**
9800: 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f   Followed by (JO
9810: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32  URNAL_HDR_SZ - 2
9820: 38 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73  8) bytes of unus
9830: 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61  ed space..*/.sta
9840: 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75  tic int writeJou
9850: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
9860: 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
9870: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9880: 63 68 61 72 20 2a 7a 48 65 61 64 65 72 20 3d 20  char *zHeader = 
9890: 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63  pPager->pTmpSpac
98a0: 65 3b 0a 20 20 69 6e 74 20 6e 48 65 61 64 65 72  e;.  int nHeader
98b0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
98c0: 69 7a 65 3b 0a 20 20 69 6e 74 20 6e 57 72 69 74  ize;.  int nWrit
98d0: 65 3b 0a 0a 20 20 69 66 28 20 6e 48 65 61 64 65  e;..  if( nHeade
98e0: 72 3e 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  r>JOURNAL_HDR_SZ
98f0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
9900: 6e 48 65 61 64 65 72 20 3d 20 4a 4f 55 52 4e 41  nHeader = JOURNA
9910: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9920: 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
9930: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
9940: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
9950: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
9960: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
9970: 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f  f;.  }..  seekJo
9980: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
9990: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
99a0: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
99b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
99c0: 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c 20  memcpy(zHeader, 
99d0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
99e0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
99f0: 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20  gic));..  /* .  
9a00: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  ** Write the nRe
9a10: 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e 75  c Field - the nu
9a20: 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
9a30: 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77  ords that follow
9a40: 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e   this.  ** journ
9a50: 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61  al header. Norma
9a60: 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72 69  lly, zero is wri
9a70: 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61 6c  tten to this val
9a80: 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e  ue at this time.
9a90: 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65 20  .  ** After the 
9aa0: 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64 65  records are adde
9ab0: 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d to the journal
9ac0: 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61   (and the journa
9ad0: 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20  l synced, .  ** 
9ae0: 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  if in full-sync 
9af0: 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f 20  mode), the zero 
9b00: 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77  is overwritten w
9b10: 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75 6d  ith the true num
9b20: 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f  ber.  ** of reco
9b30: 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f 75  rds (see syncJou
9b40: 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20  rnal())..  **.  
9b50: 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74 65  ** A faster alte
9b60: 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77 72  rnative is to wr
9b70: 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20 74  ite 0xFFFFFFFF t
9b80: 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  o the nRec field
9b90: 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64  . When.  ** read
9ba0: 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
9bb0: 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c 73  this value tells
9bc0: 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75 6d   SQLite to assum
9bd0: 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a 20  e that the.  ** 
9be0: 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  rest of the jour
9bf0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
9c00: 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63  s valid page rec
9c10: 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75 6d  ords. This assum
9c20: 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61  ption.  ** is da
9c30: 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20 61  ngerous, as if a
9c40: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65 64   failure occured
9c50: 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
9c60: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
9c70: 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79 20   ** file it may 
9c80: 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61 72  contain some gar
9c90: 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72 65  bage data. There
9ca0: 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72 69   are two scenari
9cb0: 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74 68  os.  ** where th
9cc0: 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20 69  is risk can be i
9cd0: 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a  gnored:.  **.  *
9ce0: 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 70  *   * When the p
9cf0: 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79  ager is in no-sy
9d00: 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74  nc mode. Corrupt
9d10: 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61  ion can follow a
9d20: 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72 20  .  **     power 
9d30: 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73 20  failure in this 
9d40: 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a  case anyway..  *
9d50: 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20  *.  **   * When 
9d60: 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41 50  the SQLITE_IOCAP
9d70: 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c 61  _SAFE_APPEND fla
9d80: 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20 67  g is set. This g
9d90: 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20  uarantees.  **  
9da0: 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65 20     that garbage 
9db0: 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61 70  data is never ap
9dc0: 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a 6f  pended to the jo
9dd0: 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f  urnal file..  */
9de0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
9df0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
9e00: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b  pPager->noSync);
9e10: 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e  .  if( (pPager->
9e20: 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28  noSync) .   || (
9e30: 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43  sqlite3OsDeviceC
9e40: 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28 70  haracteristics(p
9e50: 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49 54  Pager->fd)&SQLIT
9e60: 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
9e70: 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20 70  END) .  ){.    p
9e80: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9e90: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9ea0: 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66 66  lMagic)], 0xffff
9eb0: 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  ffff);.  }else{.
9ec0: 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26 7a      put32bits(&z
9ed0: 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a  Header[sizeof(aJ
9ee0: 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30  ournalMagic)], 0
9ef0: 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65  );.  }..  /* The
9f00: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
9f10: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
9f20: 2f 20 0a 20 20 73 71 6c 69 74 65 33 5f 72 61 6e  / .  sqlite3_ran
9f30: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9f40: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9f50: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9f60: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9f70: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9f80: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9f90: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9fa0: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9fb0: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9fc0: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9fd0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9fe0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9ff0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
a000: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
a010: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
a020: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
a030: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
a040: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
a050: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
a060: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
a070: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
a080: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
a090: 3e 6a 6f 75 72 6e 61 6c 48 64 72 3d 3d 30 20 29  >journalHdr==0 )
a0a0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
a0b0: 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20 70 75  e size */.    pu
a0c0: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
a0d0: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
a0e0: 4d 61 67 69 63 29 2b 31 36 5d 2c 20 70 50 61 67  Magic)+16], pPag
a0f0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
a100: 20 7d 0a 0a 20 20 66 6f 72 28 6e 57 72 69 74 65   }..  for(nWrite
a110: 3d 30 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =0; rc==SQLITE_O
a120: 4b 26 26 6e 57 72 69 74 65 3c 4a 4f 55 52 4e 41  K&&nWrite<JOURNA
a130: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
a140: 3b 20 6e 57 72 69 74 65 2b 3d 6e 48 65 61 64 65  ; nWrite+=nHeade
a150: 72 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  r){.    IOTRACE(
a160: 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20 25  ("JHDR %p %lld %
a170: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
a180: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
a190: 2c 20 6e 48 65 61 64 65 72 29 29 0a 20 20 20 20  , nHeader)).    
a1a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
a1b0: 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ite(pPager->jfd,
a1c0: 20 7a 48 65 61 64 65 72 2c 20 6e 48 65 61 64 65   zHeader, nHeade
a1d0: 72 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  r, pPager->journ
a1e0: 61 6c 4f 66 66 29 3b 0a 20 20 20 20 70 50 61 67  alOff);.    pPag
a1f0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
a200: 3d 20 6e 48 65 61 64 65 72 3b 0a 20 20 7d 0a 0a  = nHeader;.  }..
a210: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
a220: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
a230: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
a240: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73  pen when this is
a250: 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e   called. A journ
a260: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a  al header file.*
a270: 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  * (JOURNAL_HDR_S
a280: 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64  Z bytes) is read
a290: 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e   from the curren
a2a0: 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  t location in th
a2b0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
a2c0: 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  e. See comments 
a2d0: 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77  above function w
a2e0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29  riteJournalHdr()
a2f0: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
a300: 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75  on of.** the jou
a310: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d  rnal header form
a320: 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  at..**.** If the
a330: 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20   header is read 
a340: 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e  successfully, *n
a350: 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68  Rec is set to th
a360: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70  e number of.** p
a370: 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c  age records foll
a380: 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65  owing this heade
a390: 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73  r and *dbSize is
a3a0: 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65   set to the size
a3b0: 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62   of the.** datab
a3c0: 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74  ase before the t
a3d0: 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e  ransaction began
a3e0: 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f  , in pages. Also
a3f0: 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  , pPager->cksumI
a400: 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  nit.** is set to
a410: 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20   the value read 
a420: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a430: 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f   header. SQLITE_
a440: 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  OK is returned.*
a450: 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  * in this case..
a460: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75  **.** If the jou
a470: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65  rnal header file
a480: 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63   appears to be c
a490: 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45  orrupted, SQLITE
a4a0: 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75  _DONE is.** retu
a4b0: 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61  rned and *nRec a
a4c0: 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e  nd *dbSize are n
a4d0: 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52  ot set.  If JOUR
a4e0: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
a4f0: 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  .** cannot be re
a500: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
a510: 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f  nal file an erro
a520: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
a530: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
a540: 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  t readJournalHdr
a550: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
a560: 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61  r, .  i64 journa
a570: 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e  lSize,.  u32 *pN
a580: 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62  Rec, .  u32 *pDb
a590: 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63  Size.){.  int rc
a5a0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
a5b0: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
a5c0: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
a5d0: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
a5e0: 72 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f  r */.  i64 jrnlO
a5f0: 66 66 3b 0a 20 20 69 6e 74 20 69 50 61 67 65 53  ff;.  int iPageS
a600: 69 7a 65 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72  ize;..  seekJour
a610: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
a620: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
a630: 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c  urnalOff+JOURNAL
a640: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
a650: 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b  > journalSize ){
a660: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
a670: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a  TE_DONE;.  }.  j
a680: 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
a690: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20  >journalOff;..  
a6a0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
a6b0: 61 64 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ad(pPager->jfd, 
a6c0: 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  aMagic, sizeof(a
a6d0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
a6e0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
a6f0: 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66  urn rc;.  jrnlOf
a700: 66 20 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67  f += sizeof(aMag
a710: 69 63 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63  ic);..  if( memc
a720: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
a730: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
a740: 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a  (aMagic))!=0 ){.
a750: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
a760: 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72  E_DONE;.  }..  r
a770: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a780: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a790: 4f 66 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  Off, pNRec);.  i
a7a0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a7b0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a7c0: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a7d0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70  d, jrnlOff+4, &p
a7e0: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
a7f0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
a800: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
a810: 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67   read32bits(pPag
a820: 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
a830: 2b 38 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20  +8, pDbSize);.  
a840: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
a850: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
a860: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
a870: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 36 2c 20  fd, jrnlOff+16, 
a880: 28 75 33 32 20 2a 29 26 69 50 61 67 65 53 69 7a  (u32 *)&iPageSiz
a890: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
a8a0: 4c 49 54 45 5f 4f 4b 20 0a 20 20 20 26 26 20 69  LITE_OK .   && i
a8b0: 50 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 0a 20  PageSize>=512 . 
a8c0: 20 20 26 26 20 69 50 61 67 65 53 69 7a 65 3c 3d    && iPageSize<=
a8d0: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
a8e0: 53 49 5a 45 20 0a 20 20 20 26 26 20 28 28 69 50  SIZE .   && ((iP
a8f0: 61 67 65 53 69 7a 65 2d 31 29 26 69 50 61 67 65  ageSize-1)&iPage
a900: 53 69 7a 65 29 3d 3d 30 20 0a 20 20 29 7b 0a 20  Size)==0 .  ){. 
a910: 20 20 20 75 31 36 20 70 61 67 65 73 69 7a 65 20     u16 pagesize 
a920: 3d 20 69 50 61 67 65 53 69 7a 65 3b 0a 20 20 20  = iPageSize;.   
a930: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
a940: 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 70 50  erSetPagesize(pP
a950: 61 67 65 72 2c 20 26 70 61 67 65 73 69 7a 65 29  ager, &pagesize)
a960: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 20 29  ;.  }.  if( rc )
a970: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
a980: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
a990: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
a9a0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
a9b0: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
a9c0: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
a9d0: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
a9e0: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
a9f0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
aa00: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
aa10: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
aa20: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
aa30: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
aa40: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
aa50: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
aa60: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
aa70: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
aa80: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
aa90: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
aaa0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
aab0: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
aac0: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
aad0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
aae0: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 31 32  >jfd, jrnlOff+12
aaf0: 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67 65 72  , (u32 *)&pPager
ab00: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
ab10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
ab20: 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e   rc;..  pPager->
ab30: 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f  journalOff += JO
ab40: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
ab50: 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53  ger);.  return S
ab60: 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a 2f 2a  QLITE_OK;.}.../*
ab70: 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75  .** Write the su
ab80: 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f  pplied master jo
ab90: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20  urnal name into 
aba0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
abb0: 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50   for pager.** pP
abc0: 61 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72  ager at the curr
abd0: 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ent location. Th
abe0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
abf0: 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68   name must be th
ac00: 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20  e last.** thing 
ac10: 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75  written to a jou
ac20: 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68  rnal file. If th
ac30: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75  e pager is in fu
ac40: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  ll-sync mode, th
ac50: 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e.** journal fil
ac60: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20  e descriptor is 
ac70: 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20  advanced to the 
ac80: 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e  next sector boun
ac90: 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61  dary before.** a
aca0: 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74  nything is writt
acb0: 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69  en. The format i
acc0: 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74  s:.**.** + 4 byt
acd0: 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  es: PAGER_MJ_PGN
ace0: 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a  O..** + N bytes:
acf0: 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65   length of maste
ad00: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  r journal name..
ad10: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a  ** + 4 bytes: N.
ad20: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61  ** + 4 bytes: Ma
ad30: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
ad40: 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b  e checksum..** +
ad50: 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e   8 bytes: aJourn
ad60: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a  alMagic[]..**.**
ad70: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
ad80: 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75  nal page checksu
ad90: 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20  m is the sum of 
ada0: 74 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65  the bytes in the
adb0: 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
adc0: 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 49  al name..**.** I
add0: 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61 20 4e  f zMaster is a N
ade0: 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f 63 63  ULL pointer (occ
adf0: 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67 6c 65  urs for a single
ae00: 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73 61   database transa
ae10: 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68 69 73  ction), .** this
ae20: 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d 6f 70   call is a no-op
ae30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ae40: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
ae50: 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  al(Pager *pPager
ae60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
ae70: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
ae80: 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20  ;.  int len; .  
ae90: 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20 6a 72  int i; .  i64 jr
aea0: 6e 6c 4f 66 66 3b 0a 20 20 69 36 34 20 6a 72 6e  nlOff;.  i64 jrn
aeb0: 6c 53 69 7a 65 3b 0a 20 20 75 33 32 20 63 6b 73  lSize;.  u32 cks
aec0: 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  um = 0;.  char z
aed0: 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  Buf[sizeof(aJour
aee0: 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d 3b 0a  nalMagic)+2*4];.
aef0: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
af00: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
af10: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
af20: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
af30: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
af40: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
af50: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
af60: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
af70: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
af80: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
af90: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
afa0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
afb0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
afc0: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
afd0: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
afe0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
aff0: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
b000: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
b010: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
b020: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
b030: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
b040: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
b050: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
b060: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
b070: 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64     seekJournalHd
b080: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  r(pPager);.  }. 
b090: 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
b0a0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
b0b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b0c0: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
b0d0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
b0e0: 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64  bits(pPager->jfd
b0f0: 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47 45 52  , jrnlOff, PAGER
b100: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
b110: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
b120: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b130: 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d  rc;.  jrnlOff +=
b140: 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   4;..  rc = sqli
b150: 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
b160: 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c  r->jfd, zMaster,
b170: 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a   len, jrnlOff);.
b180: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
b190: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
b1a0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 6c 65  .  jrnlOff += le
b1b0: 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74 73 28  n;..  put32bits(
b1c0: 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20 70 75  zBuf, len);.  pu
b1d0: 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b 34 5d  t32bits(&zBuf[4]
b1e0: 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65 6d 63  , cksum);.  memc
b1f0: 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61 4a 6f  py(&zBuf[8], aJo
b200: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
b210: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
b220: 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ));.  rc = sqlit
b230: 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72  e3OsWrite(pPager
b240: 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38 2b 73  ->jfd, zBuf, 8+s
b250: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b260: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
b270: 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 38 2b 73    jrnlOff += 8+s
b280: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
b290: 67 69 63 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  gic);.  pPager->
b2a0: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
b2b0: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 0a 20 20 2f  er->noSync;..  /
b2c0: 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  * If the pager i
b2d0: 73 20 69 6e 20 70 65 72 69 73 74 65 6e 74 2d 6a  s in peristent-j
b2e0: 6f 75 72 6e 61 6c 20 6d 6f 64 65 2c 20 74 68 65  ournal mode, the
b2f0: 6e 20 74 68 65 20 70 68 79 73 69 63 61 6c 20 0a  n the physical .
b300: 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c    ** journal-fil
b310: 65 20 6d 61 79 20 65 78 74 65 6e 64 20 70 61 73  e may extend pas
b320: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
b330: 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20   master-journal 
b340: 6e 61 6d 65 0a 20 20 2a 2a 20 61 6e 64 20 38 20  name.  ** and 8 
b350: 62 79 74 65 73 20 6f 66 20 6d 61 67 69 63 20 64  bytes of magic d
b360: 61 74 61 20 6a 75 73 74 20 77 72 69 74 74 65 6e  ata just written
b370: 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 54 68   to the file. Th
b380: 69 73 20 69 73 20 0a 20 20 2a 2a 20 64 61 6e 67  is is .  ** dang
b390: 65 72 6f 75 73 20 62 65 63 61 75 73 65 20 74 68  erous because th
b3a0: 65 20 63 6f 64 65 20 74 6f 20 72 6f 6c 6c 62 61  e code to rollba
b3b0: 63 6b 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  ck a hot-journal
b3c0: 20 66 69 6c 65 0a 20 20 2a 2a 20 77 69 6c 6c 20   file.  ** will 
b3d0: 6e 6f 74 20 62 65 20 61 62 6c 65 20 74 6f 20 66  not be able to f
b3e0: 69 6e 64 20 74 68 65 20 6d 61 73 74 65 72 2d 6a  ind the master-j
b3f0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 74 6f 20 64  ournal name to d
b400: 65 74 65 72 6d 69 6e 65 20 0a 20 20 2a 2a 20 77  etermine .  ** w
b410: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
b420: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 68 6f 74  e journal is hot
b430: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 45 61 73  . .  **.  ** Eas
b440: 69 65 73 74 20 74 68 69 6e 67 20 74 6f 20 64 6f  iest thing to do
b450: 20 69 6e 20 74 68 69 73 20 73 63 65 6e 61 72 69   in this scenari
b460: 6f 20 69 73 20 74 6f 20 74 72 75 6e 63 61 74 65  o is to truncate
b470: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 20 20   the journal .  
b480: 2a 2a 20 66 69 6c 65 20 74 6f 20 74 68 65 20 72  ** file to the r
b490: 65 71 75 69 72 65 64 20 73 69 7a 65 2e 0a 20 20  equired size..  
b4a0: 2a 2f 20 0a 20 20 69 66 28 20 28 72 63 3d 3d 53  */ .  if( (rc==S
b4b0: 51 4c 49 54 45 5f 4f 4b 29 0a 20 20 20 26 26 20  QLITE_OK).   && 
b4c0: 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46  (rc = sqlite3OsF
b4d0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
b4e0: 6a 66 64 2c 20 26 6a 72 6e 6c 53 69 7a 65 29 29  jfd, &jrnlSize))
b4f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 26  ==SQLITE_OK.   &
b500: 26 20 6a 72 6e 6c 53 69 7a 65 3e 6a 72 6e 6c 4f  & jrnlSize>jrnlO
b510: 66 66 0a 20 20 29 7b 0a 20 20 20 20 72 63 20 3d  ff.  ){.    rc =
b520: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
b530: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
b540: 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 7d 0a 20 20  jrnlOff);.  }.  
b550: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
b560: 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76  .** Add or remov
b570: 65 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68  e a page from th
b580: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
b590: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
b5a0: 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74  the.** statement
b5b0: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
b5c0: 54 68 65 20 50 61 67 65 72 20 6b 65 65 70 73 20  The Pager keeps 
b5d0: 61 20 73 65 70 61 72 61 74 65 20 6c 69 73 74 20  a separate list 
b5e0: 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 61 72  of pages that ar
b5f0: 65 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a  e currently in.*
b600: 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
b610: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68  journal.  This h
b620: 65 6c 70 73 20 74 68 65 20 73 71 6c 69 74 65 33  elps the sqlite3
b630: 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28  PagerStmtCommit(
b640: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
b650: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
b660: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
b670: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
b680: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
b690: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
b6a0: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
b6b0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b6c0: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
b6d0: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
b6e0: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
b6f0: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
b700: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
b710: 50 61 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f  Pager;.  PgHisto
b720: 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
b730: 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
b740: 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
b750: 28 20 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28  ( MEMDB );.  if(
b760: 20 21 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20   !pHist->inStmt 
b770: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
b780: 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d  Hist->pPrevStmt=
b790: 3d 30 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65  =0 && pHist->pNe
b7a0: 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  xtStmt==0 );.   
b7b0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74   if( pPager->pSt
b7c0: 6d 74 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44  mt ){.      PGHD
b7d0: 52 5f 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72  R_TO_HIST(pPager
b7e0: 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29  ->pStmt, pPager)
b7f0: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
b800: 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69  g;.    }.    pHi
b810: 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  st->pNextStmt = 
b820: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20  pPager->pStmt;. 
b830: 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
b840: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73   = pPg;.    pHis
b850: 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20  t->inStmt = 1;. 
b860: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64   }.}../*.** Find
b870: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 68   a page in the h
b880: 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20  ash table given 
b890: 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  its page number.
b8a0: 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f    Return.** a po
b8b0: 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
b8c0: 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74  e or NULL if not
b8d0: 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69   found..*/.stati
b8e0: 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c  c PgHdr *pager_l
b8f0: 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61  ookup(Pager *pPa
b900: 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ger, Pgno pgno){
b910: 0a 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69  .  PgHdr *p;.  i
b920: 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
b930: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
b940: 20 20 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48    p = pPager->aH
b950: 61 73 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67  ash[pgno & (pPag
b960: 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20  er->nHash-1)];. 
b970: 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e   while( p && p->
b980: 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20  pgno!=pgno ){.  
b990: 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61    p = p->pNextHa
b9a0: 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  sh;.  }.  return
b9b0: 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   p;.}../*.** Cle
b9c0: 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  ar the in-memory
b9d0: 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f   cache.  This ro
b9e0: 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68  utine.** sets th
b9f0: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 70  e state of the p
ba00: 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61  ager back to wha
ba10: 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69 74  t it was when it
ba20: 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70   was first.** op
ba30: 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74  ened.  Any outst
ba40: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
ba50: 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64   invalidated and
ba60: 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74 65   subsequent atte
ba70: 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73  mpts.** to acces
ba80: 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77 69  s those pages wi
ba90: 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74  ll likely result
baa0: 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
bab0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
bac0: 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65 72  ager_reset(Pager
bad0: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
bae0: 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
baf0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
bb00: 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 73 71 6c  MUTEX_NOOP.  sql
bb10: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
bb20: 78 3b 0a 23 65 6e 64 69 66 0a 20 20 69 66 28 20  x;.#endif.  if( 
bb30: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
bb40: 29 20 72 65 74 75 72 6e 3b 0a 23 69 66 6e 64 65  ) return;.#ifnde
bb50: 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
bb60: 4f 4f 50 0a 20 20 6d 75 74 65 78 20 3d 20 73 71  OOP.  mutex = sq
bb70: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
bb80: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
bb90: 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 73  TATIC_MEM2);.  s
bba0: 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74  qlite3_mutex_ent
bbb0: 65 72 28 6d 75 74 65 78 29 3b 0a 23 65 6e 64 69  er(mutex);.#endi
bbc0: 66 0a 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61  f..  for(pPg=pPa
bbd0: 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
bbe0: 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
bbf0: 49 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45  IOTRACE(("PGFREE
bc00: 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
bc10: 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
bc20: 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
bc30: 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
bc40: 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
bc50: 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pNext = pPg->pNe
bc60: 78 74 41 6c 6c 3b 0a 20 20 20 20 6c 72 75 4c 69  xtAll;.    lruLi
bc70: 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 20  stRemove(pPg);. 
bc80: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
bc90: 70 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20  pPg->pData);.   
bca0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
bcb0: 67 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  g);.  }.  assert
bcc0: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  (pPager->lru.pFi
bcd0: 72 73 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72  rst==0);.  asser
bce0: 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  t(pPager->lru.pF
bcf0: 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a  irstSynced==0);.
bd00: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
bd10: 3e 6c 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a  >lru.pLast==0);.
bd20: 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
bd30: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
bd40: 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  All = 0;.  pPage
bd50: 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
bd60: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
bd70: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
bd80: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
bd90: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61  );.  pPager->nPa
bda0: 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ge = 0;.  pPager
bdb0: 2d 3e 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70  ->aHash = 0;.  p
bdc0: 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b  Pager->nRef = 0;
bdd0: 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78  .  sqlite3_mutex
bde0: 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 7d  _leave(mutex);.}
bdf0: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
be00: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
be10: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
be20: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
be30: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
be40: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
be50: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
be60: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
be70: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
be80: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
be90: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
bea0: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
beb0: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
bec0: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
bed0: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
bee0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
bef0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
bf00: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
bf10: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
bf20: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
bf30: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
bf40: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
bf50: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
bf60: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
bf70: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
bf80: 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
bf90: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
bfa0: 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
bfb0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63   ){.      int rc
bfc0: 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61 67   = osUnlock(pPag
bfd0: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
bfe0: 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  ;.      if( rc )
bff0: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
c000: 20 3d 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61   = rc;.      pPa
c010: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
c020: 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28  ;.      IOTRACE(
c030: 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20  ("UNLOCK %p\n", 
c040: 70 50 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20  pPager))..      
c050: 2f 2a 20 41 6c 77 61 79 73 20 63 6c 6f 73 65 20  /* Always close 
c060: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
c070: 20 77 68 65 6e 20 64 72 6f 70 70 69 6e 67 20 74   when dropping t
c080: 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b  he database lock
c090: 2e 0a 20 20 20 20 20 20 2a 2a 20 4f 74 68 65 72  ..      ** Other
c0a0: 77 69 73 65 2c 20 61 6e 6f 74 68 65 72 20 63 6f  wise, another co
c0b0: 6e 6e 65 63 74 69 6f 6e 20 77 69 74 68 20 6a 6f  nnection with jo
c0c0: 75 72 6e 61 6c 5f 6d 6f 64 65 3d 64 65 6c 65 74  urnal_mode=delet
c0d0: 65 20 6d 69 67 68 74 0a 20 20 20 20 20 20 2a 2a  e might.      **
c0e0: 20 64 65 6c 65 74 65 20 74 68 65 20 66 69 6c 65   delete the file
c0f0: 20 6f 75 74 20 66 72 6f 6d 20 75 6e 64 65 72 20   out from under 
c100: 75 73 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  us..      */.   
c110: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a     if( pPager->j
c120: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
c130: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
c140: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
c150: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  );.        pPage
c160: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
c170: 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
c180: 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79  te3BitvecDestroy
c190: 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72  (pPager->pInJour
c1a0: 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 70 50  nal);.        pP
c1b0: 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
c1c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20   = 0;.      }.. 
c1d0: 20 20 20 20 20 2f 2a 20 49 66 20 50 61 67 65 72       /* If Pager
c1e0: 2e 65 72 72 43 6f 64 65 20 69 73 20 73 65 74 2c  .errCode is set,
c1f0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
c200: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
c210: 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20 20 20 20   cannot be.     
c220: 20 2a 2a 20 74 72 75 73 74 65 64 2e 20 4e 6f 77   ** trusted. Now
c230: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
c240: 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63 6b 65 64  file is unlocked
c250: 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  , the contents o
c260: 66 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 63  f the.      ** c
c270: 61 63 68 65 20 63 61 6e 20 62 65 20 64 69 73 63  ache can be disc
c280: 61 72 64 65 64 20 61 6e 64 20 74 68 65 20 65 72  arded and the er
c290: 72 6f 72 20 63 6f 64 65 20 73 61 66 65 6c 79 20  ror code safely 
c2a0: 63 6c 65 61 72 65 64 2e 0a 20 20 20 20 20 20 2a  cleared..      *
c2b0: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  /.      if( pPag
c2c0: 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
c2d0: 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
c2e0: 51 4c 49 54 45 5f 4f 4b 20 29 20 70 50 61 67 65  QLITE_OK ) pPage
c2f0: 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c  r->errCode = SQL
c300: 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20  ITE_OK;.        
c310: 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
c320: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
c330: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
c340: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  n ){.          s
c350: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
c360: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
c370: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69         sqlite3Bi
c380: 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67  tvecDestroy(pPag
c390: 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20  er->pInStmt);.  
c3a0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
c3b0: 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
c3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
c3d0: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
c3e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
c3f0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
c400: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c410: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c420: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
c430: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
c440: 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
c450: 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
c460: 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  open = 0;.      
c470: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
c480: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  Size = 0;.      
c490: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  }.    }..    if(
c4a0: 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61 67 65   !MEMDB || pPage
c4b0: 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49  r->errCode==SQLI
c4c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
c4d0: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
c4e0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20  AGER_UNLOCK;.   
c4f0: 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61 6e 67     pPager->chang
c500: 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a  eCountDone = 0;.
c510: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
c520: 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c  ** Execute a rol
c530: 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73  lback if a trans
c540: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
c550: 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20   and unlock the 
c560: 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c  .** database fil
c570: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
c580: 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65  has already ente
c590: 72 65 64 20 74 68 65 20 65 72 72 6f 72 20 73 74  red the error st
c5a0: 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20  ate, .** do not 
c5b0: 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f 6c 6c  attempt the roll
c5c0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
c5d0: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
c5e0: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
c5f0: 72 20 2a 70 29 7b 0a 20 20 2f 2a 20 61 73 73 65  r *p){.  /* asse
c600: 72 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41  rt( p->state>=PA
c610: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
c620: 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  p->journalOpen==
c630: 30 20 29 3b 20 2a 2f 0a 20 20 69 66 28 20 70 2d  0 ); */.  if( p-
c640: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
c650: 5f 4f 4b 20 26 26 20 70 2d 3e 73 74 61 74 65 3e  _OK && p->state>
c660: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
c670: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 46 61  ){.    sqlite3Fa
c680: 75 6c 74 42 65 67 69 6e 42 65 6e 69 67 6e 28 2d  ultBeginBenign(-
c690: 31 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50  1);.    sqlite3P
c6a0: 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 70 29 3b  agerRollback(p);
c6b0: 0a 20 20 20 20 73 71 6c 69 74 65 33 46 61 75 6c  .    sqlite3Faul
c6c0: 74 45 6e 64 42 65 6e 69 67 6e 28 2d 31 29 3b 0a  tEndBenign(-1);.
c6d0: 20 20 7d 0a 20 20 70 61 67 65 72 5f 75 6e 6c 6f    }.  pager_unlo
c6e0: 63 6b 28 70 29 3b 0a 23 69 66 20 30 0a 20 20 61  ck(p);.#if 0.  a
c6f0: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
c700: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
c710: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
c720: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
c730: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
c740: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
c750: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
c760: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
c770: 76 65 4d 6f 64 65 20 29 3b 0a 23 65 6e 64 69 66  veMode );.#endif
c780: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
c790: 6f 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72  outine ends a tr
c7a0: 61 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72  ansaction.  A tr
c7b0: 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64  ansaction is end
c7c0: 65 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20  ed by either.** 
c7d0: 61 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f  a COMMIT or a RO
c7e0: 4c 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68  LLBACK..**.** Wh
c7f0: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
c800: 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
c810: 61 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75  ager has the jou
c820: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61  rnal file open a
c830: 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44  nd.** a RESERVED
c840: 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
c850: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
c860: 73 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  se.  This routin
c870: 65 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a  e will release.*
c880: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
c890: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
c8a0: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
c8b0: 6e 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74  n its place if t
c8c0: 68 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70  hat is.** the ap
c8d0: 70 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20  propriate thing 
c8e0: 74 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20  to do.  Release 
c8f0: 6c 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73  locks usually is
c900: 20 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a   appropriate,.**
c910: 20 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69   unless we are i
c920: 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65  n exclusive acce
c930: 73 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73  ss mode or unles
c940: 73 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20  s this is a .** 
c950: 43 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e  COMMIT AND BEGIN
c960: 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44   or ROLLBACK AND
c970: 20 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e   BEGIN operation
c980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72  ..**.** The jour
c990: 6e 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68  nal file is eith
c9a0: 65 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72  er deleted or tr
c9b0: 75 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  uncated..**.** T
c9c0: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
c9d0: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
c9e0: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
c9f0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
ca00: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
ca10: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
ca20: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
ca30: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
ca40: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
ca50: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
ca60: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
ca70: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
ca80: 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74  ger_end_transact
ca90: 69 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  ion(Pager *pPage
caa0: 72 2c 20 69 6e 74 20 68 61 73 4d 61 73 74 65 72  r, int hasMaster
cab0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
cac0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cad0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
cae0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
caf0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
cb00: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
cb10: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
cb20: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
cb30: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
cb40: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
cb50: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
cb60: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
cb70: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
cb80: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
cb90: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
cba0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
cbb0: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
cbc0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
cbd0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
cbe0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
cbf0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
cc00: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
cc10: 64 65 20 0a 20 20 20 20 20 7c 7c 20 70 50 61 67  de .     || pPag
cc20: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
cc30: 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
cc40: 44 45 5f 50 45 52 53 49 53 54 0a 20 20 20 20 29  DE_PERSIST.    )
cc50: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 7a 65 72  {.      rc = zer
cc60: 6f 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  oJournalHdr(pPag
cc70: 65 72 2c 20 68 61 73 4d 61 73 74 65 72 29 3b 0a  er, hasMaster);.
cc80: 20 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f        pager_erro
cc90: 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
cca0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
ccb0: 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20  rnalOff = 0;.   
ccc0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
ccd0: 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
cce0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
ccf0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
cd00: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
cd10: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
cd20: 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  alOpen = 0;.    
cd30: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
cd40: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
cd50: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 6c  c = sqlite3OsDel
cd60: 65 74 65 28 70 50 61 67 65 72 2d 3e 70 56 66 73  ete(pPager->pVfs
cd70: 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  , pPager->zJourn
cd80: 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  al, 0);.      }.
cd90: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
cda0: 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
cdb0: 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
cdc0: 6c 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  l);.    pPager->
cdd0: 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  pInJournal = 0;.
cde0: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
cdf0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
ce00: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
ce10: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
ce20: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
ce30: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
ce40: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
ce50: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20  edSync = 0;.    
ce60: 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
ce70: 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69 66 64 65  lback = 0;.#ifde
ce80: 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
ce90: 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d 3e  AGES.      pPg->
cea0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
ceb0: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
cec0: 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 20  #endif.    }.   
ced0: 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20   pPager->pDirty 
cee0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
cef0: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
cf00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
cf10: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
cf20: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
cf30: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d  er->pInJournal==
cf40: 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  0 );.  }..  if( 
cf50: 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  !pPager->exclusi
cf60: 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72 63  veMode ){.    rc
cf70: 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70 50 61  2 = osUnlock(pPa
cf80: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
cf90: 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61 67 65  LOCK);.    pPage
cfa0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
cfb0: 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c 73 65  _SHARED;.  }else
cfc0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
cfd0: 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te==PAGER_SYNCED
cfe0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
cff0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58  state = PAGER_EX
d000: 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20 20 70  CLUSIVE;.  }.  p
d010: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
d020: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
d030: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
d040: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
d050: 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c 69 73  nc = 0;.  lruLis
d060: 74 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28  tSetFirstSynced(
d070: 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65  pPager);.  pPage
d080: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
d090: 20 20 70 50 61 67 65 72 2d 3e 64 62 4d 6f 64 69    pPager->dbModi
d0a0: 66 69 65 64 20 3d 20 30 3b 0a 0a 20 20 72 65 74  fied = 0;..  ret
d0b0: 75 72 6e 20 28 72 63 3d 3d 53 51 4c 49 54 45 5f  urn (rc==SQLITE_
d0c0: 4f 4b 3f 72 63 32 3a 72 63 29 3b 0a 7d 0a 0a 2f  OK?rc2:rc);.}../
d0d0: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64  *.** Compute and
d0e0: 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b 73   return a checks
d0f0: 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  um for the page 
d100: 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54  of data..**.** T
d110: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65 61  his is not a rea
d120: 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74 20  l checksum.  It 
d130: 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20 74  is really just t
d140: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a  he sum of the .*
d150: 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c  * random initial
d160: 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20 70   value and the p
d170: 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65 20  age number.  We 
d180: 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69 74  experimented wit
d190: 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d 20  h.** a checksum 
d1a0: 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64 61  of the entire da
d1b0: 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61 73  ta, but that was
d1c0: 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f   found to be too
d1d0: 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74   slow..**.** Not
d1e0: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  e that the page 
d1f0: 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65 64  number is stored
d200: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
d210: 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a  g of data and.**
d220: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69 73   the checksum is
d230: 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65   stored at the e
d240: 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d 70  nd.  This is imp
d250: 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72  ortant.  If jour
d260: 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f  nal.** corruptio
d270: 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f 20  n occurs due to 
d280: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
d290: 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79   the most likely
d2a0: 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20   scenario.** is 
d2b0: 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20  that one end or 
d2c0: 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68 65  the other of the
d2d0: 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 20   record will be 
d2e0: 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73 0a  changed.  It is.
d2f0: 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b  ** much less lik
d300: 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77 6f  ely that the two
d310: 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f 75   ends of the jou
d320: 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c  rnal record will
d330: 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61   be.** correct a
d340: 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62 65  nd the middle be
d350: 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73 2c   corrupt.  Thus,
d360: 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d 22   this "checksum"
d370: 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75   scheme,.** thou
d380: 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d 70  gh fast and simp
d390: 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65 20  le, catches the 
d3a0: 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69  mostly likely ki
d3b0: 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e  nd of corruption
d3c0: 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20  ..**.** FIX ME: 
d3d0: 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e 67   Consider adding
d3e0: 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f 72   every 200th (or
d3f0: 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68 65   so) byte of the
d400: 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20   data to the.** 
d410: 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74 20  checksum.  That 
d420: 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65 20  way if a single 
d430: 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72 20  page spans 3 or 
d440: 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f 72  more disk sector
d450: 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68  s and.** only th
d460: 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72 20  e middle sector 
d470: 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20 77  is corrupt, we w
d480: 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20 61  ill still have a
d490: 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63   reasonable.** c
d4a0: 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e 67  hance of failing
d4b0: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61 6e   the checksum an
d4c0: 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e 67  d thus detecting
d4d0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f   the problem..*/
d4e0: 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65  .static u32 page
d4f0: 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a 70  r_cksum(Pager *p
d500: 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 75 38 20  Pager, const u8 
d510: 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63  *aData){.  u32 c
d520: 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
d530: 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20  ksumInit;.  int 
d540: 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65  i = pPager->page
d550: 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c  Size-200;.  whil
d560: 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b  e( i>0 ){.    ck
d570: 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b  sum += aData[i];
d580: 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20  .    i -= 200;. 
d590: 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75   }.  return cksu
d5a0: 6d 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  m;.}../* Forward
d5b0: 20 64 65 63 6c 61 72 61 74 69 6f 6e 20 2a 2f 0a   declaration */.
d5c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
d5d0: 43 6c 65 61 6e 28 50 67 48 64 72 2a 29 3b 0a 0a  Clean(PgHdr*);..
d5e0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
d5f0: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
d600: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
d610: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
d620: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
d630: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
d640: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
d650: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
d660: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
d670: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
d680: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
d690: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
d6a0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
d6b0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
d6c0: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
d6d0: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
d6e0: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
d6f0: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
d700: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
d710: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
d720: 6f 6e 65 5f 70 61 67 65 28 0a 20 20 50 61 67 65  one_page(.  Page
d730: 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20 73 71  r *pPager, .  sq
d740: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 6a 66 64 2c  lite3_file *jfd,
d750: 0a 20 20 69 36 34 20 6f 66 66 73 65 74 2c 0a 20  .  i64 offset,. 
d760: 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 0a 29 7b   int useCksum.){
d770: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
d780: 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20  dr *pPg;        
d790: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
d7a0: 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20 69   existing page i
d7b0: 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  n the cache */. 
d7c0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
d7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d7e0: 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65  * The page numbe
d7f0: 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a  r of a page in j
d800: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20  ournal */.  u32 
d810: 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20  cksum;          
d820: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
d830: 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73  cksum used for s
d840: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a  anity checking *
d850: 2f 0a 20 20 75 38 20 2a 61 44 61 74 61 20 3d 20  /.  u8 *aData = 
d860: 28 75 38 20 2a 29 70 50 61 67 65 72 2d 3e 70 54  (u8 *)pPager->pT
d870: 6d 70 53 70 61 63 65 3b 20 20 20 2f 2a 20 54 65  mpSpace;   /* Te
d880: 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20 61  mp storage for a
d890: 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20 75   page */..  /* u
d8a0: 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20 62  seCksum should b
d8b0: 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20 6d  e true for the m
d8c0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ain journal and 
d8d0: 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20 73  false for.  ** s
d8e0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
d8f0: 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  s.  Verify that 
d900: 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20 74  this is always t
d910: 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20 61  he case.  */.  a
d920: 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28 75  ssert( jfd == (u
d930: 73 65 43 6b 73 75 6d 20 3f 20 70 50 61 67 65 72  seCksum ? pPager
d940: 2d 3e 6a 66 64 20 3a 20 70 50 61 67 65 72 2d 3e  ->jfd : pPager->
d950: 73 74 66 64 29 20 29 3b 0a 20 20 61 73 73 65 72  stfd) );.  asser
d960: 74 28 20 61 44 61 74 61 20 29 3b 0a 0a 20 20 72  t( aData );..  r
d970: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
d980: 66 64 2c 20 6f 66 66 73 65 74 2c 20 26 70 67 6e  fd, offset, &pgn
d990: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
d9a0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
d9b0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
d9c0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 61  te3OsRead(jfd, a
d9d0: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
d9e0: 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
d9f0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
da00: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
da10: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
da20: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
da30: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
da40: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
da50: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
da60: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
da70: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
da80: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
da90: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
daa0: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
dab0: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
dac0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
dad0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
dae0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
daf0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
db00: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
db10: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
db20: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
db30: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
db40: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
db50: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
db60: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
db70: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
db80: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
db90: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
dba0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
dbb0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
dbc0: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
dbd0: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
dbe0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
dbf0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
dc00: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
dc10: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
dc20: 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73 65  2bits(jfd, offse
dc30: 74 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  t+pPager->pageSi
dc40: 7a 65 2b 34 2c 20 26 63 6b 73 75 6d 29 3b 0a 20  ze+4, &cksum);. 
dc50: 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
dc60: 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
dc70: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
dc80: 20 34 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65   4;.    if( page
dc90: 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20  r_cksum(pPager, 
dca0: 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b  aData)!=cksum ){
dcb0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
dcc0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d  LITE_DONE;.    }
dcd0: 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
dce0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
dcf0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c  AGER_RESERVED ||
dd00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
dd10: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
dd20: 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
dd30: 70 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45  pager is in RESE
dd40: 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e  RVED state, then
dd50: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
dd60: 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20   copy of this.  
dd70: 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70  ** page in the p
dd80: 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74  ager cache. In t
dd90: 68 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70  his case just up
dda0: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
ddb0: 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74  ache,.  ** not t
ddc0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ddd0: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65  . The page is le
dde0: 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20  ft marked dirty 
ddf0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20  in this case..  
de00: 2a 2a 0a 20 20 2a 2a 20 41 6e 20 65 78 63 65 70  **.  ** An excep
de10: 74 69 6f 6e 20 74 6f 20 74 68 65 20 61 62 6f 76  tion to the abov
de20: 65 20 72 75 6c 65 3a 20 49 66 20 74 68 65 20 64  e rule: If the d
de30: 61 74 61 62 61 73 65 20 69 73 20 69 6e 20 6e 6f  atabase is in no
de40: 2d 73 79 6e 63 20 6d 6f 64 65 0a 20 20 2a 2a 20  -sync mode.  ** 
de50: 61 6e 64 20 61 20 70 61 67 65 20 69 73 20 6d 6f  and a page is mo
de60: 76 65 64 20 64 75 72 69 6e 67 20 61 6e 20 69 6e  ved during an in
de70: 63 72 65 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d  cremental vacuum
de80: 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20 6d   then the page m
de90: 61 79 0a 20 20 2a 2a 20 6e 6f 74 20 62 65 20 69  ay.  ** not be i
dea0: 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  n the pager cach
deb0: 65 2e 20 4c 61 74 65 72 3a 20 69 66 20 61 20 6d  e. Later: if a m
dec0: 61 6c 6c 6f 63 28 29 20 6f 72 20 49 4f 20 65 72  alloc() or IO er
ded0: 72 6f 72 20 6f 63 63 75 72 73 0a 20 20 2a 2a 20  ror occurs.  ** 
dee0: 64 75 72 69 6e 67 20 61 20 4d 6f 76 65 70 61 67  during a Movepag
def0: 65 28 29 20 63 61 6c 6c 2c 20 74 68 65 6e 20 74  e() call, then t
df00: 68 65 20 70 61 67 65 20 6d 61 79 20 6e 6f 74 20  he page may not 
df10: 62 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 0a  be in the cache.
df20: 20 20 2a 2a 20 65 69 74 68 65 72 2e 20 53 6f 20    ** either. So 
df30: 74 68 65 20 63 6f 6e 64 69 74 69 6f 6e 20 64 65  the condition de
df40: 73 63 72 69 62 65 64 20 69 6e 20 74 68 65 20 61  scribed in the a
df50: 62 6f 76 65 20 70 61 72 61 67 72 61 70 68 20 69  bove paragraph i
df60: 73 20 6e 6f 74 0a 20 20 2a 2a 20 61 73 73 65 72  s not.  ** asser
df70: 74 28 29 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t()able..  **.  
df80: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
df90: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
dfa0: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
dfb0: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
dfc0: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
dfd0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
dfe0: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
dff0: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
e000: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
e010: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
e020: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
e030: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
e040: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
e050: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
e060: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
e070: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
e080: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
e090: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
e0a0: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
e0b0: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
e0c0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
e0d0: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
e0e0: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
e0f0: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
e100: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
e110: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
e120: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
e130: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
e140: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
e150: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
e160: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
e170: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
e180: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
e190: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
e1a0: 20 61 72 65 20 73 79 6e 63 65 64 20 69 6e 74 6f   are synced into
e1b0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
e1c0: 63 6b 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e  ck.  ** journal.
e1d0: 20 20 4f 74 68 65 72 77 69 73 65 2c 20 61 20 70    Otherwise, a p
e1e0: 6f 77 65 72 20 6c 6f 73 73 20 6d 69 67 68 74 20  ower loss might 
e1f0: 6c 65 61 76 65 20 6d 6f 64 69 66 69 65 64 20 64  leave modified d
e200: 61 74 61 20 69 6e 20 74 68 65 0a 20 20 2a 2a 20  ata in the.  ** 
e210: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 69  database file wi
e220: 74 68 6f 75 74 20 61 6e 20 65 6e 74 72 79 20 69  thout an entry i
e230: 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
e240: 6f 75 72 6e 61 6c 20 74 68 61 74 20 63 61 6e 0a  ournal that can.
e250: 20 20 2a 2a 20 72 65 73 74 6f 72 65 20 74 68 65    ** restore the
e260: 20 64 61 74 61 62 61 73 65 20 74 6f 20 69 74 73   database to its
e270: 20 6f 72 69 67 69 6e 61 6c 20 66 6f 72 6d 2e 20   original form. 
e280: 20 54 77 6f 20 63 6f 6e 64 69 74 69 6f 6e 73 20   Two conditions 
e290: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6d 65 74  must be.  ** met
e2a0: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 20   before writing 
e2b0: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
e2c0: 66 69 6c 65 73 2e 20 28 31 29 20 74 68 65 20 64  files. (1) the d
e2d0: 61 74 61 62 61 73 65 20 6d 75 73 74 20 62 65 0a  atabase must be.
e2e0: 20 20 2a 2a 20 6c 6f 63 6b 65 64 2e 20 20 28 32    ** locked.  (2
e2f0: 29 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  ) we know that t
e300: 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65  he original page
e310: 20 63 6f 6e 74 65 6e 74 20 69 73 20 66 75 6c 6c   content is full
e320: 79 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20 69 6e  y synced.  ** in
e330: 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72 6e 61   the main journa
e340: 6c 20 65 69 74 68 65 72 20 62 65 63 61 75 73 65  l either because
e350: 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
e360: 20 69 6e 20 63 61 63 68 65 20 6f 72 20 65 6c 73   in cache or els
e370: 65 0a 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20  e.  ** the page 
e380: 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e 65 65  is marked as nee
e390: 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2a 0a 20  dSync==0..  **. 
e3a0: 20 2a 2a 20 32 30 30 38 2d 30 34 2d 31 34 3a 20   ** 2008-04-14: 
e3b0: 20 57 68 65 6e 20 61 74 74 65 6d 70 74 69 6e 67   When attempting
e3c0: 20 74 6f 20 76 61 63 75 75 6d 20 61 20 63 6f 72   to vacuum a cor
e3d0: 72 75 70 74 20 64 61 74 61 62 61 73 65 20 66 69  rupt database fi
e3e0: 6c 65 2c 20 69 74 0a 20 20 2a 2a 20 69 73 20 70  le, it.  ** is p
e3f0: 6f 73 73 69 62 6c 65 20 74 6f 20 66 61 69 6c 20  ossible to fail 
e400: 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 6e 20 61  a statement on a
e410: 20 64 61 74 61 62 61 73 65 20 74 68 61 74 20 64   database that d
e420: 6f 65 73 20 6e 6f 74 20 79 65 74 20 65 78 69 73  oes not yet exis
e430: 74 2e 0a 20 20 2a 2a 20 44 6f 20 6e 6f 74 20 61  t..  ** Do not a
e440: 74 74 65 6d 70 74 20 74 6f 20 77 72 69 74 65 20  ttempt to write 
e450: 69 66 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  if database file
e460: 20 68 61 73 20 6e 65 76 65 72 20 62 65 65 6e 20   has never been 
e470: 6f 70 65 6e 65 64 2e 0a 20 20 2a 2f 0a 20 20 70  opened..  */.  p
e480: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
e490: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
e4a0: 0a 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22  .  PAGERTRACE4("
e4b0: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
e4c0: 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
e4d0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
e4e0: 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
e4f0: 29 2c 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64  ), pgno, pager_d
e500: 61 74 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e  atahash(pPager->
e510: 70 61 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29  pageSize, aData)
e520: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e530: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
e540: 43 4c 55 53 49 56 45 20 26 26 20 28 70 50 67 3d  CLUSIVE && (pPg=
e550: 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53  =0 || pPg->needS
e560: 79 6e 63 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  ync==0).        
e570: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
e580: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
e590: 36 34 20 6f 66 66 73 65 74 20 3d 20 28 70 67 6e  64 offset = (pgn
e5a0: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
e5b0: 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  ->pageSize;.    
e5c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
e5d0: 69 74 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ite(pPager->fd, 
e5e0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
e5f0: 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 29  ageSize, offset)
e600: 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29 7b  ;.    if( pPg ){
e610: 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
e620: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
e630: 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20 20  .  if( pPg ){.  
e640: 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f    /* No page sho
e650: 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70 6c  uld ever be expl
e660: 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61  icitly rolled ba
e670: 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75 73  ck that is in us
e680: 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a 2a  e, except.    **
e690: 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69 63   for page 1 whic
e6a0: 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73 65  h is held in use
e6b0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65 65   in order to kee
e6c0: 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68  p the lock on th
e6d0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
e6e0: 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76 65  e active. Howeve
e6f0: 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d 61  r such a page ma
e700: 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  y be rolled back
e710: 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20 20   as a result.   
e720: 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e   ** of an intern
e730: 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74 69  al error resulti
e740: 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74  ng in an automat
e750: 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a  ic call to.    *
e760: 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f  * sqlite3PagerRo
e770: 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f  llback()..    */
e780: 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61  .    void *pData
e790: 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28  ;.    /* assert(
e7a0: 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c   pPg->nRef==0 ||
e7b0: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b   pPg->pgno==1 );
e7c0: 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20   */.    pData = 
e7d0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
e7e0: 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  g);.    memcpy(p
e7f0: 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61  Data, aData, pPa
e800: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
e810: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
e820: 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20  xReiniter ){.   
e830: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
e840: 69 74 65 72 28 70 50 67 2c 20 70 50 61 67 65 72  iter(pPg, pPager
e850: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
e860: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
e870: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
e880: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
e890: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
e8a0: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
e8b0: 20 2f 2a 20 49 66 20 74 68 69 73 20 77 61 73 20   /* If this was 
e8c0: 70 61 67 65 20 31 2c 20 74 68 65 6e 20 72 65 73  page 1, then res
e8d0: 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 6f  tore the value o
e8e0: 66 20 50 61 67 65 72 2e 64 62 46 69 6c 65 56 65  f Pager.dbFileVe
e8f0: 72 73 2e 0a 20 20 20 20 2a 2a 20 44 6f 20 74 68  rs..    ** Do th
e900: 69 73 20 62 65 66 6f 72 65 20 61 6e 79 20 64 65  is before any de
e910: 63 6f 64 69 6e 67 2e 20 2a 2f 0a 20 20 20 20 69  coding. */.    i
e920: 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  f( pgno==1 ){.  
e930: 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
e940: 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
e950: 26 28 28 75 38 2a 29 70 44 61 74 61 29 5b 32 34  &((u8*)pData)[24
e960: 5d 2c 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  ],sizeof(pPager-
e970: 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a 20  >dbFileVers));. 
e980: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 44 65 63     }..    /* Dec
e990: 6f 64 65 20 74 68 65 20 70 61 67 65 20 6a 75 73  ode the page jus
e9a0: 74 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  t read from disk
e9b0: 20 2a 2f 0a 20 20 20 20 43 4f 44 45 43 31 28 70   */.    CODEC1(p
e9c0: 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
e9d0: 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 7d  g->pgno, 3);.  }
e9e0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e9f0: 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72  ./*.** Parameter
ea00: 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65 20   zMaster is the 
ea10: 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65 72  name of a master
ea20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 41   journal file. A
ea30: 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c 0a   single journal.
ea40: 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65 66  ** file that ref
ea50: 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61 73  erred to the mas
ea60: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ea70: 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20 72   has just been r
ea80: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20 54  olled back..** T
ea90: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63  his routine chec
eaa0: 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ks if it is poss
eab0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
eac0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
ead0: 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20 64  l file,.** and d
eae0: 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73 2e  oes so if it is.
eaf0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
eb00: 7a 4d 61 73 74 65 72 20 6d 61 79 20 70 6f 69 6e  zMaster may poin
eb10: 74 20 74 6f 20 50 61 67 65 72 2e 70 54 6d 70 53  t to Pager.pTmpS
eb20: 70 61 63 65 2e 20 53 6f 20 74 68 61 74 20 62 75  pace. So that bu
eb30: 66 66 65 72 20 69 73 20 6e 6f 74 20 0a 2a 2a 20  ffer is not .** 
eb40: 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 75 73  available for us
eb50: 65 20 77 69 74 68 69 6e 20 74 68 69 73 20 66 75  e within this fu
eb60: 6e 63 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a  nction..**.**.**
eb70: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
eb80: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
eb90: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
eba0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
ebb0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
ebc0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
ebd0: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
ebe0: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
ebf0: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
ec00: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
ec10: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
ec20: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
ec30: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
ec40: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
ec50: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
ec60: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
ec70: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
ec80: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
ec90: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
eca0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ecb0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
ecc0: 74 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  ter){.  sqlite3_
ecd0: 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67  vfs *pVfs = pPag
ece0: 65 72 2d 3e 70 56 66 73 3b 0a 20 20 69 6e 74 20  er->pVfs;.  int 
ecf0: 72 63 3b 0a 20 20 69 6e 74 20 6d 61 73 74 65 72  rc;.  int master
ed00: 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 73 71 6c  _open = 0;.  sql
ed10: 69 74 65 33 5f 66 69 6c 65 20 2a 70 4d 61 73 74  ite3_file *pMast
ed20: 65 72 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er;.  sqlite3_fi
ed30: 6c 65 20 2a 70 4a 6f 75 72 6e 61 6c 3b 0a 20 20  le *pJournal;.  
ed40: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
ed50: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
ed60: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
ed70: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
ed80: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
ed90: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
eda0: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
edb0: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
edc0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
edd0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
ede0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
edf0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
ee00: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
ee10: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
ee20: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
ee30: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
ee40: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
ee50: 2e 0a 20 20 2a 2f 0a 20 20 70 4d 61 73 74 65 72  ..  */.  pMaster
ee60: 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65   = (sqlite3_file
ee70: 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   *)sqlite3_mallo
ee80: 63 28 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  c(pVfs->szOsFile
ee90: 20 2a 20 32 29 3b 0a 20 20 70 4a 6f 75 72 6e 61   * 2);.  pJourna
eea0: 6c 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c  l = (sqlite3_fil
eeb0: 65 20 2a 29 28 28 28 75 38 20 2a 29 70 4d 61 73  e *)(((u8 *)pMas
eec0: 74 65 72 29 20 2b 20 70 56 66 73 2d 3e 73 7a 4f  ter) + pVfs->szO
eed0: 73 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21 70  sFile);.  if( !p
eee0: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72 63  Master ){.    rc
eef0: 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
ef00: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
ef10: 74 20 66 6c 61 67 73 20 3d 20 28 53 51 4c 49 54  t flags = (SQLIT
ef20: 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c  E_OPEN_READONLY|
ef30: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 53 54  SQLITE_OPEN_MAST
ef40: 45 52 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20  ER_JOURNAL);.   
ef50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
ef60: 70 65 6e 28 70 56 66 73 2c 20 7a 4d 61 73 74 65  pen(pVfs, zMaste
ef70: 72 2c 20 70 4d 61 73 74 65 72 2c 20 66 6c 61 67  r, pMaster, flag
ef80: 73 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28  s, 0);.  }.  if(
ef90: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
efa0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
efb0: 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70  out;.  master_op
efc0: 65 6e 20 3d 20 31 3b 0a 0a 20 20 72 63 20 3d 20  en = 1;..  rc = 
efd0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
efe0: 65 28 70 4d 61 73 74 65 72 2c 20 26 6e 4d 61 73  e(pMaster, &nMas
eff0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69  terJournal);.  i
f000: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f010: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
f020: 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d  r_out;..  if( nM
f030: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29  asterJournal>0 )
f040: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75  {.    char *zJou
f050: 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a  rnal;.    char *
f060: 7a 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a  zMasterPtr = 0;.
f070: 20 20 20 20 69 6e 74 20 6e 4d 61 73 74 65 72 50      int nMasterP
f080: 74 72 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  tr = pPager->pVf
f090: 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 3b  s->mxPathname+1;
f0a0: 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68  ..    /* Load th
f0b0: 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20  e entire master 
f0c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74  journal file int
f0d0: 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64  o space obtained
f0e0: 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c   from.    ** sql
f0f0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 29 20 61 6e  ite3_malloc() an
f100: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
f110: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
f120: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
f130: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
f140: 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
f150: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
f160: 61 6c 20 2b 20 6e 4d 61 73 74 65 72 50 74 72 29  al + nMasterPtr)
f170: 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73 74  ;.    if( !zMast
f180: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
f190: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
f1a0: 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f  OMEM;.      goto
f1b0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
f1c0: 20 20 20 20 7d 0a 20 20 20 20 7a 4d 61 73 74 65      }.    zMaste
f1d0: 72 50 74 72 20 3d 20 26 7a 4d 61 73 74 65 72 4a  rPtr = &zMasterJ
f1e0: 6f 75 72 6e 61 6c 5b 6e 4d 61 73 74 65 72 4a 6f  ournal[nMasterJo
f1f0: 75 72 6e 61 6c 5d 3b 0a 20 20 20 20 72 63 20 3d  urnal];.    rc =
f200: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70   sqlite3OsRead(p
f210: 4d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a  Master, zMasterJ
f220: 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a  ournal, nMasterJ
f230: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
f240: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
f250: 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74  K ) goto delmast
f260: 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f  er_out;..    zJo
f270: 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a  urnal = zMasterJ
f280: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c  ournal;.    whil
f290: 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61  e( (zJournal-zMa
f2a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61  sterJournal)<nMa
f2b0: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
f2c0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
f2d0: 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 20  3OsAccess(pVfs, 
f2e0: 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49 54 45  zJournal, SQLITE
f2f0: 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 3b  _ACCESS_EXISTS);
f300: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
f310: 20 26 26 20 72 63 21 3d 31 20 29 7b 0a 20 20 20   && rc!=1 ){.   
f320: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
f330: 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20  _IOERR_NOMEM;.  
f340: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
f350: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20  ster_out;.      
f360: 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
f370: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  1 ){.        /* 
f380: 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  One of the journ
f390: 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  als pointed to b
f3a0: 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  y the master jou
f3b0: 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20 20  rnal exists..   
f3c0: 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74 20       ** Open it 
f3d0: 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74 20  and check if it 
f3e0: 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d 61  points at the ma
f3f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66  ster journal. If
f400: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c 20  .        ** so, 
f410: 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20 64  return without d
f420: 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73 74  eleting the mast
f430: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  er journal file.
f440: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f450: 20 20 20 20 69 6e 74 20 63 3b 0a 20 20 20 20 20      int c;.     
f460: 20 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28     int flags = (
f470: 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
f480: 4f 4e 4c 59 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  ONLY|SQLITE_OPEN
f490: 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a  _MAIN_JOURNAL);.
f4a0: 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
f4b0: 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c  ite3OsOpen(pVfs,
f4c0: 20 7a 4a 6f 75 72 6e 61 6c 2c 20 70 4a 6f 75 72   zJournal, pJour
f4d0: 6e 61 6c 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  nal, flags, 0);.
f4e0: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
f4f0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
f500: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
f510: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
f520: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63     }..        rc
f530: 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
f540: 72 6e 61 6c 28 70 4a 6f 75 72 6e 61 6c 2c 20 7a  rnal(pJournal, z
f550: 4d 61 73 74 65 72 50 74 72 2c 20 6e 4d 61 73 74  MasterPtr, nMast
f560: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
f570: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
f580: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  Journal);.      
f590: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
f5a0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
f5b0: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
f5c0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
f5d0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
f5e0: 74 65 72 50 74 72 5b 30 5d 21 3d 30 20 26 26 20  terPtr[0]!=0 && 
f5f0: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
f600: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
f610: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
f620: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
f630: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
f640: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
f650: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
f660: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
f670: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
f680: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
f690: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
f6a0: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
f6b0: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
f6c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
f6d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  rc = sqlite3OsDe
f6e0: 6c 65 74 65 28 70 56 66 73 2c 20 7a 4d 61 73 74  lete(pVfs, zMast
f6f0: 65 72 2c 20 30 29 3b 0a 0a 64 65 6c 6d 61 73 74  er, 0);..delmast
f700: 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d  er_out:.  if( zM
f710: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
f720: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
f730: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
f740: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
f750: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
f760: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
f770: 70 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  pMaster);.  }.  
f780: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 4d 61  sqlite3_free(pMa
f790: 73 74 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ster);.  return 
f7a0: 72 63 3b 0a 7d 0a 0a 0a 73 74 61 74 69 63 20 76  rc;.}...static v
f7b0: 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63 61  oid pager_trunca
f7c0: 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  te_cache(Pager *
f7d0: 70 50 61 67 65 72 29 3b 0a 0a 2f 2a 0a 2a 2a 20  pPager);../*.** 
f7e0: 54 72 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69  Truncate the mai
f7f0: 6e 20 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69  n file of the gi
f800: 76 65 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65  ven pager to the
f810: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
f820: 0a 2a 2a 20 69 6e 64 69 63 61 74 65 64 2e 20 41  .** indicated. A
f830: 6c 73 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65  lso truncate the
f840: 20 63 61 63 68 65 64 20 72 65 70 72 65 73 65 6e   cached represen
f850: 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  tation of the fi
f860: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4d 69 67 68 74 20  le..**.** Might 
f870: 6d 69 67 68 74 20 62 65 20 74 68 65 20 63 61 73  might be the cas
f880: 65 20 74 68 61 74 20 74 68 65 20 66 69 6c 65 20  e that the file 
f890: 6f 6e 20 64 69 73 6b 20 69 73 20 73 6d 61 6c 6c  on disk is small
f8a0: 65 72 20 74 68 61 6e 20 6e 50 61 67 65 2e 0a 2a  er than nPage..*
f8b0: 2a 20 54 68 69 73 20 63 61 6e 20 68 61 70 70 65  * This can happe
f8c0: 6e 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20  n, for example, 
f8d0: 69 66 20 77 65 20 61 72 65 20 69 6e 20 74 68 65  if we are in the
f8e0: 20 6d 69 64 64 6c 65 20 6f 66 20 61 20 74 72 61   middle of a tra
f8f0: 6e 73 61 63 74 69 6f 6e 0a 2a 2a 20 77 68 69 63  nsaction.** whic
f900: 68 20 68 61 73 20 65 78 74 65 6e 64 65 64 20 74  h has extended t
f910: 68 65 20 66 69 6c 65 20 73 69 7a 65 20 61 6e 64  he file size and
f920: 20 74 68 65 20 6e 65 77 20 70 61 67 65 73 20 61   the new pages a
f930: 72 65 20 73 74 69 6c 6c 20 61 6c 6c 20 68 65 6c  re still all hel
f940: 64 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2c 20 74  d.** in cache, t
f950: 68 65 6e 20 61 6e 20 49 4e 53 45 52 54 20 6f 72  hen an INSERT or
f960: 20 55 50 44 41 54 45 20 64 6f 65 73 20 61 20 73   UPDATE does a s
f970: 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
f980: 6b 2e 20 20 53 6f 6d 65 0a 2a 2a 20 6f 70 65 72  k.  Some.** oper
f990: 61 74 69 6e 67 20 73 79 73 74 65 6d 20 69 6d 70  ating system imp
f9a0: 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 20 63 61 6e  lementations can
f9b0: 20 67 65 74 20 63 6f 6e 66 75 73 65 64 20 69 66   get confused if
f9c0: 20 79 6f 75 20 74 72 79 20 74 6f 0a 2a 2a 20 74   you try to.** t
f9d0: 72 75 6e 63 61 74 65 20 61 20 66 69 6c 65 20 74  runcate a file t
f9e0: 6f 20 73 6f 6d 65 20 73 69 7a 65 20 74 68 61 74  o some size that
f9f0: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
fa00: 69 74 20 63 75 72 72 65 6e 74 6c 79 20 69 73 2c  it currently is,
fa10: 0a 2a 2a 20 73 6f 20 64 65 74 65 63 74 20 74 68  .** so detect th
fa20: 69 73 20 63 61 73 65 20 61 6e 64 20 77 72 69 74  is case and writ
fa30: 65 20 61 20 73 69 6e 67 6c 65 20 7a 65 72 6f 20  e a single zero 
fa40: 62 79 74 65 20 74 6f 20 74 68 65 20 65 6e 64 20  byte to the end 
fa50: 6f 66 20 74 68 65 20 6e 65 77 0a 2a 2a 20 66 69  of the new.** fi
fa60: 6c 65 20 69 6e 73 74 65 61 64 2e 0a 2a 2f 0a 73  le instead..*/.s
fa70: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
fa80: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
fa90: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
faa0: 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  e){.  int rc = S
fab0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
fac0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
fad0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
fae0: 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  & pPager->fd->pM
faf0: 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69 36  ethods ){.    i6
fb00: 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20 6e  4 currentSize, n
fb10: 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d  ewSize;.    rc =
fb20: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
fb30: 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  ze(pPager->fd, &
fb40: 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20 20  currentSize);.  
fb50: 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61 67    newSize = pPag
fb60: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
fb70: 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66 28  4)nPage;.    if(
fb80: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
fb90: 26 20 63 75 72 72 65 6e 74 53 69 7a 65 21 3d 6e  & currentSize!=n
fba0: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
fbb0: 69 66 28 20 63 75 72 72 65 6e 74 53 69 7a 65 3e  if( currentSize>
fbc0: 6e 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  newSize ){.     
fbd0: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
fbe0: 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  sTruncate(pPager
fbf0: 2d 3e 66 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a  ->fd, newSize);.
fc00: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
fc10: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
fc20: 33 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d  3OsWrite(pPager-
fc30: 3e 66 64 2c 20 22 22 2c 20 31 2c 20 6e 65 77 53  >fd, "", 1, newS
fc40: 69 7a 65 2d 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ize-1);.      }.
fc50: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20      }.  }.  if( 
fc60: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fc70: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
fc80: 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20  ize = nPage;.   
fc90: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f   pager_truncate_
fca0: 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
fcb0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
fcc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
fcd0: 20 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20   sectorSize for 
fce0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e  the given pager.
fcf0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f  .**.** The secto
fd00: 72 20 73 69 7a 65 20 69 73 20 61 74 20 6c 65 61  r size is at lea
fd10: 73 74 20 61 73 20 62 69 67 20 61 73 20 74 68 65  st as big as the
fd20: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 72 65 70   sector size rep
fd30: 6f 72 74 65 64 0a 2a 2a 20 62 79 20 73 71 6c 69  orted.** by sqli
fd40: 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  te3OsSectorSize(
fd50: 29 2e 20 20 54 68 65 20 6d 69 6e 69 6d 75 6d 20  ).  The minimum 
fd60: 73 65 63 74 6f 72 20 73 69 7a 65 20 69 73 20 35  sector size is 5
fd70: 31 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  12..*/.static vo
fd80: 69 64 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  id setSectorSize
fd90: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
fda0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
fdb0: 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
fdc0: 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
fdd0: 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
fde0: 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
fdf0: 20 20 2f 2a 20 53 65 63 74 6f 72 20 73 69 7a 65    /* Sector size
fe00: 20 64 6f 65 73 6e 27 74 20 6d 61 74 74 65 72 20   doesn't matter 
fe10: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 66 69  for temporary fi
fe20: 6c 65 73 2e 20 41 6c 73 6f 2c 20 74 68 65 20 66  les. Also, the f
fe30: 69 6c 65 0a 20 20 20 20 2a 2a 20 6d 61 79 20 6e  ile.    ** may n
fe40: 6f 74 20 68 61 76 65 20 62 65 65 6e 20 6f 70 65  ot have been ope
fe50: 6e 65 64 20 79 65 74 2c 20 69 6e 20 77 68 63 69  ned yet, in whci
fe60: 68 20 63 61 73 65 20 74 68 65 20 4f 73 53 65 63  h case the OsSec
fe70: 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 2a 2a  torSize().    **
fe80: 20 63 61 6c 6c 20 77 69 6c 6c 20 73 65 67 66 61   call will segfa
fe90: 75 6c 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ult..    */.    
fea0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
feb0: 7a 65 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65  ze = sqlite3OsSe
fec0: 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 2d  ctorSize(pPager-
fed0: 3e 66 64 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  >fd);.  }.  if( 
fee0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
fef0: 7a 65 3c 35 31 32 20 29 7b 0a 20 20 20 20 70 50  ze<512 ){.    pP
ff00: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
ff10: 20 3d 20 35 31 32 3b 0a 20 20 7d 0a 7d 0a 0a 2f   = 512;.  }.}../
ff20: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
ff30: 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  e journal and th
ff40: 75 73 20 72 65 73 74 6f 72 65 20 74 68 65 20 64  us restore the d
ff50: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a  atabase file to.
ff60: 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69 74 20  ** the state it 
ff70: 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65  was in before we
ff80: 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20   started making 
ff90: 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a  changes.  .**.**
ffa0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
ffb0: 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66  e format is as f
ffc0: 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20  ollows: .**.**  
ffd0: 28 31 29 20 20 38 20 62 79 74 65 20 70 72 65 66  (1)  8 byte pref
ffe0: 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61  ix.  A copy of a
fff0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a  JournalMagic[]..
10000 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74 65 20  **  (2)  4 byte 
10010 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
10020 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
10030 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20  number of valid 
10040 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20  page records.** 
10050 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75        in the jou
10060 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76  rnal.  If this v
10070 61 6c 75 65 20 69 73 20 30 78 66 66 66 66 66 66  alue is 0xffffff
10080 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  ff, then compute
10090 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75   the.**       nu
100a0 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65 63  mber of page rec
100b0 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f  ords from the jo
100c0 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20  urnal size..**  
100d0 28 33 29 20 20 34 20 62 79 74 65 20 62 69 67 2d  (3)  4 byte big-
100e0 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77  endian integer w
100f0 68 69 63 68 20 69 73 20 74 68 65 20 69 6e 69 74  hich is the init
10100 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ial value for th
10110 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69  e .**       sani
10120 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20  ty checksum..** 
10130 20 28 34 29 20 20 34 20 62 79 74 65 20 69 6e 74   (4)  4 byte int
10140 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
10150 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
10160 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68  s to truncate th
10170 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62  e.**       datab
10180 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20  ase to during a 
10190 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35  rollback..**  (5
101a0 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
101b0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
101c0 63 68 20 69 73 20 74 68 65 20 73 65 63 74 6f 72  ch is the sector
101d0 20 73 69 7a 65 2e 20 20 54 68 65 20 68 65 61 64   size.  The head
101e0 65 72 0a 2a 2a 20 20 20 20 20 20 20 69 73 20 74  er.**       is t
101f0 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73 20 69  his many bytes i
10200 6e 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 36 29 20  n size..**  (6) 
10210 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69   4 byte big-endi
10220 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  an integer which
10230 20 69 73 20 74 68 65 20 70 61 67 65 20 63 61 73   is the page cas
10240 65 2e 0a 2a 2a 20 20 28 37 29 20 20 34 20 62 79  e..**  (7)  4 by
10250 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63 68  te integer which
10260 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   is the number o
10270 66 20 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d  f bytes in the m
10280 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  aster journal.**
10290 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68         name.  Th
102a0 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a  e value may be z
102b0 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68  ero (indicate th
102c0 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d  at there is no m
102d0 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a  aster.**       j
102e0 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 38 29  ournal.).**  (8)
102f0 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65    N bytes of the
10300 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
10310 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20  name.  The name 
10320 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d  will be nul-term
10330 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20  inated.**       
10340 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f  and might be sho
10350 72 74 65 72 20 74 68 61 6e 20 74 68 65 20 76 61  rter than the va
10360 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35  lue read from (5
10370 29 2e 20 20 49 66 20 74 68 65 20 66 69 72 73 74  ).  If the first
10380 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f   byte.**       o
10390 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30  f the name is \0
103a0 30 30 20 74 68 65 6e 20 74 68 65 72 65 20 69 73  00 then there is
103b0 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
103c0 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a  al.  The master.
103d0 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
103e0 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20   name is stored 
103f0 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 39  in UTF-8..**  (9
10400 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20  )  Zero or more 
10410 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c  pages instances,
10420 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73   each as follows
10430 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  :.**        +  4
10440 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65   byte page numbe
10450 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20  r..**        +  
10460 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
10470 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a   bytes of data..
10480 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
10490 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a  yte checksum.**.
104a0 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b  ** When we speak
104b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
104c0 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20  header, we mean 
104d0 74 68 65 20 66 69 72 73 74 20 38 20 69 74 65 6d  the first 8 item
104e0 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68  s above..** Each
104f0 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f   entry in the jo
10500 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74  urnal is an inst
10510 61 6e 63 65 20 6f 66 20 74 68 65 20 39 74 68 20  ance of the 9th 
10520 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c  item..**.** Call
10530 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20   the value from 
10540 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65  the second bulle
10550 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20  t "nRec".  nRec 
10560 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
10570 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65  .** valid page e
10580 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f  ntries in the jo
10590 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20  urnal.  In most 
105a0 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63  cases, you can c
105b0 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61  ompute the.** va
105c0 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d  lue of nRec from
105d0 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
105e0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
105f0 42 75 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a  But if a power.*
10600 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72  * failure occurr
10610 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ed while the jou
10620 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77  rnal was being w
10630 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64  ritten, it could
10640 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20   be the.** case 
10650 74 68 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66  that the size of
10660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10670 65 20 68 61 64 20 61 6c 72 65 61 64 79 20 62 65  e had already be
10680 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62 75 74  en increased but
10690 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e  .** the extra en
106a0 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65  tries had not ye
106b0 74 20 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79  t made it safely
106c0 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75   to disk.  In su
106d0 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68  ch a case,.** th
106e0 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
106f0 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68  computed from th
10700 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c  e file size woul
10710 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20  d be too large. 
10720 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61   For.** that rea
10730 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75  son, we always u
10740 73 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  se the nRec valu
10750 65 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e  e in the header.
10760 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52  .**.** If the nR
10770 65 63 20 76 61 6c 75 65 20 69 73 20 30 78 66 66  ec value is 0xff
10780 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20  ffffff it means 
10790 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64  that nRec should
107a0 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20   be computed.** 
107b0 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69  from the file si
107c0 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20  ze.  This value 
107d0 69 73 20 75 73 65 64 20 77 68 65 6e 20 74 68 65  is used when the
107e0 20 75 73 65 72 20 73 65 6c 65 63 74 73 20 74 68   user selects th
107f0 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74  e.** no-sync opt
10800 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72  ion for the jour
10810 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61  nal.  A power fa
10820 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64  ilure could lead
10830 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a   to corruption.*
10840 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20  * in this case. 
10850 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20   But for things 
10860 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74  like temporary t
10870 61 62 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c  able (which will
10880 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77   be.** deleted w
10890 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73  hen the power is
108a0 20 72 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f   restored) we do
108b0 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a  n't care.  .**.*
108c0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70  * If the file op
108d0 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72  ened as the jour
108e0 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  nal file is not 
108f0 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a  a well-formed.**
10900 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68   journal file th
10910 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20  en all pages up 
10920 74 6f 20 74 68 65 20 66 69 72 73 74 20 63 6f 72  to the first cor
10930 72 75 70 74 65 64 20 70 61 67 65 20 61 72 65 20  rupted page are 
10940 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28  rolled.** back (
10950 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74  or no pages if t
10960 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
10970 72 20 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e  r is corrupted).
10980 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
10990 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c  e.** is then del
109a0 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f  eted and SQLITE_
109b0 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73  OK returned, jus
109c0 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75  t as if no corru
109d0 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65  ption had.** bee
109e0 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a  n encountered..*
109f0 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f  *.** If an I/O o
10a00 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72  r malloc() error
10a10 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75   occurs, the jou
10a20 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74  rnal-file is not
10a30 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20   deleted.** and 
10a40 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
10a50 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
10a60 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
10a70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70  layback(Pager *p
10a80 50 61 67 65 72 2c 20 69 6e 74 20 69 73 48 6f 74  Pager, int isHot
10a90 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  ){.  sqlite3_vfs
10aa0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
10ab0 3e 70 56 66 73 3b 0a 20 20 69 36 34 20 73 7a 4a  >pVfs;.  i64 szJ
10ac0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10ad0 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65    /* Size of the
10ae0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e   journal file in
10af0 20 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20   bytes */.  u32 
10b00 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  nRec;           
10b10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
10b20 66 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65  f Records in the
10b30 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e   journal */.  in
10b40 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
10b50 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
10b60 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f  ounter */.  Pgno
10b70 20 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20   mxPg = 0;      
10b80 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
10b90 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c  the original fil
10ba0 65 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20  e in pages */.  
10bb0 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20  int rc;         
10bc0 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75           /* Resu
10bd0 6c 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62  lt code of a sub
10be0 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 69 6e 74  routine */.  int
10bf0 20 72 65 73 20 3d 20 30 3b 20 20 20 20 20 20 20   res = 0;       
10c00 20 20 20 20 20 20 2f 2a 20 56 61 6c 75 65 20 72        /* Value r
10c10 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
10c20 65 33 4f 73 41 63 63 65 73 73 28 29 20 2a 2f 0a  e3OsAccess() */.
10c30 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
10c40 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
10c50 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
10c60 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
10c70 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
10c80 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
10c90 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
10ca0 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
10cb0 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
10cc0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
10cd0 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
10ce0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
10cf0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
10d00 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
10d10 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ize(pPager->jfd,
10d20 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63   &szJ);.  if( rc
10d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73  !=SQLITE_OK || s
10d40 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f 74  zJ==0 ){.    got
10d50 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
10d60 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74    }..  /* Read t
10d70 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
10d80 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65 20  l name from the 
10d90 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20 69  journal, if it i
10da0 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a 20  s present..  ** 
10db0 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  If a master jour
10dc0 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
10dd0 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74 20   specified, but 
10de0 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a  the file is not.
10df0 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e 20    ** present on 
10e00 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20 6a  disk, then the j
10e10 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68 6f  ournal is not ho
10e20 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6e  t and does not n
10e30 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20 70  eed to be.  ** p
10e40 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a 2f  layed back..  */
10e50 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20 70 50 61  .  zMaster = pPa
10e60 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a  ger->pTmpSpace;.
10e70 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
10e80 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2d  rJournal(pPager-
10e90 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 70  >jfd, zMaster, p
10ea0 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
10eb0 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 69 66  athname+1);.  if
10ec0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10ed0 7c 7c 20 28 7a 4d 61 73 74 65 72 5b 30 5d 20 0a  || (zMaster[0] .
10ee0 20 20 20 26 26 20 28 72 65 73 3d 73 71 6c 69 74     && (res=sqlit
10ef0 65 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c  e3OsAccess(pVfs,
10f00 20 7a 4d 61 73 74 65 72 2c 20 53 51 4c 49 54 45   zMaster, SQLITE
10f10 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53 29 29  _ACCESS_EXISTS))
10f20 3d 3d 30 20 29 20 0a 20 20 29 7b 0a 20 20 20 20  ==0 ) .  ){.    
10f30 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
10f40 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10f50 63 6b 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  ck;.  }.  zMaste
10f60 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 65 73  r = 0;.  if( res
10f70 3c 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  <0 ){.    rc = S
10f80 51 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45  QLITE_IOERR_NOME
10f90 4d 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  M;.    goto end_
10fa0 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
10fb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10fc0 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
10fd0 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
10fe0 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
10ff0 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
11000 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
11010 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
11020 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
11030 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
11040 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
11050 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
11060 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
11070 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
11080 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
11090 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
110a0 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
110b0 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
110c0 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
110d0 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
110e0 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
110f0 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
11100 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
11110 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
11120 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
11130 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
11140 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
11150 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
11160 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
11170 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
11180 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
11190 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
111a0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
111b0 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
111c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
111d0 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
111e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
111f0 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
11200 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
11210 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
11220 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
11230 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
11240 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
11250 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
11260 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
11270 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
11280 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
11290 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
112a0 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
112b0 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
112c0 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
112d0 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
112e0 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
112f0 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
11300 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
11310 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
11320 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
11330 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
11340 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
11350 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
11360 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
11370 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
11380 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
11390 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
113a0 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
113b0 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
113c0 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
113d0 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 20  /* If nRec is 0 
113e0 61 6e 64 20 74 68 69 73 20 72 6f 6c 6c 62 61 63  and this rollbac
113f0 6b 20 69 73 20 6f 66 20 61 20 74 72 61 6e 73 61  k is of a transa
11400 63 74 69 6f 6e 20 63 72 65 61 74 65 64 20 62 79  ction created by
11410 20 74 68 69 73 0a 20 20 20 20 2a 2a 20 70 72 6f   this.    ** pro
11420 63 65 73 73 20 61 6e 64 20 69 66 20 74 68 69 73  cess and if this
11430 20 69 73 20 74 68 65 20 66 69 6e 61 6c 20 68 65   is the final he
11440 61 64 65 72 20 69 6e 20 74 68 65 20 6a 6f 75 72  ader in the jour
11450 6e 61 6c 2c 20 74 68 65 6e 20 69 74 20 6d 65 61  nal, then it mea
11460 6e 73 0a 20 20 20 20 2a 2a 20 74 68 61 74 20 74  ns.    ** that t
11470 68 69 73 20 70 61 72 74 20 6f 66 20 74 68 65 20  his part of the 
11480 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e  journal was bein
11490 67 20 66 69 6c 6c 65 64 20 62 75 74 20 68 61 73  g filled but has
114a0 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 0a 20 20   not yet been.  
114b0 20 20 2a 2a 20 73 79 6e 63 65 64 20 74 6f 20 64    ** synced to d
114c0 69 73 6b 2e 20 20 43 6f 6d 70 75 74 65 20 74 68  isk.  Compute th
114d0 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  e number of page
114e0 73 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 72  s based on the r
114f0 65 6d 61 69 6e 69 6e 67 0a 20 20 20 20 2a 2a 20  emaining.    ** 
11500 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65  size of the file
11510 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
11520 54 68 65 20 74 68 69 72 64 20 74 65 72 6d 20 6f  The third term o
11530 66 20 74 68 65 20 74 65 73 74 20 77 61 73 20 61  f the test was a
11540 64 64 65 64 20 74 6f 20 66 69 78 20 74 69 63 6b  dded to fix tick
11550 65 74 20 23 32 35 36 35 2e 0a 20 20 20 20 2a 2f  et #2565..    */
11560 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
11570 20 26 26 20 21 69 73 48 6f 74 20 26 26 0a 20 20   && !isHot &&.  
11580 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
11590 75 72 6e 61 6c 48 64 72 2b 4a 4f 55 52 4e 41 4c  urnalHdr+JOURNAL
115a0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d  _HDR_SZ(pPager)=
115b0 3d 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  =pPager->journal
115c0 4f 66 66 20 29 7b 0a 20 20 20 20 20 20 6e 52 65  Off ){.      nRe
115d0 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65  c = (szJ - pPage
115e0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f  r->journalOff) /
115f0 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70   JOURNAL_PG_SZ(p
11600 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  Pager);.    }.. 
11610 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73     /* If this is
11620 20 74 68 65 20 66 69 72 73 74 20 68 65 61 64 65   the first heade
11630 72 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  r read from the 
11640 6a 6f 75 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74  journal, truncat
11650 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  e the.    ** dat
11660 61 62 61 73 65 20 66 69 6c 65 20 62 61 63 6b 20  abase file back 
11670 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
11680 73 69 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  size..    */.   
11690 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
116a0 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c  rnalOff==JOURNAL
116b0 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
116c0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
116d0 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
116e0 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
116f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11700 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
11710 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
11720 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
11730 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
11740 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
11750 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
11760 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
11770 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
11780 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
11790 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
117a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
117b0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
117c0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
117d0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
117e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
117f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11800 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11810 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
11820 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
11830 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
11840 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20 20  E_OK;.          
11850 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11860 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20  ff = szJ;.      
11870 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
11880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11890 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
118a0 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d  yback;.        }
118b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
118c0 20 7d 0a 20 20 2f 2a 4e 4f 54 52 45 41 43 48 45   }.  /*NOTREACHE
118d0 44 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 30 20  D*/.  assert( 0 
118e0 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b  );..end_playback
118f0 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
11900 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 7a 4d 61  TE_OK ){.    zMa
11910 73 74 65 72 20 3d 20 70 50 61 67 65 72 2d 3e 70  ster = pPager->p
11920 54 6d 70 53 70 61 63 65 3b 0a 20 20 20 20 72 63  TmpSpace;.    rc
11930 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75   = readMasterJou
11940 72 6e 61 6c 28 70 50 61 67 65 72 2d 3e 6a 66 64  rnal(pPager->jfd
11950 2c 20 7a 4d 61 73 74 65 72 2c 20 70 50 61 67 65  , zMaster, pPage
11960 72 2d 3e 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  r->pVfs->mxPathn
11970 61 6d 65 2b 31 29 3b 0a 20 20 7d 0a 20 20 69 66  ame+1);.  }.  if
11980 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
11990 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
119a0 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
119b0 6e 28 70 50 61 67 65 72 2c 20 7a 4d 61 73 74 65  n(pPager, zMaste
119c0 72 5b 30 5d 21 3d 27 5c 30 27 29 3b 0a 20 20 7d  r[0]!='\0');.  }
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 26 26 20 7a 4d 61 73 74 65 72 5b  E_OK && zMaster[
119f0 30 5d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  0] ){.    /* If 
11a00 74 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74  there was a mast
11a10 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74  er journal and t
11a20 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
11a30 20 72 65 74 75 72 6e 20 73 75 63 63 65 73 73 2c   return success,
11a40 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
11a50 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
11a60 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
11a70 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
11a80 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  */.    rc = page
11a90 72 5f 64 65 6c 6d 61 73 74 65 72 28 70 50 61 67  r_delmaster(pPag
11aa0 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20  er, zMaster);.  
11ab0 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65  }..  /* The Page
11ac0 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72  r.sectorSize var
11ad0 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62  iable may have b
11ae0 65 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c  een updated whil
11af0 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62  e rolling.  ** b
11b00 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72  ack a journal cr
11b10 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65  eated by a proce
11b20 73 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72  ss with a differ
11b30 65 6e 74 20 73 65 63 74 6f 72 20 73 69 7a 65 0a  ent sector size.
11b40 20 20 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65    ** value. Rese
11b50 74 20 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72  t it to the corr
11b60 65 63 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68  ect value for th
11b70 69 73 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f  is process..  */
11b80 0a 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65  .  setSectorSize
11b90 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
11ba0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11bb0 50 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61  Playback the sta
11bc0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
11bd0 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69  **.** This is si
11be0 6d 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67  milar to playing
11bf0 20 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61   back the transa
11c00 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75  ction journal bu
11c10 74 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20  t with.** a few 
11c20 65 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a  extra twists..**
11c30 0a 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20  .**    (1)  The 
11c40 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
11c50 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
11c60 66 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72  file at the star
11c70 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20  t of.**         
11c80 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73  the statement is
11c90 20 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65   stored in pPage
11ca0 72 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74  r->stmtSize, not
11cb0 20 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   in the.**      
11cc0 20 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20     journal file 
11cd0 69 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20  itself..**.**   
11ce0 20 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f   (2)  In additio
11cf0 6e 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63  n to playing bac
11d00 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
11d10 6a 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a  journal, also.**
11d20 20 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63           playbac
11d30 6b 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74  k all pages of t
11d40 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
11d50 6f 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67  ournal beginning
11d60 0a 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f  .**         at o
11d70 66 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74  ffset pPager->st
11d80 6d 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74  mtJSize..*/.stat
11d90 69 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d  ic int pager_stm
11da0 74 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72  t_playback(Pager
11db0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
11dc0 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20   szJ;           
11dd0 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
11de0 20 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61   the full journa
11df0 6c 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66  l */.  i64 hdrOf
11e00 66 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20  f;.  int nRec;  
11e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11e20 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
11e30 64 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  ds */.  int i;  
11e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11e50 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
11e60 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
11e70 20 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a   szJ = pPager->j
11e80 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 2f 2a  ournalOff;..  /*
11e90 20 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62   Set hdrOff to b
11ea0 65 20 74 68 65 20 6f 66 66 73 65 74 20 6a 75 73  e the offset jus
11eb0 74 20 61 66 74 65 72 20 74 68 65 20 65 6e 64 20  t after the end 
11ec0 6f 66 20 74 68 65 20 6c 61 73 74 20 6a 6f 75 72  of the last jour
11ed0 6e 61 6c 0a 20 20 2a 2a 20 70 61 67 65 20 77 72  nal.  ** page wr
11ee0 69 74 74 65 6e 20 62 65 66 6f 72 65 20 74 68 65  itten before the
11ef0 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 2d 68   first journal-h
11f00 65 61 64 65 72 20 66 6f 72 20 74 68 69 73 20 73  eader for this s
11f10 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 74 72  tatement.  ** tr
11f20 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 77 72  ansaction was wr
11f30 69 74 74 65 6e 2c 20 6f 72 20 74 68 65 20 65 6e  itten, or the en
11f40 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
11f50 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
11f60 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
11f70 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
11f80 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
11f90 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
11fa0 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
11fb0 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
11fc0 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
11fd0 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
11fe0 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
11ff0 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
12000 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
12010 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
12020 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
12030 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
12040 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d  ger, pPager->stm
12050 74 53 69 7a 65 29 3b 0a 20 20 61 73 73 65 72 74  tSize);.  assert
12060 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12070 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b  =PAGER_SHARED );
12080 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75  ..  /* Figure ou
12090 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72  t how many recor
120a0 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 73 74  ds are in the st
120b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
120c0 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
120d0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
120e0 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e && pPager->jou
120f0 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 6e 52  rnalOpen );.  nR
12100 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
12110 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
12120 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
12130 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
12140 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
12150 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
12160 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
12170 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
12180 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
12190 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
121a0 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
121b0 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
121c0 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
121d0 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
121e0 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
121f0 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
12200 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
12210 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69  r(i=0; i<nRec; i
12220 2b 2b 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ++){.    i64 off
12230 73 65 74 20 3d 20 69 2a 28 34 2b 70 50 61 67 65  set = i*(4+pPage
12240 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
12250 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
12260 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
12270 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
12280 74 66 64 2c 20 6f 66 66 73 65 74 2c 20 30 29 3b  tfd, offset, 0);
12290 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
122a0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
122b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
122c0 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
122d0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
122e0 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
122f0 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
12300 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
12310 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
12320 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
12330 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
12340 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
12350 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
12360 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
12370 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
12380 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
12390 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
123a0 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
123b0 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
123c0 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
123d0 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
123e0 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
123f0 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
12400 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
12410 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
12420 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
12430 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
12440 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
12450 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
12460 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
12470 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
12480 6e 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72  n..  */.  pPager
12490 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70  ->journalOff = p
124a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
124b0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75  ;.  pPager->cksu
124c0 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e  mInit = pPager->
124d0 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 77 68 69  stmtCksum;.  whi
124e0 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  le( pPager->jour
124f0 6e 61 6c 4f 66 66 20 3c 20 68 64 72 4f 66 66 20  nalOff < hdrOff 
12500 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
12510 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
12520 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
12530 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
12540 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29 3b  >journalOff, 1);
12550 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
12560 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
12570 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12580 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
12590 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
125a0 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
125b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
125c0 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
125d0 32 20 6e 4a 52 65 63 3b 20 20 20 20 20 20 20 20  2 nJRec;        
125e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 4a 6f   /* Number of Jo
125f0 75 72 6e 61 6c 20 52 65 63 6f 72 64 73 20 2a 2f  urnal Records */
12600 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
12610 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
12620 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
12630 73 7a 4a 2c 20 26 6e 4a 52 65 63 2c 20 26 64 75  szJ, &nJRec, &du
12640 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63  mmy);.    if( rc
12650 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
12660 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
12670 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
12680 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73        goto end_s
12690 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
126a0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4a 52 65    }.    if( nJRe
126b0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 4a  c==0 ){.      nJ
126c0 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
126d0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
126e0 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
126f0 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
12700 20 20 20 66 6f 72 28 69 3d 6e 4a 52 65 63 2d 31     for(i=nJRec-1
12710 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72  ; i>=0 && pPager
12720 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
12730 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20  zJ; i--){.      
12740 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
12750 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
12760 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  ger, pPager->jfd
12770 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
12780 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 20 20  lOff, 1);.      
12790 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
127a0 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
127b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
127c0 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
127d0 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
127e0 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
127f0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
12800 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
12810 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
12820 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 20 7b  rc==SQLITE_OK) {
12830 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
12840 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
12850 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
12860 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
12870 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
12880 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
12890 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
128a0 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
128b0 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
128c0 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f   are allowed..*/
128d0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
128e0 65 72 53 65 74 43 61 63 68 65 73 69 7a 65 28 50  erSetCachesize(P
128f0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
12900 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
12910 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
12920 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
12930 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
12940 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
12950 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
12960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
12970 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
12980 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
12990 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
129a0 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
129b0 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
129c0 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
129d0 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
129e0 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
129f0 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
12a00 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
12a10 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
12a20 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
12a30 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
12a40 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
12a50 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
12a60 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
12a70 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
12a80 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
12a90 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
12aa0 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
12ab0 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
12ac0 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
12ad0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
12ae0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
12af0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
12b00 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
12b10 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
12b20 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
12b30 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
12b40 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
12b50 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
12b60 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
12b70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
12b80 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
12b90 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
12ba0 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
12bb0 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
12bc0 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
12bd0 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
12be0 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
12bf0 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
12c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
12c10 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
12c20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
12c30 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
12c40 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
12c50 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
12c60 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
12c70 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12c80 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
12c90 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
12ca0 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
12cb0 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
12cc0 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
12cd0 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
12ce0 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
12cf0 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
12d00 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
12d10 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
12d20 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
12d30 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
12d40 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
12d50 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
12d60 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
12d70 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
12d80 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12d90 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
12da0 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
12db0 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
12dc0 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
12dd0 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
12de0 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
12df0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
12e00 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
12e10 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
12e20 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
12e30 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
12e40 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
12e50 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
12e60 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
12e70 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
12e80 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
12e90 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 65  d sqlite3PagerSe
12ea0 74 53 61 66 65 74 79 4c 65 76 65 6c 28 50 61 67  tSafetyLevel(Pag
12eb0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
12ec0 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75 6c 6c 5f  level, int full_
12ed0 66 73 79 6e 63 29 7b 0a 20 20 70 50 61 67 65 72  fsync){.  pPager
12ee0 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
12ef0 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
12f00 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
12f10 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
12f20 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
12f30 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
12f40 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
12f50 67 73 20 3d 20 28 66 75 6c 6c 5f 66 73 79 6e 63  gs = (full_fsync
12f60 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46 55 4c  ?SQLITE_SYNC_FUL
12f70 4c 3a 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f  L:SQLITE_SYNC_NO
12f80 52 4d 41 4c 29 3b 0a 20 20 69 66 28 20 70 50 61  RMAL);.  if( pPa
12f90 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50  ger->noSync ) pP
12fa0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
12fb0 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a   0;.}.#endif../*
12fc0 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  .** The followin
12fd0 67 20 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c  g global variabl
12fe0 65 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64  e is incremented
12ff0 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 6c 69   whenever the li
13000 62 72 61 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74  brary.** attempt
13010 73 20 74 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70  s to open a temp
13020 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 54 68 69  orary file.  Thi
13030 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73  s information is
13040 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73   used for.** tes
13050 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
13060 73 20 6f 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66  s only.  .*/.#if
13070 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a  def SQLITE_TEST.
13080 69 6e 74 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e  int sqlite3_open
13090 74 65 6d 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a  temp_count = 0;.
130a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
130b0 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
130c0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74  ile. .**.** Writ
130d0 65 20 74 68 65 20 66 69 6c 65 20 64 65 73 63 72  e the file descr
130e0 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20  iptor into *fd. 
130f0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
13100 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72 20  K on success or 
13110 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72  some.** other er
13120 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20 66  ror code if we f
13130 61 69 6c 2e 20 54 68 65 20 4f 53 20 77 69 6c 6c  ail. The OS will
13140 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64   automatically d
13150 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
13160 61 72 79 0a 2a 2a 20 66 69 6c 65 20 77 68 65 6e  ary.** file when
13170 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
13180 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c  /.static int sql
13190 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
131a0 70 28 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73  p(.  sqlite3_vfs
131b0 20 2a 70 56 66 73 2c 20 20 20 20 2f 2a 20 54 68   *pVfs,    /* Th
131c0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
131d0 79 73 74 65 6d 20 6c 61 79 65 72 20 2a 2f 0a 20  ystem layer */. 
131e0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70   sqlite3_file *p
131f0 46 69 6c 65 2c 20 20 2f 2a 20 57 72 69 74 65 20  File,  /* Write 
13200 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
13210 74 6f 72 20 68 65 72 65 20 2a 2f 0a 20 20 63 68  tor here */.  ch
13220 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20  ar *zFilename,  
13230 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
13240 68 65 20 66 69 6c 65 2e 20 20 4d 69 67 68 74 20  he file.  Might 
13250 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  be NULL */.  int
13260 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20 20   vfsFlags       
13270 20 20 20 2f 2a 20 46 6c 61 67 73 20 70 61 73 73     /* Flags pass
13280 65 64 20 74 68 72 6f 75 67 68 20 74 6f 20 74 68  ed through to th
13290 65 20 56 46 53 20 2a 2f 0a 29 7b 0a 20 20 69 6e  e VFS */.){.  in
132a0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
132b0 7a 46 69 6c 65 6e 61 6d 65 21 3d 30 20 29 3b 0a  zFilename!=0 );.
132c0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
132d0 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f 70  EST.  sqlite3_op
132e0 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b 20  entemp_count++; 
132f0 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65 73   /* Used for tes
13300 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
13310 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69 66  s only */.#endif
13320 0a 0a 20 20 76 66 73 46 6c 61 67 73 20 7c 3d 20  ..  vfsFlags |= 
13330 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
13340 44 57 52 49 54 45 20 7c 20 53 51 4c 49 54 45 5f  DWRITE | SQLITE_
13350 4f 50 45 4e 5f 43 52 45 41 54 45 20 7c 0a 20 20  OPEN_CREATE |.  
13360 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
13370 5f 4f 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 20  _OPEN_EXCLUSIVE 
13380 7c 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45  | SQLITE_OPEN_DE
13390 4c 45 54 45 4f 4e 43 4c 4f 53 45 3b 0a 20 20 72  LETEONCLOSE;.  r
133a0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
133b0 6e 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  n(pVfs, zFilenam
133c0 65 2c 20 70 46 69 6c 65 2c 20 76 66 73 46 6c 61  e, pFile, vfsFla
133d0 67 73 2c 20 30 29 3b 0a 20 20 61 73 73 65 72 74  gs, 0);.  assert
133e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
133f0 7c 7c 20 70 46 69 6c 65 2d 3e 70 4d 65 74 68 6f  || pFile->pMetho
13400 64 73 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ds );.  return r
13410 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  c;.}../*.** Crea
13420 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63 61  te a new page ca
13430 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70 6f  che and put a po
13440 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67  inter to the pag
13450 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50 61  e cache in *ppPa
13460 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65  ger..** The file
13470 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e 65   to be cached ne
13480 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20 54  ed not exist.  T
13490 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c  he file is not l
134a0 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74  ocked until.** t
134b0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
134c0 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
134d0 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68  () and is only h
134e0 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74  eld open until t
134f0 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20  he.** last page 
13500 69 73 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e  is released usin
13510 67 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  g sqlite3PagerUn
13520 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ref()..**.** If 
13530 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c  zFilename is NUL
13540 4c 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c  L then a randoml
13550 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72  y-named temporar
13560 79 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65  y file is create
13570 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73  d.** and used as
13580 20 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20   the file to be 
13590 63 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c  cached.  The fil
135a0 65 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65  e will be delete
135b0 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c  d.** automatical
135c0 6c 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c  ly when it is cl
135d0 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  osed..**.** If z
135e0 46 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65  Filename is ":me
135f0 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20  mory:" then all 
13600 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68  information is h
13610 65 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a  eld in cache..**
13620 20 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69   It is never wri
13630 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54  tten to disk.  T
13640 68 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20  his can be used 
13650 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a  to implement an.
13660 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  ** in-memory dat
13670 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  abase..*/.int sq
13680 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 28 0a  lite3PagerOpen(.
13690 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
136a0 56 66 73 2c 20 20 20 20 20 20 20 2f 2a 20 54 68  Vfs,       /* Th
136b0 65 20 76 69 72 74 75 61 6c 20 66 69 6c 65 20 73  e virtual file s
136c0 79 73 74 65 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  ystem to use */.
136d0 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
136e0 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
136f0 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
13700 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
13710 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
13720 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
13730 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
13740 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
13750 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
13760 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
13770 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
13780 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
13790 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
137a0 20 69 6e 74 20 66 6c 61 67 73 2c 20 20 20 20 20   int flags,     
137b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
137c0 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
137d0 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20 69 6e  his file */.  in
137e0 74 20 76 66 73 46 6c 61 67 73 20 20 20 20 20 20  t vfsFlags      
137f0 20 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20         /* flags 
13800 70 61 73 73 65 64 20 74 68 72 6f 75 67 68 20 74  passed through t
13810 6f 20 73 71 6c 69 74 65 33 5f 76 66 73 2e 78 4f  o sqlite3_vfs.xO
13820 70 65 6e 28 29 20 2a 2f 0a 29 7b 0a 20 20 75 38  pen() */.){.  u8
13830 20 2a 70 50 74 72 3b 0a 20 20 50 61 67 65 72 20   *pPtr;.  Pager 
13840 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 69  *pPager = 0;.  i
13850 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
13860 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  K;.  int i;.  in
13870 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a  t tempFile = 0;.
13880 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b    int memDb = 0;
13890 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20  .  int readOnly 
138a0 3d 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f  = 0;.  int useJo
138b0 75 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26  urnal = (flags &
138c0 20 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52   PAGER_OMIT_JOUR
138d0 4e 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e  NAL)==0;.  int n
138e0 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61  oReadlock = (fla
138f0 67 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45  gs & PAGER_NO_RE
13900 41 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 69 6e  ADLOCK)!=0;.  in
13910 74 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69 7a  t journalFileSiz
13920 65 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e  e = sqlite3Journ
13930 61 6c 53 69 7a 65 28 70 56 66 73 29 3b 0a 20 20  alSize(pVfs);.  
13940 69 6e 74 20 6e 44 65 66 61 75 6c 74 50 61 67 65  int nDefaultPage
13950 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
13960 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 63  T_PAGE_SIZE;.  c
13970 68 61 72 20 2a 7a 50 61 74 68 6e 61 6d 65 3b 0a  har *zPathname;.
13980 20 20 69 6e 74 20 6e 50 61 74 68 6e 61 6d 65 3b    int nPathname;
13990 0a 20 20 63 68 61 72 20 2a 7a 53 74 6d 74 4a 72  .  char *zStmtJr
139a0 6e 6c 3b 0a 20 20 69 6e 74 20 6e 53 74 6d 74 4a  nl;.  int nStmtJ
139b0 72 6e 6c 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  rnl;..  /* The d
139c0 65 66 61 75 6c 74 20 72 65 74 75 72 6e 20 69 73  efault return is
139d0 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
139e0 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
139f0 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75 74 65  0;..  /* Compute
13a00 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61   the full pathna
13a10 6d 65 20 2a 2f 0a 20 20 6e 50 61 74 68 6e 61 6d  me */.  nPathnam
13a20 65 20 3d 20 70 56 66 73 2d 3e 6d 78 50 61 74 68  e = pVfs->mxPath
13a30 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50 61 74 68 6e  name+1;.  zPathn
13a40 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  ame = sqlite3_ma
13a50 6c 6c 6f 63 28 6e 50 61 74 68 6e 61 6d 65 2a 32  lloc(nPathname*2
13a60 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68 6e 61  );.  if( zPathna
13a70 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  me==0 ){.    ret
13a80 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
13a90 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
13aa0 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
13ab0 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
13ac0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
13ad0 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
13ae0 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
13af0 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
13b00 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
13b10 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e 61 6d  ;.      zPathnam
13b20 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 65  e[0] = 0;.    }e
13b30 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20 7b  lse.#endif.    {
13b40 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
13b50 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
13b60 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e 61 6d  e(pVfs, zFilenam
13b70 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20 7a 50  e, nPathname, zP
13b80 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a  athname);.    }.
13b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
13ba0 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74 54 65  = sqlite3OsGetTe
13bb0 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e 50 61  mpname(pVfs, nPa
13bc0 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e 61 6d  thname, zPathnam
13bd0 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
13be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
13bf0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13c00 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
13c10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
13c20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73 74 72   nPathname = str
13c30 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a  len(zPathname);.
13c40 0a 20 20 2f 2a 20 50 75 74 20 74 68 65 20 73 74  .  /* Put the st
13c50 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
13c60 69 6e 20 74 65 6d 70 6f 72 61 72 79 20 64 69 73  in temporary dis
13c70 6b 20 73 70 61 63 65 20 73 69 6e 63 65 20 74 68  k space since th
13c80 69 73 20 69 73 0a 20 20 2a 2a 20 73 6f 6d 65 74  is is.  ** somet
13c90 69 6d 65 73 20 52 41 4d 20 64 69 73 6b 20 6f 72  imes RAM disk or
13ca0 20 6f 74 68 65 72 20 6f 70 74 69 6d 69 7a 65 64   other optimized
13cb0 20 73 74 6f 72 61 67 65 2e 20 20 55 6e 6c 69 6b   storage.  Unlik
13cc0 65 6c 79 20 74 68 65 20 6d 61 69 6e 0a 20 20 2a  ely the main.  *
13cd0 2a 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 66  * main journal f
13ce0 69 6c 65 2c 20 74 68 65 20 73 74 61 74 65 6d 65  ile, the stateme
13cf0 6e 74 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  nt journal does 
13d00 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 0a  not need to be .
13d10 20 20 2a 2a 20 63 6f 6c 6f 63 61 74 65 64 20 77    ** colocated w
13d20 69 74 68 20 74 68 65 20 64 61 74 61 62 61 73 65  ith the database
13d30 20 6e 6f 72 20 64 6f 65 73 20 69 74 20 6e 65 65   nor does it nee
13d40 64 20 74 6f 20 62 65 20 70 65 72 73 69 73 74 65  d to be persiste
13d50 6e 74 2e 0a 20 20 2a 2f 0a 20 20 7a 53 74 6d 74  nt..  */.  zStmt
13d60 4a 72 6e 6c 20 3d 20 26 7a 50 61 74 68 6e 61 6d  Jrnl = &zPathnam
13d70 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a  e[nPathname+1];.
13d80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
13d90 47 65 74 54 65 6d 70 6e 61 6d 65 28 70 56 66 73  GetTempname(pVfs
13da0 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
13db0 6d 65 2b 31 2c 20 7a 53 74 6d 74 4a 72 6e 6c 29  me+1, zStmtJrnl)
13dc0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
13dd0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
13de0 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
13df0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
13e00 20 72 63 3b 0a 20 20 7d 0a 20 20 6e 53 74 6d 74   rc;.  }.  nStmt
13e10 4a 72 6e 6c 20 3d 20 73 74 72 6c 65 6e 28 7a 53  Jrnl = strlen(zS
13e20 74 6d 74 4a 72 6e 6c 29 3b 0a 0a 20 20 2f 2a 20  tmtJrnl);..  /* 
13e30 41 6c 6c 6f 63 61 74 65 20 6d 65 6d 6f 72 79 20  Allocate memory 
13e40 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 73 74  for the pager st
13e50 72 75 63 74 75 72 65 20 2a 2f 0a 20 20 70 50 61  ructure */.  pPa
13e60 67 65 72 20 3d 20 73 71 6c 69 74 65 33 4d 61 6c  ger = sqlite3Mal
13e70 6c 6f 63 5a 65 72 6f 28 0a 20 20 20 20 73 69 7a  locZero(.    siz
13e80 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 20  eof(*pPager) +  
13e90 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
13ea0 72 20 73 74 72 75 63 74 75 72 65 20 2a 2f 0a 20  r structure */. 
13eb0 20 20 20 6a 6f 75 72 6e 61 6c 46 69 6c 65 53 69     journalFileSi
13ec0 7a 65 20 2b 20 20 20 20 20 20 20 20 20 20 20 2f  ze +           /
13ed0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
13ee0 6c 65 20 73 74 72 75 63 74 75 72 65 20 2a 2f 20  le structure */ 
13ef0 0a 20 20 20 20 70 56 66 73 2d 3e 73 7a 4f 73 46  .    pVfs->szOsF
13f00 69 6c 65 20 2a 20 33 20 2b 20 20 20 20 20 20 20  ile * 3 +       
13f10 20 2f 2a 20 54 68 65 20 6d 61 69 6e 20 64 62 20   /* The main db 
13f20 61 6e 64 20 74 77 6f 20 6a 6f 75 72 6e 61 6c 20  and two journal 
13f30 66 69 6c 65 73 20 2a 2f 20 0a 20 20 20 20 33 2a  files */ .    3*
13f40 6e 50 61 74 68 6e 61 6d 65 20 2b 20 34 30 20 2b  nPathname + 40 +
13f50 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69            /* zFi
13f60 6c 65 6e 61 6d 65 2c 20 7a 44 69 72 65 63 74 6f  lename, zDirecto
13f70 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c 20 2a 2f 0a  ry, zJournal */.
13f80 20 20 20 20 6e 53 74 6d 74 4a 72 6e 6c 20 20 20      nStmtJrnl   
13f90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13fa0 2f 2a 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a  /* zStmtJrnl */.
13fb0 20 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67    );.  if( !pPag
13fc0 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  er ){.    sqlite
13fd0 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65  3_free(zPathname
13fe0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
13ff0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
14000 20 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26    pPtr = (u8 *)&
14010 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61  pPager[1];.  pPa
14020 67 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20  ger->vfsFlags = 
14030 76 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67  vfsFlags;.  pPag
14040 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65  er->fd = (sqlite
14050 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
14060 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b  fs->szOsFile*0];
14070 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20  .  pPager->stfd 
14080 3d 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a  = (sqlite3_file*
14090 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f  )&pPtr[pVfs->szO
140a0 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67  sFile*1];.  pPag
140b0 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74  er->jfd = (sqlit
140c0 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70  e3_file*)&pPtr[p
140d0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d  Vfs->szOsFile*2]
140e0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  ;.  pPager->zFil
140f0 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  ename = (char*)&
14100 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46  pPtr[pVfs->szOsF
14110 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c  ile*2+journalFil
14120 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72  eSize];.  pPager
14130 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26  ->zDirectory = &
14140 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14150 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a  e[nPathname+1];.
14160 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e    pPager->zJourn
14170 61 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44  al = &pPager->zD
14180 69 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61  irectory[nPathna
14190 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  me+1];.  pPager-
141a0 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50  >zStmtJrnl = &pP
141b0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
141c0 50 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20  Pathname+10];.  
141d0 70 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70  pPager->pVfs = p
141e0 56 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50  Vfs;.  memcpy(pP
141f0 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14200 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74   zPathname, nPat
14210 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 6d 65 6d 63  hname+1);.  memc
14220 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74  py(pPager->zStmt
14230 4a 72 6e 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c 2c  Jrnl, zStmtJrnl,
14240 20 6e 53 74 6d 74 4a 72 6e 6c 2b 31 29 3b 0a 20   nStmtJrnl+1);. 
14250 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
14260 61 74 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20  athname);..  /* 
14270 4f 70 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  Open the pager f
14280 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
14290 7a 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69  zFilename && zFi
142a0 6c 65 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65  lename[0] && !me
142b0 6d 44 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  mDb ){.    if( n
142c0 50 61 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e  Pathname>(pVfs->
142d0 6d 78 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a  mxPathname - siz
142e0 65 6f 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29  eof("-journal"))
142f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14300 51 4c 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a  QLITE_CANTOPEN;.
14310 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
14320 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20   int fout = 0;. 
14330 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14340 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
14350 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
14360 20 70 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20   pPager->fd,.   
14370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14380 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66        pPager->vf
14390 73 46 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a  sFlags, &fout);.
143a0 20 20 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d        readOnly =
143b0 20 28 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50   (fout&SQLITE_OP
143c0 45 4e 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20  EN_READONLY);.. 
143d0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66       /* If the f
143e0 69 6c 65 20 77 61 73 20 73 75 63 63 65 73 73 66  ile was successf
143f0 75 6c 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20  ully opened for 
14400 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65 73  read/write acces
14410 73 2c 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f  s,.      ** choo
14420 73 65 20 61 20 64 65 66 61 75 6c 74 20 70 61 67  se a default pag
14430 65 20 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77  e size in case w
14440 65 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65  e have to create
14450 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61   the.      ** da
14460 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
14470 20 64 65 66 61 75 6c 74 20 70 61 67 65 20 73 69   default page si
14480 7a 65 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75  ze is the maximu
14490 6d 20 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  m of:.      **. 
144a0 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c       **    + SQL
144b0 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  ITE_DEFAULT_PAGE
144c0 5f 53 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20  _SIZE,.      ** 
144d0 20 20 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72     + The value r
144e0 65 74 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74  eturned by sqlit
144f0 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29  e3OsSectorSize()
14500 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
14510 68 65 20 6c 61 72 67 65 73 74 20 70 61 67 65 20  he largest page 
14520 73 69 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65  size that can be
14530 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61   written atomica
14540 6c 6c 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  lly..      */.  
14550 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
14560 54 45 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e  TE_OK && !readOn
14570 6c 79 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ly ){.        in
14580 74 20 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20  t iSectorSize = 
14590 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53  sqlite3OsSectorS
145a0 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ize(pPager->fd);
145b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
145c0 66 61 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f  faultPage<iSecto
145d0 72 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  rSize ){.       
145e0 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20     nDefaultPage 
145f0 3d 20 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20  = iSectorSize;. 
14600 20 20 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20         }.#ifdef 
14610 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
14620 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20  OMIC_WRITE.     
14630 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69     {.          i
14640 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33  nt iDc = sqlite3
14650 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74 65  OsDeviceCharacte
14660 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e  ristics(pPager->
14670 66 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fd);.          i
14680 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20  nt ii;.         
14690 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
146a0 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
146b0 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20  (512>>8));.     
146c0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
146d0 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36  TE_IOCAP_ATOMIC6
146e0 34 4b 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b  4K==(65536>>8));
146f0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
14700 74 28 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46  t(SQLITE_MAX_DEF
14710 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d  AULT_PAGE_SIZE<=
14720 36 35 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20  65536);.        
14730 20 20 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c    for(ii=nDefaul
14740 74 50 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54  tPage; ii<=SQLIT
14750 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41  E_MAX_DEFAULT_PA
14760 47 45 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32  GE_SIZE; ii=ii*2
14770 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
14780 66 28 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49  f( iDc&(SQLITE_I
14790 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e  OCAP_ATOMIC|(ii>
147a0 3e 38 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50  >8)) ) nDefaultP
147b0 61 67 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20  age = ii;.      
147c0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
147d0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
147e0 66 28 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e  f( nDefaultPage>
147f0 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
14800 4c 54 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a  LT_PAGE_SIZE ){.
14810 20 20 20 20 20 20 20 20 20 20 6e 44 65 66 61 75            nDefau
14820 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f  ltPage = SQLITE_
14830 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
14840 5f 53 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d  _SIZE;.        }
14850 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14860 20 7d 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44   }else if( !memD
14870 62 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61  b ){.    /* If a
14880 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
14890 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 69 74  is requested, it
148a0 20 69 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69   is not opened i
148b0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20  mmediately..    
148c0 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
148d0 77 65 20 61 63 63 65 70 74 20 74 68 65 20 64 65  we accept the de
148e0 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20  fault page size 
148f0 61 6e 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c  and delay actual
14900 6c 79 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e  ly.    ** openin
14910 67 20 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c  g the file until
14920 20 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20   the first call 
14930 74 6f 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20  to OsWrite()..  
14940 20 20 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69    */ .    tempFi
14950 6c 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  le = 1;.    pPag
14960 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
14970 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d  R_EXCLUSIVE;.  }
14980 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 20 26  ..  if( pPager &
14990 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
149a0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  ){.    pPager->p
149b0 54 6d 70 53 70 61 63 65 20 3d 20 73 71 6c 69 74  TmpSpace = sqlit
149c0 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 6e 44 65  e3MallocZero(nDe
149d0 66 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a  faultPage);.  }.
149e0 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f  .  /* If an erro
149f0 72 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74  r occured in eit
14a00 68 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b  her of the block
14a10 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72  s above..  ** Fr
14a20 65 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72  ee the Pager str
14a30 75 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65  ucture and close
14a40 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20   the file..  ** 
14a50 53 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20  Since the pager 
14a60 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64  is not allocated
14a70 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65   there is no nee
14a80 64 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61  d to set .  ** a
14a90 6e 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b  ny Pager.errMask
14aa0 20 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f   variables..  */
14ab0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c  .  if( !pPager |
14ac0 7c 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  | !pPager->pTmpS
14ad0 70 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  pace ){.    sqli
14ae0 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
14af0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69  r->fd);.    sqli
14b00 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29  te3_free(pPager)
14b10 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
14b20 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
14b30 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
14b40 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
14b50 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
14b60 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
14b70 70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61  pPager->fd), pPa
14b80 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b  ger->zFilename);
14b90 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45  .  IOTRACE(("OPE
14ba0 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67  N %p %s\n", pPag
14bb0 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  er, pPager->zFil
14bc0 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69  ename))..  /* Fi
14bd0 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72  ll in Pager.zDir
14be0 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65  ectory[] */.  me
14bf0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  mcpy(pPager->zDi
14c00 72 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d  rectory, pPager-
14c10 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
14c20 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28  hname+1);.  for(
14c30 69 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d  i=strlen(pPager-
14c40 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e  >zDirectory); i>
14c50 30 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69  0 && pPager->zDi
14c60 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f  rectory[i-1]!='/
14c70 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20  '; i--){}.  if( 
14c80 69 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44  i>0 ) pPager->zD
14c90 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20  irectory[i-1] = 
14ca0 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e  0;..  /* Fill in
14cb0 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b   Pager.zJournal[
14cc0 5d 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28 70 50  ] */.  memcpy(pP
14cd0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
14ce0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
14cf0 65 2c 20 6e 50 61 74 68 6e 61 6d 65 29 3b 0a 20  e, nPathname);. 
14d00 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72 2d   memcpy(&pPager-
14d10 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50 61 74 68 6e  >zJournal[nPathn
14d20 61 6d 65 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22  ame], "-journal"
14d30 2c 20 39 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67  , 9);..  /* pPag
14d40 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
14d50 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14d60 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75  ->useJournal = u
14d70 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65  seJournal && !me
14d80 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  mDb;.  pPager->n
14d90 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65  oReadlock = noRe
14da0 61 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e  adlock && readOn
14db0 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ly;.  /* pPager-
14dc0 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a  >stmtOpen = 0; *
14dd0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
14de0 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f  tmtInUse = 0; */
14df0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52  .  /* pPager->nR
14e00 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  ef = 0; */.  pPa
14e10 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65  ger->dbSize = me
14e20 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d  mDb-1;.  pPager-
14e30 3e 70 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66  >pageSize = nDef
14e40 61 75 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70  aultPage;.  /* p
14e50 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
14e60 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
14e70 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d  ger->stmtJSize =
14e80 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
14e90 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a  er->nPage = 0; *
14ea0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  /.  pPager->mxPa
14eb0 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67  ge = 100;.  pPag
14ec0 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c  er->mxPgno = SQL
14ed0 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55  ITE_MAX_PAGE_COU
14ee0 4e 54 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  NT;.  /* pPager-
14ef0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
14f00 4e 4c 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65  NLOCK; */.  asse
14f10 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14f20 65 20 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f  e == (tempFile ?
14f30 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
14f40 20 3a 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29   : PAGER_UNLOCK)
14f50 20 29 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   );.  /* pPager-
14f60 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f  >errMask = 0; */
14f70 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
14f80 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
14f90 20 20 61 73 73 65 72 74 28 20 74 65 6d 70 46 69    assert( tempFi
14fa0 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e  le==PAGER_LOCKIN
14fb0 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20  GMODE_NORMAL .  
14fc0 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46          || tempF
14fd0 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ile==PAGER_LOCKI
14fe0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
14ff0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
15000 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
15010 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a  EXCLUSIVE==1 );.
15020 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
15030 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69  iveMode = tempFi
15040 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d  le; .  pPager->m
15050 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20  emDb = memDb;.  
15060 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
15070 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f   = readOnly;.  /
15080 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  * pPager->needSy
15090 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  nc = 0; */.  pPa
150a0 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
150b0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c  ager->tempFile |
150c0 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20  | !useJournal;. 
150d0 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
150e0 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  c = (pPager->noS
150f0 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67  ync?0:1);.  pPag
15100 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d  er->sync_flags =
15110 20 53 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52   SQLITE_SYNC_NOR
15120 4d 41 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72  MAL;.  /* pPager
15130 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f  ->pFirst = 0; */
15140 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46  .  /* pPager->pF
15150 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20  irstSynced = 0; 
15160 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  */.  /* pPager->
15170 70 4c 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20  pLast = 0; */.  
15180 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
15190 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
151a0 28 6e 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65  (nExtra);.  asse
151b0 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
151c0 4d 65 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c  Methods||memDb||
151d0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
151e0 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
151f0 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
15200 67 65 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  ger);.  }.  /* p
15210 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
15220 6c 65 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  ler = 0; */.  /*
15230 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e   memset(pPager->
15240 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66  aHash, 0, sizeof
15250 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29  (pPager->aHash))
15260 3b 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20  ; */.  *ppPager 
15270 3d 20 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66  = pPager;.#ifdef
15280 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
15290 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
152a0 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  .  pPager->iInUs
152b0 65 4d 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  eMM = 0;.  pPage
152c0 72 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b  r->iInUseDB = 0;
152d0 0a 20 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b  .  if( !memDb ){
152e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
152f0 4d 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 20 20 73  MUTEX_NOOP.    s
15300 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
15310 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
15320 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
15330 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
15340 4d 32 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  M2);.#endif.    
15350 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e  sqlite3_mutex_en
15360 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20 20  ter(mutex);.    
15370 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20  pPager->pNext = 
15380 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
15390 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
153a0 33 50 61 67 65 72 4c 69 73 74 20 29 7b 0a 20 20  3PagerList ){.  
153b0 20 20 20 20 61 73 73 65 72 74 28 20 73 71 6c 69      assert( sqli
153c0 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70 50  te3PagerList->pP
153d0 72 65 76 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rev==0 );.      
153e0 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
153f0 2d 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72  ->pPrev = pPager
15400 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
15410 65 72 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20  er->pPrev = 0;. 
15420 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
15430 69 73 74 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ist = pPager;.  
15440 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
15450 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
15460 7d 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  }.#endif.  retur
15470 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
15480 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75  /*.** Set the bu
15490 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74  sy handler funct
154a0 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ion..*/.void sql
154b0 69 74 65 33 50 61 67 65 72 53 65 74 42 75 73 79  ite3PagerSetBusy
154c0 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a 70  handler(Pager *p
154d0 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64 6c  Pager, BusyHandl
154e0 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72  er *pBusyHandler
154f0 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42 75  ){.  pPager->pBu
15500 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75 73  syHandler = pBus
15510 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a  yHandler;.}../*.
15520 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74 72  ** Set the destr
15530 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20 70  uctor for this p
15540 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55  ager.  If not NU
15550 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63 74  LL, the destruct
15560 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20  or is called.** 
15570 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65 6e  when the referen
15580 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68  ce count on each
15590 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a 65   page reaches ze
155a0 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75 63  ro.  The destruc
155b0 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73  tor can.** be us
155c0 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20 69  ed to clean up i
155d0 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
155e0 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74 20  e extra segment 
155f0 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63 68  appended to each
15600 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
15610 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 6e   destructor is n
15620 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20 72  ot called as a r
15630 65 73 75 6c 74 20 73 71 6c 69 74 65 33 50 61 67  esult sqlite3Pag
15640 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20  erClose().  .** 
15650 44 65 73 74 72 75 63 74 6f 72 73 20 61 72 65 20  Destructors are 
15660 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79 20 73  only called by s
15670 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
15680 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ()..*/.void sqli
15690 74 65 33 50 61 67 65 72 53 65 74 44 65 73 74 72  te3PagerSetDestr
156a0 75 63 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61  uctor(Pager *pPa
156b0 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73  ger, void (*xDes
156c0 63 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29  c)(DbPage*,int))
156d0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73  {.  pPager->xDes
156e0 74 72 75 63 74 6f 72 20 3d 20 78 44 65 73 63 3b  tructor = xDesc;
156f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
15700 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 20  e reinitializer 
15710 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
15720 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
15730 65 20 72 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a  e reinitializer.
15740 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20 77 68 65  ** is called whe
15750 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  n the content of
15760 20 61 20 70 61 67 65 20 69 6e 20 63 61 63 68 65   a page in cache
15770 20 69 73 20 72 65 73 74 6f 72 65 64 20 74 6f 20   is restored to 
15780 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  its original.** 
15790 76 61 6c 75 65 20 61 73 20 61 20 72 65 73 75 6c  value as a resul
157a0 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  t of a rollback.
157b0 20 20 54 68 65 20 63 61 6c 6c 62 61 63 6b 20 67    The callback g
157c0 69 76 65 73 20 68 69 67 68 65 72 2d 6c 65 76 65  ives higher-leve
157d0 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70  l code.** an opp
157e0 6f 72 74 75 6e 69 74 79 20 74 6f 20 72 65 73 74  ortunity to rest
157f0 6f 72 65 20 74 68 65 20 45 58 54 52 41 20 73 65  ore the EXTRA se
15800 63 74 69 6f 6e 20 74 6f 20 61 67 72 65 65 20 77  ction to agree w
15810 69 74 68 20 74 68 65 20 72 65 73 74 6f 72 65 64  ith the restored
15820 0a 2a 2a 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  .** page data..*
15830 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61  /.void sqlite3Pa
15840 67 65 72 53 65 74 52 65 69 6e 69 74 65 72 28 50  gerSetReiniter(P
15850 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
15860 69 64 20 28 2a 78 52 65 69 6e 69 74 29 28 44 62  id (*xReinit)(Db
15870 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  Page*,int)){.  p
15880 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
15890 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f   = xReinit;.}../
158a0 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 70 61 67  *.** Set the pag
158b0 65 20 73 69 7a 65 20 74 6f 20 2a 70 50 61 67 65  e size to *pPage
158c0 53 69 7a 65 2e 20 49 66 20 74 68 65 20 73 75 67  Size. If the sug
158d0 67 65 73 74 20 6e 65 77 20 70 61 67 65 20 73 69  gest new page si
158e0 7a 65 20 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f  ze is.** inappro
158f0 70 72 69 61 74 65 2c 20 74 68 65 6e 20 61 6e 20  priate, then an 
15900 61 6c 74 65 72 6e 61 74 69 76 65 20 70 61 67 65  alternative page
15910 20 73 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20   size is set to 
15920 74 68 61 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65  that.** value be
15930 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
15940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
15950 67 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50  gerSetPagesize(P
15960 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 75 31  ager *pPager, u1
15970 36 20 2a 70 50 61 67 65 53 69 7a 65 29 7b 0a 20  6 *pPageSize){. 
15980 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
15990 5f 4f 4b 3b 0a 20 20 75 31 36 20 70 61 67 65 53  _OK;.  u16 pageS
159a0 69 7a 65 20 3d 20 2a 70 50 61 67 65 53 69 7a 65  ize = *pPageSize
159b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65  ;.  assert( page
159c0 53 69 7a 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65  Size==0 || (page
159d0 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67  Size>=512 && pag
159e0 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41  eSize<=SQLITE_MA
159f0 58 5f 50 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a  X_PAGE_SIZE) );.
15a00 20 20 69 66 28 20 70 61 67 65 53 69 7a 65 20 26    if( pageSize &
15a10 26 20 70 61 67 65 53 69 7a 65 21 3d 70 50 61 67  & pageSize!=pPag
15a20 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 0a 20 20  er->pageSize .  
15a30 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d   && !pPager->mem
15a40 44 62 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52  Db && pPager->nR
15a50 65 66 3d 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20  ef==0 .  ){.    
15a60 63 68 61 72 20 2a 70 4e 65 77 20 3d 20 28 63 68  char *pNew = (ch
15a70 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c  ar *)sqlite3_mal
15a80 6c 6f 63 28 70 61 67 65 53 69 7a 65 29 3b 0a 20  loc(pageSize);. 
15a90 20 20 20 69 66 28 20 21 70 4e 65 77 20 29 7b 0a     if( !pNew ){.
15aa0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
15ab0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
15ac0 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 72 45  se{.      pagerE
15ad0 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
15ae0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
15af0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70  pPager);.      p
15b00 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
15b10 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20  = pageSize;.    
15b20 20 20 73 65 74 53 65 63 74 6f 72 53 69 7a 65 28    setSectorSize(
15b30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 73  pPager);.      s
15b40 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
15b50 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a  er->pTmpSpace);.
15b60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
15b70 6d 70 53 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a  mpSpace = pNew;.
15b80 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
15b90 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
15ba0 20 20 7d 0a 20 20 2a 70 50 61 67 65 53 69 7a 65    }.  *pPageSize
15bb0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
15bc0 69 7a 65 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ize;.  return rc
15bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
15be0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
15bf0 68 65 20 22 74 65 6d 70 6f 72 61 72 79 20 70 61  he "temporary pa
15c00 67 65 22 20 62 75 66 66 65 72 20 68 65 6c 64 20  ge" buffer held 
15c10 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79  internally.** by
15c20 20 74 68 65 20 70 61 67 65 72 2e 20 20 54 68 69   the pager.  Thi
15c30 73 20 69 73 20 61 20 62 75 66 66 65 72 20 74 68  s is a buffer th
15c40 61 74 20 69 73 20 62 69 67 20 65 6e 6f 75 67 68  at is big enough
15c50 20 74 6f 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20   to hold the.** 
15c60 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f  entire content o
15c70 66 20 61 20 64 61 74 61 62 61 73 65 20 70 61 67  f a database pag
15c80 65 2e 20 20 54 68 69 73 20 62 75 66 66 65 72 20  e.  This buffer 
15c90 69 73 20 75 73 65 64 20 69 6e 74 65 72 6e 61 6c  is used internal
15ca0 6c 79 0a 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c  ly.** during rol
15cb0 6c 62 61 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62  lback and will b
15cc0 65 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 68  e overwritten wh
15cd0 65 6e 65 76 65 72 20 61 20 72 6f 6c 6c 62 61 63  enever a rollbac
15ce0 6b 0a 2a 2a 20 6f 63 63 75 72 73 2e 20 20 42 75  k.** occurs.  Bu
15cf0 74 20 6f 74 68 65 72 20 6d 6f 64 75 6c 65 73 20  t other modules 
15d00 61 72 65 20 66 72 65 65 20 74 6f 20 75 73 65 20  are free to use 
15d10 69 74 20 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20  it too, as long 
15d20 61 73 0a 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63  as.** no rollbac
15d30 6b 73 20 61 72 65 20 68 61 70 70 65 6e 69 6e 67  ks are happening
15d40 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74  ..*/.void *sqlit
15d50 65 33 50 61 67 65 72 54 65 6d 70 53 70 61 63 65  e3PagerTempSpace
15d60 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
15d70 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
15d80 2d 3e 70 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a  ->pTmpSpace;.}..
15d90 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
15da0 20 73 65 74 20 74 68 65 20 6d 61 78 69 6d 75 6d   set the maximum
15db0 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63   database page c
15dc0 6f 75 6e 74 20 69 66 20 6d 78 50 61 67 65 20 69  ount if mxPage i
15dd0 73 20 70 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20  s positive. .** 
15de0 4d 61 6b 65 20 6e 6f 20 63 68 61 6e 67 65 73 20  Make no changes 
15df0 69 66 20 6d 78 50 61 67 65 20 69 73 20 7a 65 72  if mxPage is zer
15e00 6f 20 6f 72 20 6e 65 67 61 74 69 76 65 2e 20 20  o or negative.  
15e10 41 6e 64 20 6e 65 76 65 72 20 72 65 64 75 63 65  And never reduce
15e20 20 74 68 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20   the.** maximum 
15e30 70 61 67 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77  page count below
15e40 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a   the current siz
15e50 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
15e60 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c  e..**.** Regardl
15e70 65 73 73 20 6f 66 20 6d 78 50 61 67 65 2c 20 72  ess of mxPage, r
15e80 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e  eturn the curren
15e90 74 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63  t maximum page c
15ea0 6f 75 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ount..*/.int sql
15eb0 69 74 65 33 50 61 67 65 72 4d 61 78 50 61 67 65  ite3PagerMaxPage
15ec0 43 6f 75 6e 74 28 50 61 67 65 72 20 2a 70 50 61  Count(Pager *pPa
15ed0 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
15ee0 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 30  {.  if( mxPage>0
15ef0 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
15f00 6d 78 50 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b  mxPgno = mxPage;
15f10 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 50 61  .  }.  sqlite3Pa
15f20 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61  gerPagecount(pPa
15f30 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ger);.  return p
15f40 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d  Pager->mxPgno;.}
15f50 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
15f60 6f 77 69 6e 67 20 73 65 74 20 6f 66 20 72 6f 75  owing set of rou
15f70 74 69 6e 65 73 20 61 72 65 20 75 73 65 64 20 74  tines are used t
15f80 6f 20 64 69 73 61 62 6c 65 20 74 68 65 20 73 69  o disable the si
15f90 6d 75 6c 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65  mulated.** I/O e
15fa0 72 72 6f 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20  rror mechanism. 
15fb0 20 54 68 65 73 65 20 72 6f 75 74 69 6e 65 73 20   These routines 
15fc0 61 72 65 20 75 73 65 64 20 74 6f 20 61 76 6f 69  are used to avoi
15fd0 64 20 73 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65  d simulated.** e
15fe0 72 72 6f 72 73 20 69 6e 20 70 6c 61 63 65 73 20  rrors in places 
15ff0 77 68 65 72 65 20 77 65 20 64 6f 20 6e 6f 74 20  where we do not 
16000 63 61 72 65 20 61 62 6f 75 74 20 65 72 72 6f 72  care about error
16010 73 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20  s..**.** Unless 
16020 2d 44 53 51 4c 49 54 45 5f 54 45 53 54 3d 31 20  -DSQLITE_TEST=1 
16030 69 73 20 75 73 65 64 2c 20 74 68 65 73 65 20 72  is used, these r
16040 6f 75 74 69 6e 65 73 20 61 72 65 20 61 6c 6c 20  outines are all 
16050 6e 6f 2d 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65  no-ops.** and ge
16060 6e 65 72 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a  nerate no code..
16070 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
16080 5f 54 45 53 54 0a 65 78 74 65 72 6e 20 69 6e 74  _TEST.extern int
16090 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
160a0 72 5f 70 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72  r_pending;.exter
160b0 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f  n int sqlite3_io
160c0 5f 65 72 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74  _error_hit;.stat
160d0 69 63 20 69 6e 74 20 73 61 76 65 64 5f 63 6e 74  ic int saved_cnt
160e0 3b 0a 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 73  ;.void disable_s
160f0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
16100 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 61 76 65  rs(void){.  save
16110 64 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  d_cnt = sqlite3_
16120 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
16130 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  ;.  sqlite3_io_e
16140 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
16150 31 3b 0a 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65  1;.}.void enable
16160 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72  _simulated_io_er
16170 72 6f 72 73 28 76 6f 69 64 29 7b 0a 20 20 73 71  rors(void){.  sq
16180 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
16190 65 6e 64 69 6e 67 20 3d 20 73 61 76 65 64 5f 63  ending = saved_c
161a0 6e 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  nt;.}.#else.# de
161b0 66 69 6e 65 20 64 69 73 61 62 6c 65 5f 73 69 6d  fine disable_sim
161c0 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73  ulated_io_errors
161d0 28 29 0a 23 20 64 65 66 69 6e 65 20 65 6e 61 62  ().# define enab
161e0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
161f0 65 72 72 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a  errors().#endif.
16200 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
16210 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
16220 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
16230 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
16240 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
16250 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
16260 2e 20 0a 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f  . .**.** No erro
16270 72 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f  r checking is do
16280 6e 65 2e 20 54 68 65 20 72 61 74 69 6f 6e 61 6c  ne. The rational
16290 20 66 6f 72 20 74 68 69 73 20 69 73 20 74 68 61   for this is tha
162a0 74 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  t this function 
162b0 0a 2a 2a 20 6d 61 79 20 62 65 20 63 61 6c 6c 65  .** may be calle
162c0 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 66 69  d even if the fi
162d0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  le does not exis
162e0 74 20 6f 72 20 63 6f 6e 74 61 69 6e 20 61 20 68  t or contain a h
162f0 65 61 64 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68  eader. In .** th
16300 65 73 65 20 63 61 73 65 73 20 73 71 6c 69 74 65  ese cases sqlite
16310 33 4f 73 52 65 61 64 28 29 20 77 69 6c 6c 20 72  3OsRead() will r
16320 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20  eturn an error, 
16330 74 6f 20 77 68 69 63 68 20 74 68 65 20 63 6f 72  to which the cor
16340 72 65 63 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73  rect .** respons
16350 65 20 69 73 20 74 6f 20 7a 65 72 6f 20 74 68 65  e is to zero the
16360 20 6d 65 6d 6f 72 79 20 61 74 20 70 44 65 73 74   memory at pDest
16370 20 61 6e 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20   and continue.  
16380 41 20 72 65 61 6c 20 49 4f 20 65 72 72 6f 72 20  A real IO error 
16390 0a 2a 2a 20 77 69 6c 6c 20 70 72 65 73 75 6d 61  .** will presuma
163a0 62 6c 79 20 72 65 63 75 72 20 61 6e 64 20 62 65  bly recur and be
163b0 20 70 69 63 6b 65 64 20 75 70 20 6c 61 74 65 72   picked up later
163c0 20 28 54 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62   (Todo: Think ab
163d0 6f 75 74 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e  out this)..*/.in
163e0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
163f0 61 64 46 69 6c 65 68 65 61 64 65 72 28 50 61 67  adFileheader(Pag
16400 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
16410 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  N, unsigned char
16420 20 2a 70 44 65 73 74 29 7b 0a 20 20 69 6e 74 20   *pDest){.  int 
16430 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
16440 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
16450 30 2c 20 4e 29 3b 0a 20 20 61 73 73 65 72 74 28  0, N);.  assert(
16460 4d 45 4d 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66  MEMDB||pPager->f
16470 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
16480 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
16490 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 64    if( pPager->fd
164a0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
164b0 20 20 49 4f 54 52 41 43 45 28 28 22 44 42 48 44    IOTRACE(("DBHD
164c0 52 20 25 70 20 30 20 25 64 5c 6e 22 2c 20 70 50  R %p 0 %d\n", pP
164d0 61 67 65 72 2c 20 4e 29 29 0a 20 20 20 20 72 63  ager, N)).    rc
164e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
164f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  (pPager->fd, pDe
16500 73 74 2c 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69  st, N, 0);.    i
16510 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f  f( rc==SQLITE_IO
16520 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29  ERR_SHORT_READ )
16530 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
16540 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20  ITE_OK;.    }.  
16550 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16560 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
16570 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
16580 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
16590 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
165a0 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
165b0 67 65 72 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ger. .**.** If t
165c0 68 65 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  he PENDING_BYTE 
165d0 6c 69 65 73 20 6f 6e 20 74 68 65 20 70 61 67 65  lies on the page
165e0 20 64 69 72 65 63 74 6c 79 20 61 66 74 65 72 20   directly after 
165f0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a  the end of the.*
16600 2a 20 66 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e  * file, then con
16610 73 69 64 65 72 20 74 68 69 73 20 70 61 67 65 20  sider this page 
16620 70 61 72 74 20 6f 66 20 74 68 65 20 66 69 6c 65  part of the file
16630 20 74 6f 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c   too. For exampl
16640 65 2c 20 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47  e, if.** PENDING
16650 5f 42 59 54 45 20 69 73 20 62 79 74 65 20 34 30  _BYTE is byte 40
16660 39 36 20 28 74 68 65 20 66 69 72 73 74 20 62 79  96 (the first by
16670 74 65 20 6f 66 20 70 61 67 65 20 35 29 20 61 6e  te of page 5) an
16680 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
16690 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 34 30 39  e.** file is 409
166a0 36 20 62 79 74 65 73 2c 20 35 20 69 73 20 72 65  6 bytes, 5 is re
166b0 74 75 72 6e 65 64 20 69 6e 73 74 65 61 64 20 6f  turned instead o
166c0 66 20 34 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  f 4..*/.int sqli
166d0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
166e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
166f0 7b 0a 20 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20  {.  i64 n = 0;. 
16700 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
16710 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
16720 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
16730 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
16740 75 72 6e 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66  urn -1;.  }.  if
16750 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
16760 3e 3d 30 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70  >=0 ){.    n = p
16770 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
16780 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 61 73   } else {.    as
16790 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d  sert(pPager->fd-
167a0 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65  >pMethods||pPage
167b0 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
167c0 20 20 69 66 28 20 28 70 50 61 67 65 72 2d 3e 66    if( (pPager->f
167d0 64 2d 3e 70 4d 65 74 68 6f 64 73 29 0a 20 20 20  d->pMethods).   
167e0 20 20 26 26 20 28 72 63 20 3d 20 73 71 6c 69 74    && (rc = sqlit
167f0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61  e3OsFileSize(pPa
16800 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53  ger->fd, &n))!=S
16810 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16820 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b    pPager->nRef++
16830 3b 0a 20 20 20 20 20 20 70 61 67 65 72 5f 65 72  ;.      pager_er
16840 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
16850 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
16860 52 65 66 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74  Ref--;.      ret
16870 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
16880 20 20 69 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70    if( n>0 && n<p
16890 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
168a0 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a  ){.      n = 1;.
168b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
168c0 20 6e 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61   n /= pPager->pa
168d0 67 65 53 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20  geSize;.    }.  
168e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
168f0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
16900 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
16910 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
16920 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e     }.  }.  if( n
16930 3d 3d 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  ==(PENDING_BYTE/
16940 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
16950 29 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  ) ){.    n++;.  
16960 7d 0a 20 20 69 66 28 20 6e 3e 70 50 61 67 65 72  }.  if( n>pPager
16970 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
16980 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d  pPager->mxPgno =
16990 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
169a0 20 6e 3b 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20   n;.}...#ifndef 
169b0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
169c0 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  RYDB./*.** Clear
169d0 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
169e0 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
169f0 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
16a00 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
16a10 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  {.  sqlite3_free
16a20 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
16a30 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
16a40 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
16a50 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
16a60 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
16a70 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
16a80 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
16a90 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
16aa0 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
16ab0 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
16ac0 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
16ad0 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a  l(Pager*);../*.*
16ae0 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
16af0 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69 6e  m its hash chain
16b00 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65 20 70  . Also set the p
16b10 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 30 20  age number to 0 
16b20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74  to indicate.** t
16b30 68 61 74 20 74 68 65 20 70 61 67 65 20 69 73 20  hat the page is 
16b40 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e 79 20  not part of any 
16b50 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68 69 73  hash chain. This
16b60 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65 63   is required bec
16b70 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ause the.** sqli
16b80 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61 67 65  te3PagerMovepage
16b90 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c  () routine can l
16ba0 65 61 76 65 20 61 20 70 61 67 65 20 69 6e 20 74  eave a page in t
16bb0 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65  he .** pNextFree
16bc0 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73 74 20  /pPrevFree list 
16bd0 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20 70 61  that is not a pa
16be0 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 2d 63  rt of any hash-c
16bf0 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  hain..*/.static 
16c00 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43  void unlinkHashC
16c10 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67  hain(Pager *pPag
16c20 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  er, PgHdr *pPg){
16c30 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f  .  if( pPg->pgno
16c40 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
16c50 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
16c60 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
16c70 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
16c80 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
16c90 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
16ca0 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
16cb0 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
16cc0 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
16cd0 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
16ce0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
16cf0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
16d00 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e  ger->aHash[pPg->
16d10 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e  pgno & (pPager->
16d20 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67 20 29  nHash-1)]!=pPg )
16d30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76  ;.    pPg->pPrev
16d40 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73 68 20  Hash->pNextHash 
16d50 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
16d60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
16d70 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  nt h = pPg->pgno
16d80 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
16d90 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67 65 72  h-1);.    pPager
16da0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
16db0 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
16dc0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
16dd0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
16de0 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
16df0 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20  Pg, pPager));.  
16e00 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  }.  pPg->pgno = 
16e10 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  0;.  pPg->pNextH
16e20 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ash = pPg->pPrev
16e30 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Hash = 0;.}../*.
16e40 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65  ** Unlink a page
16e50 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c   from the free l
16e60 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f 66  ist (the list of
16e70 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72 65   all pages where
16e80 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64   nRef==0).** and
16e90 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20 63   from its hash c
16ea0 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a  ollision chain..
16eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75  */.static void u
16ec0 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72 20  nlinkPage(PgHdr 
16ed0 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  *pPg){.  Pager *
16ee0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
16ef0 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ager;..  /* Unli
16f00 6e 6b 20 66 72 6f 6d 20 66 72 65 65 20 70 61 67  nk from free pag
16f10 65 20 6c 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c  e list */.  lruL
16f20 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a  istRemove(pPg);.
16f30 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
16f40 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
16f50 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
16f60 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
16f70 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r, pPg);.}../*.*
16f80 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
16f90 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
16fa0 74 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65  te the cache whe
16fb0 6e 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  n a database.** 
16fc0 69 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44  is truncated.  D
16fd0 72 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63  rop from the cac
16fe0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f  he all pages who
16ff0 73 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61  se pgno is.** la
17000 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
17010 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
17020 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
17030 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70  .** Referenced p
17040 61 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e  ages larger than
17050 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
17060 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a  are zeroed..**.*
17070 2a 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74  * Actually, at t
17080 68 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f  he point this ro
17090 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
170a0 20 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20   it would be.** 
170b0 61 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65  an error to have
170c0 20 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61   a referenced pa
170d0 67 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20  ge.  But rather 
170e0 74 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74  than delete.** t
170f0 68 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61  hat page and gua
17100 72 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75  rantee a subsequ
17110 65 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74  ent segfault, it
17120 20 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a   seems better.**
17130 20 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20   to zero it and 
17140 68 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72  hope that we err
17150 6f 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a  or out sanely..*
17160 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
17170 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
17180 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
17190 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
171a0 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
171b0 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
171c0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
171d0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4d  #ifndef SQLITE_M
171e0 55 54 45 58 5f 4e 4f 4f 50 0a 20 20 73 71 6c 69  UTEX_NOOP.  sqli
171f0 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78  te3_mutex *mutex
17200 3b 0a 20 20 6d 75 74 65 78 20 3d 20 73 71 6c 69  ;.  mutex = sqli
17210 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28  te3_mutex_alloc(
17220 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41  SQLITE_MUTEX_STA
17230 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65 6e 64 69  TIC_MEM2);.#endi
17240 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  f.  sqlite3_mute
17250 78 5f 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a  x_enter(mutex);.
17260 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
17270 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
17280 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
17290 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
172a0 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
172b0 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
172c0 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
172d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
172e0 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
172f0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
17300 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
17310 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17320 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
17330 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
17340 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
17350 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
17360 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49  NextAll;.      I
17370 4f 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20  OTRACE(("PGFREE 
17380 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
17390 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20  , pPg->pgno));. 
173a0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
173b0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67  sqlite3_pager_pg
173c0 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  free_count);.   
173d0 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
173e0 67 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c  g);.      makeCl
173f0 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ean(pPg);.      
17400 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
17410 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  ->pData);.      
17420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67  sqlite3_free(pPg
17430 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  );.      pPager-
17440 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a  >nPage--;.    }.
17450 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75    }.  sqlite3_mu
17460 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
17470 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
17480 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20  o obtain a lock 
17490 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f  on a file.  Invo
174a0 6b 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c  ke the busy call
174b0 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b  back if the lock
174c0 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79  .** is currently
174d0 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20   not available. 
174e0 20 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68   Repeat until th
174f0 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
17500 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
17510 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
17520 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
17530 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
17540 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
17550 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
17560 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
17570 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
17580 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
17590 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
175a0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
175b0 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
175c0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
175d0 20 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c   The OS lock val
175e0 75 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20  ues must be the 
175f0 73 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65  same as the Page
17600 72 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f  r lock values */
17610 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
17620 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
17630 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
17640 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
17650 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
17660 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
17670 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
17680 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
17690 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c  .  /* If the fil
176a0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75  e is currently u
176b0 6e 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65  nlocked then the
176c0 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e   size must be un
176d0 6b 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72  known */.  asser
176e0 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
176f0 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
17700 7c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  | pPager->dbSize
17710 3c 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a  <0 || MEMDB );..
17720 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17730 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
17740 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
17750 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
17760 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 42    if( pPager->pB
17770 75 73 79 48 61 6e 64 6c 65 72 20 29 20 70 50 61  usyHandler ) pPa
17780 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
17790 72 2d 3e 6e 42 75 73 79 20 3d 20 30 3b 0a 20 20  r->nBusy = 0;.  
177a0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
177b0 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
177c0 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
177d0 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
177e0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
177f0 53 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76  SY && sqlite3Inv
17800 6f 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70  okeBusyHandler(p
17810 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
17820 6c 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ler) );.    if( 
17830 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
17840 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
17850 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
17860 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
17870 22 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20  "LOCK %p %d\n", 
17880 70 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65  pPager, locktype
17890 29 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  )).    }.  }.  r
178a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
178b0 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  ** Truncate the 
178c0 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62  file to the numb
178d0 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63  er of pages spec
178e0 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ified..*/.int sq
178f0 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
17900 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
17910 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20  , Pgno nPage){. 
17920 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
17930 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
17940 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c  >=PAGER_SHARED |
17950 7c 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c  | MEMDB );.  sql
17960 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
17970 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  nt(pPager);.  if
17980 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  ( pPager->errCod
17990 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50  e ){.    rc = pP
179a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
179b0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
179c0 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
179d0 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
179e0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
179f0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
17a00 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
17a10 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
17a20 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
17a30 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61      pager_trunca
17a40 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  te_cache(pPager)
17a50 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17a60 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61  ITE_OK;.  }.  pa
17a70 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
17a80 3b 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75  ;.  rc = syncJou
17a90 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
17aa0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
17ab0 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
17ac0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
17ad0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
17ae0 20 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75   /* Get an exclu
17af0 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  sive lock on the
17b00 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
17b10 20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a   truncating. */.
17b20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
17b30 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
17b40 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
17b50 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
17b60 45 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72  E_LOCK);.  pager
17b70 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
17b80 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
17b90 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  OK ){.    return
17ba0 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d   rc;.  }..  rc =
17bb0 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
17bc0 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
17bd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17be0 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
17bf0 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
17c00 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
17c10 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
17c20 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
17c30 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
17c40 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
17c50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
17c60 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
17c70 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
17c80 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
17c90 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
17ca0 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
17cb0 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
17cc0 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
17cd0 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
17ce0 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
17cf0 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
17d00 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
17d10 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
17d20 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
17d30 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
17d40 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
17d50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
17d60 74 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63  tion always succ
17d70 65 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73  eeds. If a trans
17d80 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
17d90 20 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69   an attempt.** i
17da0 73 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69  s made to roll i
17db0 74 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72  t back. If an er
17dc0 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e  ror occurs durin
17dd0 67 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a  g the rollback .
17de0 2a 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** a hot journal
17df0 20 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20   may be left in 
17e00 74 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62  the filesystem b
17e10 75 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72  ut no error is r
17e20 65 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68  eturned.** to th
17e30 65 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74  e caller..*/.int
17e40 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f   sqlite3PagerClo
17e50 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  se(Pager *pPager
17e60 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ){.#ifdef SQLITE
17e70 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d  _ENABLE_MEMORY_M
17e80 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20  ANAGEMENT.  if( 
17e90 21 4d 45 4d 44 42 20 29 7b 0a 23 69 66 6e 64 65  !MEMDB ){.#ifnde
17ea0 66 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e  f SQLITE_MUTEX_N
17eb0 4f 4f 50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  OOP.    sqlite3_
17ec0 6d 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73  mutex *mutex = s
17ed0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
17ee0 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
17ef0 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
17f00 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33  ndif.    sqlite3
17f10 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
17f20 65 78 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  ex);.    if( pPa
17f30 67 65 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ger->pPrev ){.  
17f40 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65      pPager->pPre
17f50 76 2d 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65  v->pNext = pPage
17f60 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65  r->pNext;.    }e
17f70 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
17f80 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50  e3PagerList = pP
17f90 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20  ager->pNext;.   
17fa0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
17fb0 72 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20  r->pNext ){.    
17fc0 20 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d    pPager->pNext-
17fd0 3e 70 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d  >pPrev = pPager-
17fe0 3e 70 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20  >pPrev;.    }.  
17ff0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
18000 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
18010 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61  }.#endif..  disa
18020 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
18030 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 73 71 6c  _errors();.  sql
18040 69 74 65 33 46 61 75 6c 74 42 65 67 69 6e 42 65  ite3FaultBeginBe
18050 6e 69 67 6e 28 2d 31 29 3b 0a 20 20 70 50 61 67  nign(-1);.  pPag
18060 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b  er->errCode = 0;
18070 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  .  pPager->exclu
18080 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20  siveMode = 0;.  
18090 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
180a0 65 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f  er);.  pagerUnlo
180b0 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50  ckAndRollback(pP
180c0 61 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f  ager);.  enable_
180d0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
180e0 6f 72 73 28 29 3b 0a 20 20 73 71 6c 69 74 65 33  ors();.  sqlite3
180f0 46 61 75 6c 74 45 6e 64 42 65 6e 69 67 6e 28 2d  FaultEndBenign(-
18100 31 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  1);.  PAGERTRACE
18110 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22 2c 20  2("CLOSE %d\n", 
18120 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
18130 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c  ;.  IOTRACE(("CL
18140 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61 67 65  OSE %p\n", pPage
18150 72 29 29 0a 20 20 69 66 28 20 70 50 61 67 65 72  r)).  if( pPager
18160 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
18170 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
18180 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ose(pPager->jfd)
18190 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 42  ;.  }.  sqlite3B
181a0 69 74 76 65 63 44 65 73 74 72 6f 79 28 70 50 61  itvecDestroy(pPa
181b0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29  ger->pInJournal)
181c0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
181d0 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20  stmtOpen ){.    
181e0 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70  sqlite3OsClose(p
181f0 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20  Pager->stfd);.  
18200 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f  }.  sqlite3OsClo
18210 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  se(pPager->fd);.
18220 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
18230 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
18240 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
18250 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
18260 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
18270 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
18280 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
18290 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
182a0 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74   }.  */..  sqlit
182b0 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
182c0 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65  aHash);.  sqlite
182d0 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70  3_free(pPager->p
182e0 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73 71 6c  TmpSpace);.  sql
182f0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
18300 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
18310 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20 21 64  TE_OK;.}..#if !d
18320 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29 20 7c  efined(NDEBUG) |
18330 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  | defined(SQLITE
18340 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74  _TEST)./*.** Ret
18350 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
18360 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
18370 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
18380 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61 67 65  Pgno sqlite3Page
18390 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62 50 61  rPagenumber(DbPa
183a0 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e  ge *p){.  return
183b0 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65 6e 64   p->pgno;.}.#end
183c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61  if../*.** The pa
183d0 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f  ge_ref() functio
183e0 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65  n increments the
183f0 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
18400 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20   for a page..** 
18410 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63  If the page is c
18420 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
18430 66 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65  freelist (the re
18440 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
18450 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72   zero) then.** r
18460 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
18470 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a  e freelist..**.*
18480 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73  * For non-test s
18490 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
184a0 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68  () is a macro th
184b0 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72  at calls _page_r
184c0 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f  ef().** online o
184d0 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  f the reference 
184e0 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20  count is zero.  
184f0 46 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73  For test systems
18500 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20  , page_ref().** 
18510 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69  is a real functi
18520 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61  on so that we ca
18530 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74  n set breakpoint
18540 73 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a  s and trace it..
18550 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f  */.static void _
18560 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
18570 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
18580 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
18590 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63  /* The page is c
185a0 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20  urrently on the 
185b0 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76  freelist.  Remov
185c0 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c 72 75  e it. */.    lru
185d0 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67 29 3b  ListRemove(pPg);
185e0 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
185f0 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
18600 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d 0a 23  pPg->nRef++;.}.#
18610 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
18620 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
18630 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
18640 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
18650 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
18660 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
18670 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
18680 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
18690 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  +;.    }.  }.#el
186a0 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
186b0 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
186c0 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
186d0 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
186e0 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
186f0 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
18700 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
18710 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
18720 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
18730 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
18740 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
18750 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
18760 6c 69 74 65 33 50 61 67 65 72 52 65 66 28 44 62  lite3PagerRef(Db
18770 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 70 61  Page *pPg){.  pa
18780 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
18790 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f 72 65  ager);.  page_re
187a0 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65 72 4c  f(pPg);.  pagerL
187b0 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67 65 72  eave(pPg->pPager
187c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
187d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
187e0 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
187f0 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
18800 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
18810 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
18820 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
18830 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
18840 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
18850 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
18860 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
18870 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
18880 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
18890 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
188a0 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
188b0 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
188c0 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
188d0 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
188e0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
188f0 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
18900 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
18910 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
18920 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
18930 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
18940 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
18950 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
18960 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
18970 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
18980 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
18990 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
189a0 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
189b0 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
189c0 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
189d0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
189e0 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
189f0 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
18a00 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
18a10 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
18a20 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
18a30 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
18a40 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
18a50 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
18a60 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
18a70 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
18a80 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
18a90 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
18aa0 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
18ab0 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
18ac0 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
18ad0 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
18ae0 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
18af0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
18b00 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
18b10 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
18b20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
18b30 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
18b40 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
18b50 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
18b60 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63 63 75   so no sync occu
18b70 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  rs..**.** If the
18b80 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41   IOCAP_SEQUENTIA
18b90 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20 66 6f  L flag is set fo
18ba0 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  r the persistent
18bb0 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63 68 0a   media on which.
18bc0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
18bd0 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65 6e 20  is stored, then 
18be0 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
18bf0 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  r called on the 
18c00 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
18c10 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c   In this case al
18c20 6c 20 74 68 61 74 20 69 73 20 72 65 71 75 69 72  l that is requir
18c30 65 64 20 69 73 20 74 6f 20 75 70 64 61 74 65 20  ed is to update 
18c40 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
18c50 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n.** the journal
18c60 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 54   header..**.** T
18c70 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61  his routine clea
18c80 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20  rs the needSync 
18c90 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70  field of every p
18ca0 61 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64  age current held
18cb0 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a   in.** memory..*
18cc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
18cd0 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  cJournal(Pager *
18ce0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
18cf0 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
18d00 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 0a 20  = SQLITE_OK;... 
18d10 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75   /* Sync the jou
18d20 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69  rnal before modi
18d30 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64  fying the main d
18d40 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73  atabase.  ** (as
18d50 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20  suming there is 
18d60 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74  a journal and it
18d70 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e   needs to be syn
18d80 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28  ced.).  */.  if(
18d90 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
18da0 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50  c ){.    if( !pP
18db0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
18dc0 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44 63 20  {.      int iDc 
18dd0 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63  = sqlite3OsDevic
18de0 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73  eCharacteristics
18df0 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
18e00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18e10 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18e20 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 30 3d  );..      if( 0=
18e30 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
18e40 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20  AP_SAFE_APPEND) 
18e50 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72  ){.        /* Wr
18e60 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c  ite the nRec val
18e70 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  ue into the jour
18e80 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e  nal file header.
18e90 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a   If in.        *
18ea0 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f  * full-synchrono
18eb0 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68  us mode, sync th
18ec0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e  e journal first.
18ed0 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68   This ensures th
18ee0 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c  at.        ** al
18ef0 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c  l data has reall
18f00 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62  y hit the disk b
18f10 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70  efore nRec is up
18f20 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20  dated to mark.  
18f30 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61        ** it as a
18f40 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72   candidate for r
18f50 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ollback..       
18f60 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54   **.        ** T
18f70 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69  his is not requi
18f80 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69  red if the persi
18f90 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70  stent media supp
18fa0 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20  orts the.       
18fb0 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20   ** SAFE_APPEND 
18fc0 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73  property. Becaus
18fd0 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69  e in this case i
18fe0 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  t is not possibl
18ff0 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f  e .        ** fo
19000 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  r garbage data t
19010 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f  o be appended to
19020 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e   the file, the n
19030 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20  Rec field.      
19040 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65    ** is populate
19050 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46  d with 0xFFFFFFF
19060 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  F when the journ
19070 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69  al header is wri
19080 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20  tten.        ** 
19090 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20  and never needs 
190a0 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20  to be updated.. 
190b0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
190c0 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20    i64 jrnlOff;. 
190d0 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
190e0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30  r->fullSync && 0
190f0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
19100 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
19110 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  ){.          PAG
19120 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a  ERTRACE2("SYNC j
19130 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c  ournal of %d\n",
19140 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19150 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54  );.          IOT
19160 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c  RACE(("JSYNC %p\
19170 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20  n", pPager)).   
19180 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
19190 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72  te3OsSync(pPager
191a0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  ->jfd, pPager->s
191b0 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
191c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
191d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
191e0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
191f0 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  jrnlOff = pPager
19200 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
19210 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
19220 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f  gic);.        IO
19230 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20  TRACE(("JHDR %p 
19240 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67  %lld %d\n", pPag
19250 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29  er, jrnlOff, 4))
19260 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77  ;.        rc = w
19270 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
19280 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
19290 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a   pPager->nRec);.
192a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
192b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
192c0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
192d0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
192e0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
192f0 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
19300 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
19310 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
19320 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
19330 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
19340 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70  ("JSYNC %p\n", p
19350 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20  Pager)).        
19360 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
19370 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  nc(pPager->jfd, 
19380 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
19390 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28  gs| .          (
193a0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
193b0 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f  gs==SQLITE_SYNC_
193c0 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43  FULL?SQLITE_SYNC
193d0 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20  _DATAONLY:0).   
193e0 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20       );.        
193f0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
19400 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
19410 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
19420 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
19430 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
19440 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
19450 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
19460 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
19470 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
19480 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
19490 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
194a0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
194b0 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
194c0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
194d0 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c  = 0;.    }.    l
194e0 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79  ruListSetFirstSy
194f0 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20  nced(pPager);.  
19500 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
19510 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
19520 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
19530 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
19540 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
19550 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
19560 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
19570 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
19580 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
19590 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
195a0 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
195b0 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
195c0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
195d0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
195e0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
195f0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
19600 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
19610 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19620 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
19630 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c  ynced==pPager->l
19640 72 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  ru.pFirst );.  }
19650 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
19660 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  n rc;.}../*.** M
19670 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f  erge two lists o
19680 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65  f pages connecte
19690 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20  d by pDirty and 
196a0 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a  in pgno order..*
196b0 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69  * Do not both fi
196c0 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69  xing the pPrevDi
196d0 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f  rty pointers..*/
196e0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d  .static PgHdr *m
196f0 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67  erge_pagelist(Pg
19700 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a  Hdr *pA, PgHdr *
19710 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73  pB){.  PgHdr res
19720 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70  ult, *pTail;.  p
19730 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a  Tail = &result;.
19740 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70    while( pA && p
19750 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d  B ){.    if( pA-
19760 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29  >pgno<pB->pgno )
19770 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70  {.      pTail->p
19780 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20  Dirty = pA;.    
19790 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20    pTail = pA;.  
197a0 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69      pA = pA->pDi
197b0 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  rty;.    }else{.
197c0 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69        pTail->pDi
197d0 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20  rty = pB;.      
197e0 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20  pTail = pB;.    
197f0 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74    pB = pB->pDirt
19800 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  y;.    }.  }.  i
19810 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61  f( pA ){.    pTa
19820 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b  il->pDirty = pA;
19830 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20  .  }else if( pB 
19840 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  ){.    pTail->pD
19850 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c  irty = pB;.  }el
19860 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70  se{.    pTail->p
19870 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20  Dirty = 0;.  }. 
19880 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70   return result.p
19890 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Dirty;.}../*.** 
198a0 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66  Sort the list of
198b0 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64   pages in accend
198c0 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e  ing order by pgn
198d0 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a  o.  Pages are.**
198e0 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44   connected by pD
198f0 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20  irty pointers.  
19900 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70  The pPrevDirty p
19910 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63  ointers are.** c
19920 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73  orrupted by this
19930 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e   sort..*/.#defin
19940 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f  e N_SORT_BUCKET_
19950 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65  ALLOC 25.#define
19960 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20   N_SORT_BUCKET  
19970 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53       25.#ifdef S
19980 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74  QLITE_TEST.  int
19990 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e   sqlite3_pager_n
199a0 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30  _sort_bucket = 0
199b0 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52  ;.  #undef N_SOR
199c0 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69  T_BUCKET.  #defi
199d0 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
199e0 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70   \.   (sqlite3_p
199f0 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b  ager_n_sort_buck
19a00 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72  et?sqlite3_pager
19a10 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e  _n_sort_bucket:N
19a20 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
19a30 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  OC).#endif.stati
19a40 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61  c PgHdr *sort_pa
19a50 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49  gelist(PgHdr *pI
19a60 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e  n){.  PgHdr *a[N
19a70 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c  _SORT_BUCKET_ALL
19a80 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69  OC], *p;.  int i
19a90 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c  ;.  memset(a, 0,
19aa0 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77   sizeof(a));.  w
19ab0 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20  hile( pIn ){.   
19ac0 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49   p = pIn;.    pI
19ad0 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20  n = p->pDirty;. 
19ae0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30     p->pDirty = 0
19af0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
19b00 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31  <N_SORT_BUCKET-1
19b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
19b20 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20  ( a[i]==0 ){.   
19b30 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20       a[i] = p;. 
19b40 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
19b50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
19b60 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67     p = merge_pag
19b70 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a  elist(a[i], p);.
19b80 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30          a[i] = 0
19b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19ba0 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52      if( i==N_SOR
19bb0 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20  T_BUCKET-1 ){.  
19bc0 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a      /* Coverage:
19bd0 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68   To get here, th
19be0 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32  ere need to be 2
19bf0 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29  ^(N_SORT_BUCKET)
19c00 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65   .      ** eleme
19c10 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74  nts in the input
19c20 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70   list. This is p
19c30 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70  ossible, but imp
19c40 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20  ractical..      
19c50 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20  ** Testing this 
19c60 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e  line is the poin
19c70 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69  t of global vari
19c80 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71  able.      ** sq
19c90 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f  lite3_pager_n_so
19ca0 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20  rt_bucket..     
19cb0 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d   */.      a[i] =
19cc0 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28   merge_pagelist(
19cd0 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a  a[i], p);.    }.
19ce0 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a    }.  p = a[0];.
19cf0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53    for(i=1; i<N_S
19d00 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29  ORT_BUCKET; i++)
19d10 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f  {.    p = merge_
19d20 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d  pagelist(p, a[i]
19d30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19d40 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  p;.}../*.** Give
19d50 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65  n a list of page
19d60 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20  s (connected by 
19d70 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79  the PgHdr.pDirty
19d80 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a   pointer) write.
19d90 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20  ** every one of 
19da0 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20  those pages out 
19db0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19dc0 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68  file and mark th
19dd0 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65  em all.** as cle
19de0 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  an..*/.static in
19df0 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  t pager_write_pa
19e00 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c  gelist(PgHdr *pL
19e10 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  ist){.  Pager *p
19e20 50 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20 2a  Pager;.  PgHdr *
19e30 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  p;.  int rc;..  
19e40 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
19e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
19e60 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
19e70 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
19e80 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
19e90 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
19ea0 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
19eb0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
19ec0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
19ed0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
19ee0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
19ef0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
19f00 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
19f10 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
19f20 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
19f30 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
19f40 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
19f50 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
19f60 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
19f70 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
19f80 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
19f90 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
19fa0 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
19fb0 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
19fc0 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
19fd0 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
19fe0 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
19ff0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
1a000 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
1a010 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
1a020 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
1a030 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
1a040 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
1a050 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
1a060 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
1a070 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
1a080 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
1a090 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
1a0a0 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
1a0b0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
1a0c0 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
1a0d0 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
1a0e0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
1a0f0 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
1a100 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
1a110 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
1a120 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
1a130 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
1a140 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
1a150 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a160 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
1a170 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
1a180 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
1a190 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a1a0 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
1a1b0 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
1a1c0 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
1a1d0 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
1a1e0 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
1a1f0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
1a200 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
1a210 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
1a220 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1a240 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70  urn rc;.  }..  p
1a250 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65  List = sort_page
1a260 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 66  list(pList);.  f
1a270 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70  or(p=pList; p; p
1a280 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20  =p->pDirty){.   
1a290 20 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72 74   assert( p->dirt
1a2a0 79 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74  y );.    p->dirt
1a2b0 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69  y = 0;.  }.  whi
1a2c0 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20  le( pList ){..  
1a2d0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
1a2e0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
1a2f0 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69  n opened, open i
1a300 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66  t now. */.    if
1a310 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1a320 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20  Methods ){.     
1a330 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1a340 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20  tempFile);.     
1a350 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1a360 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
1a370 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
1a380 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  >fd, pPager->zFi
1a390 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  lename,.        
1a3a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a3b0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1a3c0 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20  vfsFlags);.     
1a3d0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
1a3e0 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
1a3f0 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
1a400 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
1a410 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
1a420 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
1a430 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
1a440 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
1a450 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
1a460 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
1a470 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74  e() was called t
1a480 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68  o.    ** make th
1a490 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28  e file smaller (
1a4a0 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75  presumably by au
1a4b0 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e  to-vacuum code).
1a4c0 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20   Do not write.  
1a4d0 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61    ** any such pa
1a4e0 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ges to the file.
1a4f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a500 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61  pList->pgno<=pPa
1a510 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
1a520 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20       i64 offset 
1a530 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  = (pList->pgno-1
1a540 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
1a550 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63  ageSize;.      c
1a560 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44  har *pData = COD
1a570 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44  EC2(pPager, PGHD
1a580 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29  R_TO_DATA(pList)
1a590 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36  , pList->pgno, 6
1a5a0 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  );.      PAGERTR
1a5b0 41 43 45 34 28 22 53 54 4f 52 45 20 25 64 20 70  ACE4("STORE %d p
1a5c0 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78  age %d hash(%08x
1a5d0 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
1a5e0 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1a5f0 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
1a600 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67  >pgno, pager_pag
1a610 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20  ehash(pList));. 
1a620 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50       IOTRACE(("P
1a630 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70  GOUT %p %d\n", p
1a640 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67  Pager, pList->pg
1a650 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  no));.      rc =
1a660 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
1a670 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74  pPager->fd, pDat
1a680 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
1a690 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
1a6a0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1a6b0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69  qlite3_pager_wri
1a6c0 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20  tedb_count);.   
1a6d0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1a6e0 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20  ager->nWrite);. 
1a6f0 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e       if( pList->
1a700 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20  pgno==1 ){.     
1a710 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65     memcpy(&pPage
1a720 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26  r->dbFileVers, &
1a730 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f  pData[24], sizeo
1a740 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  f(pPager->dbFile
1a750 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a  Vers));.      }.
1a760 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
1a770 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
1a780 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
1a790 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67  ("NOSTORE %d pag
1a7a0 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  e %d\n", PAGERID
1a7b0 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d  (pPager), pList-
1a7c0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65  >pgno);.    }.#e
1a7d0 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20  ndif.    if( rc 
1a7e0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66  ) return rc;.#if
1a7f0 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
1a800 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74  _PAGES.    pList
1a810 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
1a820 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73  er_pagehash(pLis
1a830 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70  t);.#endif.    p
1a840 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44  List = pList->pD
1a850 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75  irty;.  }.  retu
1a860 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1a870 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65  ./*.** Collect e
1a880 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20  very dirty page 
1a890 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73  into a dirty lis
1a8a0 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20  t and.** return 
1a8b0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1a8c0 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69   head of that li
1a8d0 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61  st.  All pages a
1a8e0 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20  re.** collected 
1a8f0 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65  even if they are
1a900 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a   still in use..*
1a910 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
1a920 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69  pager_get_all_di
1a930 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20  rty_pages(Pager 
1a940 2a 70 50 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64  *pPager){..#ifnd
1a950 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56  ef NDEBUG.  /* V
1a960 65 72 69 66 79 20 74 68 65 20 73 61 6e 69 74 79  erify the sanity
1a970 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 6c 69   of the dirty li
1a980 73 74 20 77 68 65 6e 20 77 65 20 61 72 65 20 72  st when we are r
1a990 75 6e 6e 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64  unning.  ** in d
1a9a0 65 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20  ebugging mode.  
1a9b0 54 68 69 73 20 69 73 20 65 78 70 65 6e 73 69 76  This is expensiv
1a9c0 65 2c 20 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a  e, so do not.  *
1a9d0 2a 20 64 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e  * do this on a n
1a9e0 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a  ormal build. */.
1a9f0 20 20 69 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20    int n1 = 0;.  
1aa00 69 6e 74 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67  int n2 = 0;.  Pg
1aa10 48 64 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d  Hdr *p;.  for(p=
1aa20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b  pPager->pAll; p;
1aa30 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b   p=p->pNextAll){
1aa40 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 20   if( p->dirty ) 
1aa50 6e 31 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d  n1++; }.  for(p=
1aa60 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 20  pPager->pDirty; 
1aa70 70 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b  p; p=p->pDirty){
1aa80 20 6e 32 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72   n2++; }.  asser
1aa90 74 28 20 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e  t( n1==n2 );.#en
1aaa0 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50  dif..  return pP
1aab0 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a  ager->pDirty;.}.
1aac0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  ./*.** Return 1 
1aad0 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f  if there is a ho
1aae0 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65  t journal on the
1aaf0 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
1ab00 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69   A hot journal i
1ab10 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73  s one that needs
1ab20 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
1ab30 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
1ab40 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66   current size of
1ab50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ab60 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f  le is 0 but a jo
1ab70 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78  urnal file.** ex
1ab80 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72  ists, that is pr
1ab90 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f  obably an old jo
1aba0 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20  urnal left over 
1abb0 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20  from a prior.** 
1abc0 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68  database with th
1abd0 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75  e same name.  Ju
1abe0 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  st delete the jo
1abf0 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  urnal..**.** Ret
1ac00 75 72 6e 20 6e 65 67 61 74 69 76 65 20 69 66 20  urn negative if 
1ac10 75 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72 6d  unable to determ
1ac20 69 6e 65 20 74 68 65 20 73 74 61 74 75 73 20 6f  ine the status o
1ac30 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
1ac40 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1ac50 65 20 64 6f 65 73 20 6e 6f 74 20 6f 70 65 6e 20  e does not open 
1ac60 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1ac70 20 74 6f 20 65 78 61 6d 69 6e 65 20 69 74 73 0a   to examine its.
1ac80 2a 2a 20 63 6f 6e 74 65 6e 74 2e 20 20 48 65 6e  ** content.  Hen
1ac90 63 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ce, the journal 
1aca0 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 74 68  might contain th
1acb0 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74  e name of a mast
1acc0 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  er.** journal fi
1acd0 6c 65 20 74 68 61 74 20 68 61 73 20 62 65 65 6e  le that has been
1ace0 20 64 65 6c 65 74 65 64 2c 20 61 6e 64 20 68 65   deleted, and he
1acf0 6e 63 65 20 6e 6f 74 20 62 65 20 68 6f 74 2e 20  nce not be hot. 
1ad00 20 4f 72 0a 2a 2a 20 74 68 65 20 68 65 61 64 65   Or.** the heade
1ad10 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
1ad20 20 6d 69 67 68 74 20 62 65 20 7a 65 72 6f 65 64   might be zeroed
1ad30 20 6f 75 74 2e 20 20 54 68 69 73 20 72 6f 75 74   out.  This rout
1ad40 69 6e 65 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  ine.** does not 
1ad50 64 69 73 63 6f 76 65 72 20 74 68 65 73 65 20 63  discover these c
1ad60 61 73 65 73 20 6f 66 20 61 20 6e 6f 6e 2d 68 6f  ases of a non-ho
1ad70 74 20 6a 6f 75 72 6e 61 6c 20 2d 20 69 66 20 74  t journal - if t
1ad80 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
1ad90 6c 65 20 65 78 69 73 74 73 20 61 6e 64 20 69 73  le exists and is
1ada0 20 6e 6f 74 20 65 6d 70 74 79 20 74 68 69 73 20   not empty this 
1adb0 72 6f 75 74 69 6e 65 20 61 73 73 75 6d 65 73 20  routine assumes 
1adc0 69 74 0a 2a 2a 20 69 73 20 68 6f 74 2e 20 20 54  it.** is hot.  T
1add0 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
1ade0 6b 28 29 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  k() routine will
1adf0 20 64 69 73 63 6f 76 65 72 20 74 68 61 74 20 74   discover that t
1ae00 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
1ae10 6c 65 20 69 73 20 6e 6f 74 20 72 65 61 6c 6c 79  le is not really
1ae20 20 68 6f 74 20 61 6e 64 20 77 69 6c 6c 20 6e 6f   hot and will no
1ae30 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  -op..*/.static i
1ae40 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c  nt hasHotJournal
1ae50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1ae60 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
1ae70 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70  pVfs = pPager->p
1ae80 56 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Vfs;.  int rc;. 
1ae90 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75 73   if( !pPager->us
1aea0 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75 72  eJournal ) retur
1aeb0 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61 67  n 0;.  if( !pPag
1aec0 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73  er->fd->pMethods
1aed0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 72   ) return 0;.  r
1aee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 41 63 63  c = sqlite3OsAcc
1aef0 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65 72  ess(pVfs, pPager
1af00 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c 49  ->zJournal, SQLI
1af10 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54 53  TE_ACCESS_EXISTS
1af20 29 3b 0a 20 20 69 66 28 20 72 63 3c 3d 30 20 29  );.  if( rc<=0 )
1af30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  {.    return rc;
1af40 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1af50 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
1af60 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  dLock(pPager->fd
1af70 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
1af80 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c  0;.  }.  if( sql
1af90 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1afa0 6e 74 28 70 50 61 67 65 72 29 3d 3d 30 20 29 7b  nt(pPager)==0 ){
1afb0 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
1afc0 6c 65 74 65 28 70 56 66 73 2c 20 70 50 61 67 65  lete(pVfs, pPage
1afd0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b  r->zJournal, 0);
1afe0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1aff0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75   }else{.    retu
1b000 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rn 1;.  }.}../*.
1b010 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  ** Try to find a
1b020 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
1b030 68 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  he that can be r
1b040 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20  ecycled. .**.** 
1b050 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79  This routine may
1b060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
1b070 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c  OERR, SQLITE_FUL
1b080 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20  L or SQLITE_OK. 
1b090 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20  It .** does not 
1b0a0 73 65 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e  set the pPager->
1b0b0 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65  errCode variable
1b0c0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1b0d0 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61  pager_recycle(Pa
1b0e0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
1b0f0 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20 20 50 67  dr **ppPg){.  Pg
1b100 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a 70 70 50  Hdr *pPg;.  *ppP
1b110 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 74 20  g = 0;..  /* It 
1b120 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61  is illegal to ca
1b130 6c 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ll this function
1b140 20 75 6e 6c 65 73 73 20 74 68 65 20 70 61 67 65   unless the page
1b150 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a 20 70 6f  r object.  ** po
1b160 69 6e 74 65 64 20 74 6f 20 62 79 20 70 50 61 67  inted to by pPag
1b170 65 72 20 68 61 73 20 61 74 20 6c 65 61 73 74 20  er has at least 
1b180 6f 6e 65 20 66 72 65 65 20 70 61 67 65 20 28 70  one free page (p
1b190 61 67 65 20 77 69 74 68 20 6e 52 65 66 3d 3d 30  age with nRef==0
1b1a0 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  )..  */ .  asser
1b1b0 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20 61 73 73  t(!MEMDB);.  ass
1b1c0 65 72 74 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e  ert(pPager->lru.
1b1d0 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f 2a 20 46  pFirst);..  /* F
1b1e0 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72 65  ind a page to re
1b1f0 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20 6c  cycle.  Try to l
1b200 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68 61  ocate a page tha
1b210 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 2a 2a 20  t does not.  ** 
1b220 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
1b230 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
1b240 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f  he journal..  */
1b250 0a 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d  .  pPg = pPager-
1b260 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
1b270 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 63  d;..  /* If we c
1b280 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
1b290 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
1b2a0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
1b2b0 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e 20 74 68  ync().  ** on th
1b2c0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  e journal file t
1b2d0 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a 6f  hen fsync the jo
1b2e0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68 69  urnal file.  Thi
1b2f0 73 20 69 73 20 61 0a 20 20 2a 2a 20 76 65 72 79  s is a.  ** very
1b300 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
1b310 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
1b320 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
1b330 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 2a  ut sometimes.  *
1b340 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
1b350 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lped..  */.  if(
1b360 20 70 50 67 3d 3d 30 20 26 26 20 70 50 61 67 65   pPg==0 && pPage
1b370 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 7b 0a  r->lru.pFirst){.
1b380 20 20 20 20 69 6e 74 20 69 44 63 20 3d 20 73 71      int iDc = sq
1b390 6c 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61  lite3OsDeviceCha
1b3a0 72 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61  racteristics(pPa
1b3b0 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 69 6e  ger->fd);.    in
1b3c0 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
1b3d0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
1b3e0 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20  if( rc!=0 ){.   
1b3f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1b400 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
1b410 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
1b420 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
1b430 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
1b440 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  ) ){.      /* If
1b450 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
1b460 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20  de, write a new 
1b470 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69  journal header i
1b480 6e 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  nto the.      **
1b490 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
1b4a0 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
1b4b0 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
1b4c0 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  ing a journal.  
1b4d0 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 68      ** header th
1b4e0 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64 20 69  at is involved i
1b4f0 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f  n the rollback o
1b500 66 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  f pages that hav
1b510 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c 72 65 61  e.      ** alrea
1b520 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
1b530 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1b540 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61  (in case the hea
1b550 64 65 72 20 69 73 0a 20 20 20 20 20 20 2a 2a 20  der is.      ** 
1b560 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65  trashed when the
1b570 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
1b580 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 2a  pdated)..      *
1b590 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  /.      pPager->
1b5a0 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  nRec = 0;.      
1b5b0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b5c0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29  journalOff > 0 )
1b5d0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
1b5e0 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e  pPager->doNotSyn
1b5f0 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 63  c==0 );.      rc
1b600 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
1b610 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
1b620 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20    if( rc!=0 ){. 
1b630 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1b640 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b650 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
1b660 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a 20 20  ->lru.pFirst;.  
1b670 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  }..  assert( pPg
1b680 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20  ->nRef==0 );..  
1b690 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
1b6a0 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1b6b0 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
1b6c0 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66  dirty..  */.  if
1b6d0 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
1b6e0 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1b6f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
1b700 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
1b710 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a  makeClean(pPg);.
1b720 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
1b730 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69   1;.    pPg->pDi
1b740 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20  rty = 0;.    rc 
1b750 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
1b760 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
1b770 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
1b780 30 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  0;.    if( rc!=S
1b790 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1b7a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1b7b0 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28   }.  }.  assert(
1b7c0 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
1b7d0 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
1b7e0 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
1b7f0 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
1b800 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
1b810 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73 65 74 20  , then.  ** set 
1b820 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61 79  the global alway
1b830 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c 20  sRollback flag, 
1b840 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20 74  thus disabling t
1b850 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 50  he.  ** sqlite3P
1b860 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
1b870 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  () optimization 
1b880 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66 20  for the rest of 
1b890 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1b8a0 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63  ..  ** It is nec
1b8b0 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
1b8c0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
1b8d0 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
1b8e0 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6d 69  Rollback.  ** mi
1b8f0 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
1b900 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
1b910 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
1b920 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
1b930 62 65 72 0a 20 20 2a 2a 20 74 68 61 74 20 69 73  ber.  ** that is
1b940 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
1b950 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
1b960 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
1b970 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 2a 2a   pages must.  **
1b980 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   be marked as al
1b990 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72 6f  waysRollback fro
1b9a0 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a 20  m here on out.. 
1b9b0 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 61   */.  if( pPg->a
1b9c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
1b9d0 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 41  .    IOTRACE(("A
1b9e0 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43 4b 20 25  LWAYS_ROLLBACK %
1b9f0 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20  p\n", pPager)). 
1ba00 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
1ba10 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
1ba20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
1ba30 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f  the old page fro
1ba40 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74 20  m the free list 
1ba50 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61 62  and the hash tab
1ba60 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  le.  */.  unlink
1ba70 50 61 67 65 28 70 50 67 29 3b 0a 20 20 61 73 73  Page(pPg);.  ass
1ba80 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d  ert( pPg->pgno==
1ba90 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67 20 3d 20  0 );..  *ppPg = 
1baa0 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  pPg;.  return SQ
1bab0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64  LITE_OK;.}..#ifd
1bac0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
1bad0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
1bae0 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  NT./*.** This fu
1baf0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
1bb00 20 74 6f 20 66 72 65 65 20 73 75 70 65 72 66 6c   to free superfl
1bb10 75 6f 75 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79  uous dynamically
1bb20 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65 6d 6f 72   allocated memor
1bb30 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20 74 68 65  y.** held by the
1bb40 20 70 61 67 65 72 20 73 79 73 74 65 6d 2e 20 4d   pager system. M
1bb50 65 6d 6f 72 79 20 69 6e 20 75 73 65 20 62 79 20  emory in use by 
1bb60 61 6e 79 20 53 51 4c 69 74 65 20 70 61 67 65 72  any SQLite pager
1bb70 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a 20 62 79   allocated.** by
1bb80 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
1bb90 65 61 64 20 6d 61 79 20 62 65 20 73 71 6c 69 74  ead may be sqlit
1bba0 65 33 5f 66 72 65 65 28 29 65 64 2e 0a 2a 2a 0a  e3_free()ed..**.
1bbb0 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20 6e  ** nReq is the n
1bbc0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 6f  umber of bytes o
1bbd0 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72 65  f memory require
1bbe0 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75 63  d. Once this muc
1bbf0 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72 65  h has.** been re
1bc00 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e 63  leased, the func
1bc10 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 54 68  tion returns. Th
1bc20 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1bc30 73 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62  s the total numb
1bc40 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74 65 73 20  er .** of bytes 
1bc50 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c 65 61 73  of memory releas
1bc60 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
1bc70 65 33 50 61 67 65 72 52 65 6c 65 61 73 65 4d 65  e3PagerReleaseMe
1bc80 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29 7b 0a  mory(int nReq){.
1bc90 20 20 69 6e 74 20 6e 52 65 6c 65 61 73 65 64 20    int nReleased 
1bca0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
1bcb0 20 42 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79   Bytes of memory
1bcc0 20 72 65 6c 65 61 73 65 64 20 73 6f 20 66 61 72   released so far
1bcd0 20 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61   */.  Pager *pPa
1bce0 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  ger;            
1bcf0 20 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67    /* For looping
1bd00 20 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a   over pagers */.
1bd10 20 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 73    BusyHandler *s
1bd20 61 76 65 64 42 75 73 79 3b 20 20 20 20 20 2f 2a  avedBusy;     /*
1bd30 20 53 61 76 65 64 20 63 6f 70 79 20 6f 66 20 74   Saved copy of t
1bd40 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
1bd50 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  */.  int rc = SQ
1bd60 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41  LITE_OK;..  /* A
1bd70 63 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72  cquire the memor
1bd80 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74  y-management mut
1bd90 65 78 0a 20 20 2a 2f 0a 23 69 66 6e 64 65 66 20  ex.  */.#ifndef 
1bda0 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 4e 4f 4f  SQLITE_MUTEX_NOO
1bdb0 50 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  P.  sqlite3_mute
1bdc0 78 20 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20  x *mutex;       
1bdd0 2f 2a 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65  /* The MEM2 mute
1bde0 78 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d 20 73  x */.  mutex = s
1bdf0 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c  qlite3_mutex_all
1be00 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  oc(SQLITE_MUTEX_
1be10 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 23 65  STATIC_MEM2);.#e
1be20 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33 5f 6d  ndif.  sqlite3_m
1be30 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
1be40 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61 6c 20  );..  /* Signal 
1be50 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e  all database con
1be60 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20 6d 65  nections that me
1be70 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1be80 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20 68 61  wants.  ** to ha
1be90 76 65 20 61 63 63 65 73 73 20 74 6f 20 74 68 65  ve access to the
1bea0 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a 20 20   pagers..  */.  
1beb0 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c 69 74  for(pPager=sqlit
1bec0 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70 50 61  e3PagerList; pPa
1bed0 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50 61 67  ger; pPager=pPag
1bee0 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  er->pNext){.    
1bef0 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
1bf00 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20 77 68  M = 1;.  }..  wh
1bf10 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
1bf20 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c  OK && (nReq<0 ||
1bf30 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65 71 29   nReleased<nReq)
1bf40 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
1bf50 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20 2a 70  Pg;.    PgHdr *p
1bf60 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20 20 20  Recycled;. .    
1bf70 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61  /* Try to find a
1bf80 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
1bf90 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1bfa0 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1bfb0 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69 73 20   If.    ** this 
1bfc0 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2c  is not possible,
1bfd0 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74 20 64   find one that d
1bfe0 6f 65 73 20 72 65 71 75 69 72 65 20 61 20 73 79  oes require a sy
1bff0 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nc()..    */.   
1c000 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
1c010 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
1c020 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
1c030 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
1c040 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  ));.    pPg = sq
1c050 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
1c060 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 20  .pFirstSynced;. 
1c070 20 20 20 77 68 69 6c 65 28 20 70 50 67 20 26 26     while( pPg &&
1c080 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20   (pPg->needSync 
1c090 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  || pPg->pPager->
1c0a0 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20 20 20  iInUseDB) ){.   
1c0b0 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e 67 66     pPg = pPg->gf
1c0c0 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  ree.pNext;.    }
1c0d0 0a 20 20 20 20 69 66 28 20 21 70 50 67 20 29 7b  .    if( !pPg ){
1c0e0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
1c0f0 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e  ite3LruPageList.
1c100 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 77 68  pFirst;.      wh
1c110 69 6c 65 28 20 70 50 67 20 26 26 20 70 50 67 2d  ile( pPg && pPg-
1c120 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 44  >pPager->iInUseD
1c130 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67  B ){.        pPg
1c140 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70 4e   = pPg->gfree.pN
1c150 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ext;.      }.   
1c160 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d   }.    sqlite3_m
1c170 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74  utex_leave(sqlit
1c180 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53  e3_mutex_alloc(S
1c190 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54  QLITE_MUTEX_STAT
1c1a0 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20 20 2f  IC_LRU));..    /
1c1b0 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74 68 65  * If pPg==0, the
1c1c0 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62 6f 76  n the block abov
1c1d0 65 20 68 61 73 20 66 61 69 6c 65 64 20 74 6f 20  e has failed to 
1c1e0 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f 0a 20  find a page to. 
1c1f0 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e 20 49     ** recycle. I
1c200 6e 20 74 68 69 73 20 63 61 73 65 20 72 65 74 75  n this case retu
1c210 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20 66 75  rn early - no fu
1c220 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77 69 6c  rther memory wil
1c230 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65 6c 65  l.    ** be rele
1c240 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ased..    */.   
1c250 20 69 66 28 20 21 70 50 67 20 29 20 62 72 65 61   if( !pPg ) brea
1c260 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 20 3d  k;..    pPager =
1c270 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1c280 20 20 61 73 73 65 72 74 28 21 70 50 67 2d 3e 6e    assert(!pPg->n
1c290 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d 3d  eedSync || pPg==
1c2a0 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1c2b0 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  st);.    assert(
1c2c0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c  pPg->needSync ||
1c2d0 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 6c 72   pPg==pPager->lr
1c2e0 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  u.pFirstSynced);
1c2f0 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42 75 73  .  .    savedBus
1c300 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73  y = pPager->pBus
1c310 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20 70 50  yHandler;.    pP
1c320 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
1c330 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d  er = 0;.    rc =
1c340 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70   pager_recycle(p
1c350 50 61 67 65 72 2c 20 26 70 52 65 63 79 63 6c 65  Pager, &pRecycle
1c360 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
1c370 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 73  pBusyHandler = s
1c380 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20 61 73  avedBusy;.    as
1c390 73 65 72 74 28 70 52 65 63 79 63 6c 65 64 3d 3d  sert(pRecycled==
1c3a0 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c 49 54  pPg || rc!=SQLIT
1c3b0 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28 20 72  E_OK);.    if( r
1c3c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1c3d0 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65 20 66        /* We've f
1c3e0 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f 20 66  ound a page to f
1c3f0 72 65 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ree. At this poi
1c400 6e 74 20 74 68 65 20 70 61 67 65 20 68 61 73 20  nt the page has 
1c410 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a 20 72  been .      ** r
1c420 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
1c430 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c 65 2c  page hash-table,
1c440 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64 20 73   free-list and s
1c450 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20 20 20  ynced-list .    
1c460 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63    ** (pFirstSync
1c470 65 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c  ed). It is still
1c480 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65   in the all page
1c490 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a  s (pAll) list. .
1c4a0 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65 20        ** Remove 
1c4b0 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69 73  it from this lis
1c4c0 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e 67  t before freeing
1c4d0 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
1c4e0 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63 6b 20   ** Todo: Check 
1c4f0 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d 74 20  the Pager.pStmt 
1c500 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73 75 72  list to make sur
1c510 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20 49 74  e this is Ok. It
1c520 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f 62 61   .      ** proba
1c530 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e 0a 20  bly is though.. 
1c540 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 50 67       */.      Pg
1c550 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20 20 20  Hdr *pTmp;.     
1c560 20 61 73 73 65 72 74 28 20 70 50 67 20 29 3b 0a   assert( pPg );.
1c570 20 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70        if( pPg==p
1c580 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20  Pager->pAll ){. 
1c590 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1c5a0 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78  pAll = pPg->pNex
1c5b0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73  tAll;.      }els
1c5c0 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20  e{.        for( 
1c5d0 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  pTmp=pPager->pAl
1c5e0 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c  l; pTmp->pNextAl
1c5f0 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70 54 6d  l!=pPg; pTmp=pTm
1c600 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b 7d 0a  p->pNextAll ){}.
1c610 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e 70 4e          pTmp->pN
1c620 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  extAll = pPg->pN
1c630 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 0a  extAll;.      }.
1c640 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65 64 20        nReleased 
1c650 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 73  += (.          s
1c660 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50  izeof(*pPg) + pP
1c670 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 0a 20  ager->pageSize. 
1c680 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
1c690 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
1c6a0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
1c6b0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1c6c0 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20 20 20  (PgHistory) .   
1c6d0 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f 54 52     );.      IOTR
1c6e0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
1c6f0 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65 72 2c  %d *\n", pPager,
1c700 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
1c710 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
1c720 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
1c730 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
1c740 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c750 50 67 2d 3e 70 44 61 74 61 29 3b 0a 20 20 20 20  Pg->pData);.    
1c760 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1c770 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
1c780 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
1c790 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
1c7a0 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64  An error occured
1c7b0 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67 20   whilst writing 
1c7c0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
1c7d0 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20 20 2a  file or .      *
1c7e0 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70 61 67  * journal in pag
1c7f0 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20 54 68  er_recycle(). Th
1c800 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74 20 72  e error is not r
1c810 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20 0a  eturned to the .
1c820 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65 72 20        ** caller 
1c830 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
1c840 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74 20 74  . Instead, set t
1c850 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  he Pager.errCode
1c860 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20 20 20   variable..     
1c870 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20 77 69   ** The error wi
1c880 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64 20 74  ll be returned t
1c890 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72 20 75  o the user (or u
1c8a0 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63 61 73  sers, in the cas
1c8b0 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 61  e .      ** of a
1c8c0 20 73 68 61 72 65 64 20 70 61 67 65 72 20 63 61   shared pager ca
1c8d0 63 68 65 29 20 6f 66 20 74 68 65 20 70 61 67 65  che) of the page
1c8e0 72 20 66 6f 72 20 77 68 69 63 68 20 74 68 65 20  r for which the 
1c8f0 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e 0a 20  error occured.. 
1c900 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 73       */.      as
1c910 73 65 72 74 28 0a 20 20 20 20 20 20 20 20 20 20  sert(.          
1c920 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
1c930 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 20  E_IOERR ||.     
1c940 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f       rc==SQLITE_
1c950 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20 20 20  FULL ||.        
1c960 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53    rc==SQLITE_BUS
1c970 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  Y.      );.     
1c980 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c990 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
1c9a0 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 20 20  SERVED );.      
1c9b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1c9c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d 0a 20  er, rc);.    }. 
1c9d0 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72 20 74   }..  /* Clear t
1c9e0 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65  he memory manage
1c9f0 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64 20 72  ment flags and r
1ca00 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74 65 78  elease the mutex
1ca10 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50 61 67  .  */.  for(pPag
1ca20 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65 72 4c  er=sqlite3PagerL
1ca30 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70 50 61  ist; pPager; pPa
1ca40 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e 65 78  ger=pPager->pNex
1ca50 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65 72 2d  t){.     pPager-
1ca60 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b 0a 20  >iInUseMM = 0;. 
1ca70 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d 75 74   }.  sqlite3_mut
1ca80 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29 3b  ex_leave(mutex);
1ca90 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68  ..  /* Return th
1caa0 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1cab0 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a 2f 0a  s released.  */.
1cac0 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65 61 73    return nReleas
1cad0 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  ed;.}.#endif /* 
1cae0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45  SQLITE_ENABLE_ME
1caf0 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 20  MORY_MANAGEMENT 
1cb00 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
1cb10 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
1cb20 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
1cb30 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1cb40 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
1cb50 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
1cb60 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1cb70 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
1cb80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 36 34  .  int rc;.  i64
1cb90 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73 65 72   offset;.  asser
1cba0 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20  t( MEMDB==0 );. 
1cbb0 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e   assert(pPager->
1cbc0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50  fd->pMethods||pP
1cbd0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b  ager->tempFile);
1cbe0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1cbf0 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
1cc00 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1cc10 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45  E_IOERR_SHORT_RE
1cc20 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73 65 74  AD;.  }.  offset
1cc30 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34   = (pgno-1)*(i64
1cc40 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
1cc50 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  e;.  rc = sqlite
1cc60 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e  3OsRead(pPager->
1cc70 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
1cc80 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e  A(pPg), pPager->
1cc90 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74  pageSize, offset
1cca0 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28  );.  PAGER_INCR(
1ccb0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65  sqlite3_pager_re
1ccc0 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50  addb_count);.  P
1ccd0 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72  AGER_INCR(pPager
1cce0 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52  ->nRead);.  IOTR
1ccf0 41 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64  ACE(("PGIN %p %d
1cd00 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1cd10 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d  o));.  if( pgno=
1cd20 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  =1 ){.    memcpy
1cd30 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65  (&pPager->dbFile
1cd40 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48  Vers, &((u8*)PGH
1cd50 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29  DR_TO_DATA(pPg))
1cd60 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  [24],.          
1cd70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cd90 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65      sizeof(pPage
1cda0 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b  r->dbFileVers));
1cdb0 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50  .  }.  CODEC1(pP
1cdc0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
1cdd0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
1cde0 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52  gno, 3);.  PAGER
1cdf0 54 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64  TRACE4("FETCH %d
1ce00 20 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30   page %d hash(%0
1ce10 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  8x)\n",.        
1ce20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
1ce30 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
1ce40 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  o, pager_pagehas
1ce50 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72  h(pPg));.  retur
1ce60 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1ce70 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
1ce80 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69   called to obtai
1ce90 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63  n the shared loc
1cea0 6b 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72  k required befor
1ceb0 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65  e.** data may be
1cec0 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70   read from the p
1ced0 61 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74  ager cache. If t
1cee0 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68  he shared lock h
1cef0 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65  as already.** be
1cf00 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69  en obtained, thi
1cf10 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20  s function is a 
1cf20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d  no-op..**.** Imm
1cf30 65 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f  ediately after o
1cf40 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61  btaining the sha
1cf50 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71  red lock (if req
1cf60 75 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e  uired), this fun
1cf70 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20  ction.** checks 
1cf80 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61  for a hot-journa
1cf90 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69  l file. If one i
1cfa0 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72  s found, an emer
1cfb0 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a  gency rollback.*
1cfc0 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69  * is performed i
1cfd0 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73  mmediately..*/.s
1cfe0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53  tatic int pagerS
1cff0 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20  haredLock(Pager 
1d000 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
1d010 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1d020 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20 30 3b    int isHot = 0;
1d030 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20 64  ..  /* If this d
1d040 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
1d050 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76 65 20  d for exclusive 
1d060 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f 20 6f  access, has no o
1d070 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20 2a 2a  utstanding .  **
1d080 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 73   page references
1d090 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20 65 72   and is in an er
1d0a0 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77 20 69  ror-state, now i
1d0b0 73 20 74 68 65 20 63 68 61 6e 63 65 20 74 6f 20  s the chance to 
1d0c0 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65 20 65  clear.  ** the e
1d0d0 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20 74 68  rror. Discard th
1d0e0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
1d0f0 65 20 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e  e pager-cache an
1d100 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20 2a 2a  d treat any.  **
1d110 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20 66 69   open journal fi
1d120 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75 72  le as a hot-jour
1d130 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  nal..  */.  if( 
1d140 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
1d150 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1d160 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
1d170 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  =0 && pPager->er
1d180 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69 66 28  rCode ){.    if(
1d190 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1d1a0 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 69 73  Open ){.      is
1d1b0 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  Hot = 1;.    }. 
1d1c0 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f     pPager->errCo
1d1d0 64 65 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  de = SQLITE_OK;.
1d1e0 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
1d1f0 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPager);.  }..  
1d200 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  /* If the pager 
1d210 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e 20 65  is still in an e
1d220 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f 20 6e  rror state, do n
1d230 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68 65 20  ot proceed. The 
1d240 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74 61 74  error .  ** stat
1d250 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61 72 65  e will be cleare
1d260 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e 74 20  d at some point 
1d270 69 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 68  in the future wh
1d280 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20 20 2a  en all page .  *
1d290 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61 72 65  * references are
1d2a0 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74 68 65   dropped and the
1d2b0 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64 69   cache can be di
1d2c0 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a 20 20  scarded..  */.  
1d2d0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
1d2e0 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65  ode && pPager->e
1d2f0 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46  rrCode!=SQLITE_F
1d300 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ULL ){.    retur
1d310 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1d320 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  e;.  }..  if( pP
1d330 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1d340 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69 73 48  ER_UNLOCK || isH
1d350 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ot ){.    sqlite
1d360 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20 70 50  3_vfs *pVfs = pP
1d370 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20 20 20  ager->pVfs;.    
1d380 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
1d390 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d3a0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20  er->nRef==0 );. 
1d3b0 20 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72       if( !pPager
1d3c0 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a  ->noReadlock ){.
1d3d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
1d3e0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
1d3f0 70 50 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c  pPager, SHARED_L
1d400 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 69 66  OCK);.        if
1d410 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1d420 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  ){.          ass
1d430 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1d440 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1d450 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
1d460 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1d470 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1d480 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d490 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1d4a0 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f  state>=SHARED_LO
1d4b0 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  CK );.      }.  
1d4c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20 6a  .      /* If a j
1d4d0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69 73  ournal file exis
1d4e0 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69 73  ts, and there is
1d4f0 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f 63   no RESERVED loc
1d500 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20 2a  k on the.      *
1d510 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
1d520 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
1d530 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
1d540 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
1d550 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
1d560 20 20 20 72 63 20 3d 20 68 61 73 48 6f 74 4a 6f     rc = hasHotJo
1d570 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1d580 20 20 20 20 20 69 66 28 20 72 63 3c 30 20 29 7b       if( rc<0 ){
1d590 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
1d5a0 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
1d5b0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66  ;.        goto f
1d5c0 61 69 6c 65 64 3b 0a 20 20 20 20 20 20 7d 0a 20  ailed;.      }. 
1d5d0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 31 20 7c       if( rc==1 |
1d5e0 7c 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20  | isHot ){.     
1d5f0 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43     /* Get an EXC
1d600 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1d610 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1d620 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  . At this point 
1d630 69 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a  it is.        **
1d640 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20   important that 
1d650 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20  a RESERVED lock 
1d660 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20  is not obtained 
1d670 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68  on the way to th
1d680 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43  e.        ** EXC
1d690 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
1d6a0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
1d6b0 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
1d6c0 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20  pen the.        
1d6d0 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1d6e0 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
1d6f0 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
1d700 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
1d710 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74  e.        ** dat
1d720 61 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f  abase is safe to
1d730 20 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73   read while this
1d740 20 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c   process is stil
1d750 6c 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20  l rolling it .  
1d760 20 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20        ** back.. 
1d770 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20         ** .     
1d780 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68     ** Because th
1d790 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52  e intermediate R
1d7a0 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
1d7b0 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74  not requested, t
1d7c0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65  he.        ** se
1d7d0 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
1d7e0 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
1d7f0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
1d800 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
1d810 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
1d820 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
1d830 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
1d840 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
1d850 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1d860 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
1d870 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29  EXCLUSIVE_LOCK )
1d880 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
1d890 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
1d8a0 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
1d8b0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
1d8c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1d8d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1d8e0 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1d8f0 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1d900 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rc);.           
1d910 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20 20   goto failed;.  
1d920 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1d930 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
1d940 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
1d950 49 56 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IVE;.        }. 
1d960 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e  .        /* Open
1d970 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1d980 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
1d990 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
1d9a0 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20  use in .        
1d9b0 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
1d9c0 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
1d9d0 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
1d9e0 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
1d9f0 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
1da00 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
1da10 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
1da20 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
1da30 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
1da40 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
1da50 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
1da60 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1da70 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
1da80 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
1da90 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
1daa0 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
1dab0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1dac0 28 20 21 69 73 48 6f 74 20 26 26 20 70 50 61 67  ( !isHot && pPag
1dad0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
1dae0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
1daf0 69 6e 74 20 72 65 73 20 3d 20 73 71 6c 69 74 65  int res = sqlite
1db00 33 4f 73 41 63 63 65 73 73 28 70 56 66 73 2c 70  3OsAccess(pVfs,p
1db10 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
1db20 53 51 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58  SQLITE_ACCESS_EX
1db30 49 53 54 53 29 3b 0a 20 20 20 20 20 20 20 20 20  ISTS);.         
1db40 20 69 66 28 20 72 65 73 3d 3d 31 20 29 7b 0a 20   if( res==1 ){. 
1db50 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66             int f
1db60 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  out = 0;.       
1db70 20 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c       int f = SQL
1db80 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49  ITE_OPEN_READWRI
1db90 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  TE|SQLITE_OPEN_M
1dba0 41 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20  AIN_JOURNAL;.   
1dbb0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1dbc0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
1dbd0 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  le );.          
1dbe0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1dbf0 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65  Open(pVfs, pPage
1dc00 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
1dc10 67 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f  ger->jfd, f, &fo
1dc20 75 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ut);.           
1dc30 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
1dc40 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
1dc50 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
1dc60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1dc70 66 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f  f( fout&SQLITE_O
1dc80 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a  PEN_READONLY ){.
1dc90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
1dca0 20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a   = SQLITE_BUSY;.
1dcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1dcc0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
1dcd0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
1dce0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1dcf0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 65 73     }else if( res
1dd00 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1dd10 20 20 20 2f 2a 20 49 66 20 74 68 65 20 6a 6f 75     /* If the jou
1dd20 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 65 78  rnal does not ex
1dd30 69 73 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20  ist, that means 
1dd40 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
1dd50 73 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  ss.            *
1dd60 2a 20 68 61 73 20 61 6c 72 65 61 64 79 20 72 6f  * has already ro
1dd70 6c 6c 65 64 20 69 74 20 62 61 63 6b 20 2a 2f 0a  lled it back */.
1dd80 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1dd90 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
1dda0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
1ddc0 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65 73 73   sqlite3OsAccess
1ddd0 28 29 20 72 65 74 75 72 6e 73 20 61 20 6e 65 67  () returns a neg
1dde0 61 74 69 76 65 20 76 61 6c 75 65 2c 20 74 68 61  ative value, tha
1ddf0 74 20 6d 65 61 6e 73 20 69 74 0a 20 20 20 20 20  t means it.     
1de00 20 20 20 20 20 20 20 2a 2a 20 66 61 69 6c 65 64         ** failed
1de10 20 61 20 6d 65 6d 6f 72 79 20 61 6c 6c 6f 63 61   a memory alloca
1de20 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20  tion */.        
1de30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1de40 49 4f 45 52 52 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  IOERR_NOMEM;.   
1de50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1de60 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 72   }.        if( r
1de70 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1de80 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1de90 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26  !=SQLITE_NOMEM &
1dea0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
1deb0 52 52 5f 55 4e 4c 4f 43 4b 20 0a 20 20 20 20 20  RR_UNLOCK .     
1dec0 20 20 20 20 20 20 26 26 20 72 63 21 3d 53 51 4c        && rc!=SQL
1ded0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
1dee0 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20  .          ){.  
1def0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
1df00 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 20 20  QLITE_BUSY;.    
1df10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1df20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a 20    goto failed;. 
1df30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1df40 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1df50 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
1df60 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
1df70 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
1df80 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
1df90 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
1dfa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
1dfb0 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
1dfc0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1dfd0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
1dfe0 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
1dff0 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
1e000 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
1e010 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
1e020 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
1e030 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
1e040 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
1e050 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1e060 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
1e070 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
1e080 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
1e090 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e0a0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1e0b0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
1e0c0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  er, rc);.       
1e0d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 3b 0a     goto failed;.
1e0e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e0f0 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
1e100 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
1e110 41 52 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20  ARED || .       
1e120 20 20 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78       (pPager->ex
1e130 63 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70  clusiveMode && p
1e140 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47  Pager->state>PAG
1e150 45 52 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20  ER_SHARED).     
1e160 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20     );.      }.. 
1e170 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1e180 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  >pAll ){.       
1e190 20 2f 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c   /* The shared-l
1e1a0 6f 63 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65  ock has just bee
1e1b0 6e 20 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68  n acquired on th
1e1c0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  e database file.
1e1d0 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74          ** and t
1e1e0 68 65 72 65 20 61 72 65 20 61 6c 72 65 61 64 79  here are already
1e1f0 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 63 61   pages in the ca
1e200 63 68 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76  che (from a prev
1e210 69 6f 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  ious.        ** 
1e220 72 65 61 64 20 6f 72 20 77 72 69 74 65 20 74 72  read or write tr
1e230 61 6e 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65  ansaction).  Che
1e240 63 6b 20 74 6f 20 73 65 65 20 69 66 20 74 68 65  ck to see if the
1e250 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
1e260 20 20 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f    ** has been mo
1e270 64 69 66 69 65 64 2e 20 20 49 66 20 74 68 65 20  dified.  If the 
1e280 64 61 74 61 62 61 73 65 20 68 61 73 20 63 68 61  database has cha
1e290 6e 67 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a  nged, flush the.
1e2a0 20 20 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65          ** cache
1e2b0 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ..        **.   
1e2c0 20 20 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65       ** Database
1e2d0 20 63 68 61 6e 67 65 73 20 69 73 20 64 65 74 65   changes is dete
1e2e0 63 74 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20  cted by looking 
1e2f0 61 74 20 31 35 20 62 79 74 65 73 20 62 65 67 69  at 15 bytes begi
1e300 6e 6e 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  nning.        **
1e310 20 61 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e   at offset 24 in
1e320 74 6f 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68  to the file.  Th
1e330 65 20 66 69 72 73 74 20 34 20 6f 66 20 74 68 65  e first 4 of the
1e340 73 65 20 31 36 20 62 79 74 65 73 20 61 72 65 0a  se 16 bytes are.
1e350 20 20 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d          ** a 32-
1e360 62 69 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74  bit counter that
1e370 20 69 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20   is incremented 
1e380 77 69 74 68 20 65 61 63 68 20 63 68 61 6e 67 65  with each change
1e390 2e 20 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a  .  The.        *
1e3a0 2a 20 6f 74 68 65 72 20 62 79 74 65 73 20 63 68  * other bytes ch
1e3b0 61 6e 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69  ange randomly wi
1e3c0 74 68 20 65 61 63 68 20 66 69 6c 65 20 63 68 61  th each file cha
1e3d0 6e 67 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20  nge when.       
1e3e0 20 2a 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69   ** a codec is i
1e3f0 6e 20 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a  n use..        *
1e400 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  * .        ** Th
1e410 65 72 65 20 69 73 20 61 20 76 61 6e 69 73 68 69  ere is a vanishi
1e420 6e 67 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63  ngly small chanc
1e430 65 20 74 68 61 74 20 61 20 63 68 61 6e 67 65 20  e that a change 
1e440 77 69 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20  will not be .   
1e450 20 20 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64       ** detected
1e460 2e 20 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66  .  The chance of
1e470 20 61 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63   an undetected c
1e480 68 61 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c  hange is so smal
1e490 6c 20 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a  l that.        *
1e4a0 2a 20 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c  * it can be negl
1e4b0 65 63 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a  ected..        *
1e4c0 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 64  /.        char d
1e4d0 62 46 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66  bFileVers[sizeof
1e4e0 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
1e4f0 65 72 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73  ers)];.        s
1e500 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
1e510 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20  ount(pPager);.. 
1e520 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65         if( pPage
1e530 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
1e540 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 50 61          rc = pPa
1e550 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1e560 20 20 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69          goto fai
1e570 6c 65 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  led;.        }..
1e580 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1e590 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
1e5a0 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1e5b0 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
1e5c0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
1e5d0 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1e5e0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1e5f0 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1e600 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
1e610 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1e620 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
1e630 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1e640 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1e650 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f 74  .            got
1e660 6f 20 66 61 69 6c 65 64 3b 0a 20 20 20 20 20 20  o failed;.      
1e670 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
1e680 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
1e690 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
1e6a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
1e6b0 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
1e6c0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
1e6d0 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
1e6e0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
1e6f0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
1e700 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
1e710 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
1e720 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
1e730 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1e740 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
1e750 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
1e760 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
1e770 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
1e780 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
1e790 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
1e7a0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1e7b0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1e7c0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
1e7d0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
1e7e0 7d 0a 0a 20 66 61 69 6c 65 64 3a 0a 20 20 69 66  }.. failed:.  if
1e7f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1e800 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  ){.    /* pager_
1e810 75 6e 6c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f  unlock() is a no
1e820 2d 6f 70 20 66 6f 72 20 65 78 63 6c 75 73 69 76  -op for exclusiv
1e830 65 20 6d 6f 64 65 20 61 6e 64 20 69 6e 2d 6d 65  e mode and in-me
1e840 6d 6f 72 79 20 64 61 74 61 62 61 73 65 73 2e 20  mory databases. 
1e850 2a 2f 0a 20 20 20 20 70 61 67 65 72 5f 75 6e 6c  */.    pager_unl
1e860 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ock(pPager);.  }
1e870 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1e880 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1e890 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20  a PgHdr object. 
1e8a0 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20    Either create 
1e8b0 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75  a new one or reu
1e8c0 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  se.** an existin
1e8d0 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  g one that is no
1e8e0 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  t otherwise in u
1e8f0 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  se..**.** A new 
1e900 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20  PgHdr structure 
1e910 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e  is created if an
1e920 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1e930 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a  ng are.** true:.
1e940 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1e950 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65  e have not excee
1e960 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20  ded our maximum 
1e970 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20  allocated cache 
1e980 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
1e990 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22   as set by the "
1e9a0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1e9b0 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  e" command..**.*
1e9c0 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
1e9d0 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50   are no unused P
1e9e0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61  gHdr objects ava
1e9f0 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74  ilable at this t
1ea00 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ime..**.**     (
1ea10 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69  3)  This is an i
1ea20 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ea30 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29  e..**.**     (4)
1ea40 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50    There are no P
1ea50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61  gHdr objects tha
1ea60 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  t do not require
1ea70 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20   a journal.**   
1ea80 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63         file sync
1ea90 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74   and a sync of t
1eaa0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1eab0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1eac0 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69           prohibi
1ead0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ted..**.** Other
1eae0 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65  wise, reuse an e
1eaf0 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20  xisting PgHdr.  
1eb00 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1eb10 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73  reuse an.** exis
1eb20 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c  ting PgHdr if al
1eb30 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1eb40 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1eb50 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
1eb60 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65  ave reached or e
1eb70 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69  xceeded the maxi
1eb80 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  mum cache size.*
1eb90 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77  *          allow
1eba0 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61  ed by "PRAGMA ca
1ebb0 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a  che_size"..**.**
1ebc0 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1ebd0 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c  is a PgHdr avail
1ebe0 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d  able with PgHdr-
1ebf0 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20  >nRef==0.**.**  
1ec00 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e     (3)  We are n
1ec10 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ot in an in-memo
1ec20 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  ry database.**.*
1ec30 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65  *     (4)  Eithe
1ec40 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76  r there is an av
1ec50 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68  ailable PgHdr th
1ec60 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1ec70 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20  .**          to 
1ec80 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  be synced to dis
1ec90 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73  k or else disk s
1eca0 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e  yncing is curren
1ecb0 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  tly.**          
1ecc0 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74  allowed..*/.stat
1ecd0 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f  ic int pagerAllo
1ece0 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a  catePage(Pager *
1ecf0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a  pPager, PgHdr **
1ed00 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  ppPg){.  int rc 
1ed10 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1ed20 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
1ed30 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a   nByteHdr;..  /*
1ed40 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67   Create a new Pg
1ed50 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68  Hdr if any of th
1ed60 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e  e four condition
1ed70 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20  s defined .  ** 
1ed80 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a  above are met: *
1ed90 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1eda0 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
1edb0 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65  Page.   || pPage
1edc0 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30  r->lru.pFirst==0
1edd0 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20   .   || MEMDB.  
1ede0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75   || (pPager->lru
1edf0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  .pFirstSynced==0
1ee00 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
1ee10 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20  tSync).  ){.    
1ee20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
1ee30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
1ee40 67 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73  ge>=pPager->nHas
1ee50 68 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  h ){.      pager
1ee60 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62  _resize_hash_tab
1ee70 6c 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20  le(pPager,.     
1ee80 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73      pPager->nHas
1ee90 68 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50  h<256 ? 256 : pP
1eea0 61 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a  ager->nHash*2);.
1eeb0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1eec0 2d 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20  ->nHash==0 ){.  
1eed0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1eee0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20  E_NOMEM;.       
1eef0 20 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f   goto pager_allo
1ef00 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20  cate_out;.      
1ef10 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
1ef20 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
1ef30 20 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73      nByteHdr = s
1ef40 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69  izeof(*pPg) + si
1ef50 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67  zeof(u32) + pPag
1ef60 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20  er->nExtra.     
1ef70 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42           + MEMDB
1ef80 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72  *sizeof(PgHistor
1ef90 79 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71  y);.    pPg = sq
1efa0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
1efb0 79 74 65 48 64 72 20 29 3b 0a 20 20 20 20 69 66  yteHdr );.    if
1efc0 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20 20 70  ( pPg ){.      p
1efd0 44 61 74 61 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Data = sqlite3_m
1efe0 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70  alloc( pPager->p
1eff0 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  ageSize );.     
1f000 20 69 66 28 20 70 44 61 74 61 3d 3d 30 20 29 7b   if( pData==0 ){
1f010 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f020 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20  _free(pPg);.    
1f030 20 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 20      pPg = 0;.   
1f040 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
1f050 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
1f060 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d  );.    if( pPg==
1f070 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  0 ){.      rc = 
1f080 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1f090 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f 61      goto pager_a
1f0a0 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20 20  llocate_out;.   
1f0b0 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 50   }.    memset(pP
1f0c0 67 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29 3b  g, 0, nByteHdr);
1f0d0 0a 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61 20  .    pPg->pData 
1f0e0 3d 20 70 44 61 74 61 3b 0a 20 20 20 20 70 50 67  = pData;.    pPg
1f0f0 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
1f100 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  r;.    pPg->pNex
1f110 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
1f120 41 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  All;.    pPager-
1f130 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20  >pAll = pPg;.   
1f140 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b   pPager->nPage++
1f150 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
1f160 2a 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69  * Recycle an exi
1f170 73 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20  sting page with 
1f180 61 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74  a zero ref-count
1f190 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61  . */.    rc = pa
1f1a0 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67  ger_recycle(pPag
1f1b0 65 72 2c 20 26 70 50 67 29 3b 0a 20 20 20 20 69  er, &pPg);.    i
1f1c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  f( rc==SQLITE_BU
1f1d0 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  SY ){.      rc =
1f1e0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c   SQLITE_IOERR_BL
1f1f0 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20 20 20  OCKED;.    }.   
1f200 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1f210 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  OK ){.      goto
1f220 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f   pager_allocate_
1f230 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  out;.    }.    a
1f240 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1f250 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c 4f 43  tate>=SHARED_LOC
1f260 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  K );.    assert(
1f270 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
1f280 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65 72 5f  g = pPg;..pager_
1f290 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a 20 20  allocate_out:.  
1f2a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1f2b0 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65  .** Make sure we
1f2c0 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74 65 6e   have the conten
1f2d0 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 49  t for a page.  I
1f2e0 66 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  f the page was.*
1f2f0 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61 63 71  * previously acq
1f300 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43 6f 6e  uired with noCon
1f310 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20 74 68  tent==1, then th
1f320 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a 2a 2a  e content was.**
1f330 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69 7a 65   just initialize
1f340 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73 74 65  d to zeros inste
1f350 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65 61 64  ad of being read
1f360 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 42   from disk..** B
1f370 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64 20 74  ut now we need t
1f380 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f 66 66  he real data off
1f390 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20 6d 61   of disk.  So ma
1f3a0 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20 68 61  ke sure we.** ha
1f3b0 76 65 20 69 74 2e 20 20 52 65 61 64 20 69 74 20  ve it.  Read it 
1f3c0 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f 74 20  in if we do not 
1f3d0 68 61 76 65 20 69 74 20 61 6c 72 65 61 64 79 2e  have it already.
1f3e0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1f3f0 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1f400 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
1f410 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52 65 61  if( pPg->needRea
1f420 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20  d ){.    int rc 
1f430 3d 20 72 65 61 64 44 62 50 61 67 65 28 70 50 67  = readDbPage(pPg
1f440 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70  ->pPager, pPg, p
1f450 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 69  Pg->pgno);.    i
1f460 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
1f470 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   ){.      pPg->n
1f480 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1f490 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
1f4a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1f4b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
1f4c0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
1f4d0 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a  Acquire a page..
1f4e0 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63  **.** A read loc
1f4f0 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69  k on the disk fi
1f500 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77  le is obtained w
1f510 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61  hen the first pa
1f520 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20  ge is acquired. 
1f530 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f  .** This read lo
1f540 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68  ck is dropped wh
1f550 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65  en the last page
1f560 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a   is released..**
1f570 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
1f580 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70   works for any p
1f590 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74  age number great
1f5a0 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74  er than 0.  If t
1f5b0 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66  he database.** f
1f5c0 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74  ile is smaller t
1f5d0 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74 65  han the requeste
1f5e0 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20  d page, then no 
1f5f0 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72  actual disk.** r
1f600 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74  ead occurs and t
1f610 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20  he memory image 
1f620 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20 69  of the page is i
1f630 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a  nitialized to.**
1f640 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65   all zeros.  The
1f650 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70 65   extra data appe
1f660 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20 69  nded to a page i
1f670 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c  s always initial
1f680 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73  ized.** to zeros
1f690 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   the first time 
1f6a0 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64  a page is loaded
1f6b0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a   into memory..**
1f6c0 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69 74  .** The acquisit
1f6d0 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66  ion might fail f
1f6e0 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f  or several reaso
1f6f0 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65  ns.  In all case
1f700 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72  s,.** an appropr
1f710 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20  iate error code 
1f720 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20  is returned and 
1f730 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20 74  *ppPage is set t
1f740 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65  o NULL..**.** Se
1f750 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 50 61  e also sqlite3Pa
1f760 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f  gerLookup().  Bo
1f770 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  th this routine 
1f780 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61 74 74  and Lookup() att
1f790 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
1f7a0 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
1f7b0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
1f7c0 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
1f7d0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1f7e0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
1f7f0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
1f800 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
1f810 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 4c   it in whereas L
1f820 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20  ookup().** just 
1f830 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73  returns 0.  This
1f840 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65   routine acquire
1f850 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68  s a read-lock th
1f860 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a  e first time it.
1f870 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20  ** has to go to 
1f880 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20  disk, and could 
1f890 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e  also playback an
1f8a0 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20   old journal if 
1f8b0 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69  necessary..** Si
1f8c0 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e 65 76  nce Lookup() nev
1f8d0 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c  er goes to disk,
1f8e0 20 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f   it never has to
1f8f0 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73   deal with locks
1f900 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66  .** or journal f
1f910 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e  iles..**.** If n
1f920 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61 6c 73  oContent is fals
1f930 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  e, the page cont
1f940 65 6e 74 73 20 61 72 65 20 61 63 74 75 61 6c 6c  ents are actuall
1f950 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69 73 6b  y read from disk
1f960 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  ..** If noConten
1f970 74 20 69 73 20 74 72 75 65 2c 20 69 74 20 6d 65  t is true, it me
1f980 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f 20 6e  ans that we do n
1f990 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20 74 68  ot care about th
1f9a0 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20 6f 66  e contents.** of
1f9b0 20 74 68 65 20 70 61 67 65 20 61 74 20 74 68 69   the page at thi
1f9c0 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20 6e 6f  s time, so do no
1f9d0 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65 61 64  t do a disk read
1f9e0 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69 6e 20  .  Just fill in 
1f9f0 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f 6e 74  the.** page cont
1fa00 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73 2e 20  ent with zeros. 
1fa10 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20 66 61   But mark the fa
1fa20 63 74 20 74 68 61 74 20 77 65 20 68 61 76 65 20  ct that we have 
1fa30 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a 2a 20  not read the.** 
1fa40 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74 74 69  content by setti
1fa50 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
1fa60 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c 61 74  dRead flag.  Lat
1fa70 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20 73 71  er on, if .** sq
1fa80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
1fa90 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e 20 74  ) is called on t
1faa0 68 69 73 20 70 61 67 65 20 6f 72 20 69 66 20 74  his page or if t
1fab0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 0a 2a  his routine is.*
1fac0 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e 20 77  * called again w
1fad0 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 30  ith noContent==0
1fae0 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  , that means tha
1faf0 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  t the content is
1fb00 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64 20 74   needed.** and t
1fb10 68 65 20 64 69 73 6b 20 72 65 61 64 20 73 68 6f  he disk read sho
1fb20 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74 68 61  uld occur at tha
1fb30 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74  t point..*/.stat
1fb40 69 63 20 69 6e 74 20 70 61 67 65 72 41 63 71 75  ic int pagerAcqu
1fb50 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a 70 50  ire(.  Pager *pP
1fb60 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20 54 68  ager,      /* Th
1fb70 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20  e pager open on 
1fb80 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fb90 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f  e */.  Pgno pgno
1fba0 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ,          /* Pa
1fbb0 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66 65 74  ge number to fet
1fbc0 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a  ch */.  DbPage *
1fbd0 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a 20 57  *ppPage,    /* W
1fbe0 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72 20 74  rite a pointer t
1fbf0 6f 20 74 68 65 20 70 61 67 65 20 68 65 72 65 20  o the page here 
1fc00 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65  */.  int noConte
1fc10 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e  nt       /* Do n
1fc20 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64 69 6e  ot bother readin
1fc30 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64  g content from d
1fc40 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f 0a 29  isk if true */.)
1fc50 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
1fc60 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73    int rc;..  ass
1fc70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1fc80 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
1fc90 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   || pPager->nRef
1fca0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20 29 3b  >0 || pgno==1 );
1fcb0 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78 69 6d  ..  /* The maxim
1fcc0 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  um page number i
1fcd0 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e 20 53  s 2^31. Return S
1fce0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 69 66  QLITE_CORRUPT if
1fcf0 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e 75 6d   a page.  ** num
1fd00 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1fd10 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f 2c 20   this, or zero, 
1fd20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a 20 20  is requested..  
1fd30 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e 50 41  */.  if( pgno>PA
1fd40 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20  GER_MAX_PGNO || 
1fd50 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
1fd60 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
1fd70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
1fd80 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52  turn SQLITE_CORR
1fd90 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a 0a 20  UPT_BKPT;.  }.. 
1fda0 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
1fdb0 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
1fdc0 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
1fdd0 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
1fde0 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
1fdf0 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 0a    *ppPage = 0;..
1fe00 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20    /* If this is 
1fe10 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61  the first page a
1fe20 63 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65  ccessed, then ge
1fe30 74 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a  t a SHARED lock.
1fe40 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61    ** on the data
1fe50 62 61 73 65 20 66 69 6c 65 2e 20 70 61 67 65 72  base file. pager
1fe60 53 68 61 72 65 64 4c 6f 63 6b 28 29 20 69 73 20  SharedLock() is 
1fe70 61 20 6e 6f 2d 6f 70 20 69 66 20 0a 20 20 2a 2a  a no-op if .  **
1fe80 20 61 20 64 61 74 61 62 61 73 65 20 6c 6f 63 6b   a database lock
1fe90 20 69 73 20 61 6c 72 65 61 64 79 20 68 65 6c 64   is already held
1fea0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
1feb0 67 65 72 53 68 61 72 65 64 4c 6f 63 6b 28 70 50  gerSharedLock(pP
1fec0 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
1fed0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fee0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1fef0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ff00 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
1ff10 55 4e 4c 4f 43 4b 20 29 3b 0a 0a 20 20 70 50 67  UNLOCK );..  pPg
1ff20 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
1ff30 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
1ff40 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
1ff50 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73     /* The reques
1ff60 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f 74 20  ted page is not 
1ff70 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  in the page cach
1ff80 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 4d  e. */.    int nM
1ff90 61 78 3b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20  ax;.    int h;. 
1ffa0 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50     PAGER_INCR(pP
1ffb0 61 67 65 72 2d 3e 6e 4d 69 73 73 29 3b 0a 20 20  ager->nMiss);.  
1ffc0 20 20 72 63 20 3d 20 70 61 67 65 72 41 6c 6c 6f    rc = pagerAllo
1ffd0 63 61 74 65 50 61 67 65 28 70 50 61 67 65 72 2c  catePage(pPager,
1ffe0 20 26 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20   &pPg);.    if( 
1fff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
20000 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
20010 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50 67  ;.    }..    pPg
20020 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20  ->pgno = pgno;. 
20030 20 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44     assert( !MEMD
20040 42 20 7c 7c 20 70 67 6e 6f 3e 70 50 61 67 65 72  B || pgno>pPager
20050 2d 3e 73 74 6d 74 53 69 7a 65 20 29 3b 0a 20 20  ->stmtSize );.  
20060 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
20070 20 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63   = sqlite3Bitvec
20080 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
20090 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a  Journal, pgno);.
200a0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
200b0 63 20 3d 20 30 3b 0a 0a 20 20 20 20 6d 61 6b 65  c = 0;..    make
200c0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
200d0 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a  pPg->nRef = 1;..
200e0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
200f0 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ++;.    if( pPag
20100 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a  er->nExtra>0 ){.
20110 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
20120 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c  DR_TO_EXTRA(pPg,
20130 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61   pPager), 0, pPa
20140 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20  ger->nExtra);.  
20150 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73    }.    nMax = s
20160 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
20170 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
20180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
20190 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 72  rCode ){.      r
201a0 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
201b0 6f 64 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ode;.      sqlit
201c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 67  e3PagerUnref(pPg
201d0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
201e0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
201f0 2a 20 50 6f 70 75 6c 61 74 65 20 74 68 65 20 70  * Populate the p
20200 61 67 65 20 77 69 74 68 20 64 61 74 61 2c 20 65  age with data, e
20210 69 74 68 65 72 20 62 79 20 72 65 61 64 69 6e 67  ither by reading
20220 20 66 72 6f 6d 20 74 68 65 20 64 61 74 61 62 61   from the databa
20230 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20  se.    ** file, 
20240 6f 72 20 62 79 20 73 65 74 74 69 6e 67 20 74 68  or by setting th
20250 65 20 65 6e 74 69 72 65 20 70 61 67 65 20 74 6f  e entire page to
20260 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20   zero..    */.  
20270 20 20 69 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29    if( nMax<(int)
20280 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c  pgno || MEMDB ||
20290 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21   (noContent && !
202a0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
202b0 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20 20 20 20  llback) ){.     
202c0 20 69 66 28 20 70 67 6e 6f 3e 70 50 61 67 65 72   if( pgno>pPager
202d0 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20  ->mxPgno ){.    
202e0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
202f0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
20300 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20310 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  E_FULL;.      }.
20320 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
20330 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
20340 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
20350 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 50 67  Size);.      pPg
20360 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 6e 6f 43  ->needRead = noC
20370 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61 67 65  ontent && !pPage
20380 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
20390 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  k;.      IOTRACE
203a0 28 28 22 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22  (("ZERO %p %d\n"
203b0 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29  , pPager, pgno))
203c0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
203d0 20 20 20 72 63 20 3d 20 72 65 61 64 44 62 50 61     rc = readDbPa
203e0 67 65 28 70 50 61 67 65 72 2c 20 70 50 67 2c 20  ge(pPager, pPg, 
203f0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28  pgno);.      if(
20400 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
20410 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45  & rc!=SQLITE_IOE
20420 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b  RR_SHORT_READ ){
20430 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67  .        pPg->pg
20440 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  no = 0;.        
20450 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20460 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20  f(pPg);.        
20470 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
20480 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65   }.      pPg->ne
20490 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20 20  edRead = 0;.    
204a0 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74  }..    /* Link t
204b0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
204c0 20 70 61 67 65 20 68 61 73 68 20 74 61 62 6c 65   page hash table
204d0 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f   */.    h = pgno
204e0 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
204f0 68 2d 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74  h-1);.    assert
20500 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20  ( pgno!=0 );.   
20510 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
20520 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
20530 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  h];.    pPager->
20540 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
20550 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65      if( pPg->pNe
20560 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20  xtHash ){.      
20570 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65  assert( pPg->pNe
20580 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
20590 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50  h==0 );.      pP
205a0 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
205b0 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
205c0 20 20 20 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c     }..#ifdef SQL
205d0 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
205e0 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
205f0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
20600 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
20610 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
20620 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
20630 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
20640 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
20650 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
20660 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31  Ref>0 || pgno==1
20670 29 3b 0a 20 20 20 20 50 41 47 45 52 5f 49 4e 43  );.    PAGER_INC
20680 52 28 70 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b  R(pPager->nHit);
20690 0a 20 20 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74  .    if( !noCont
206a0 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20  ent ){.      rc 
206b0 3d 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74  = pager_get_cont
206c0 65 6e 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ent(pPg);.      
206d0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
206e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
206f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
20700 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
20710 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 70 50  }.  *ppPage = pP
20720 67 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  g;.  return SQLI
20730 54 45 5f 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c  TE_OK;.}.int sql
20740 69 74 65 33 50 61 67 65 72 41 63 71 75 69 72 65  ite3PagerAcquire
20750 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
20760 72 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70  r,      /* The p
20770 61 67 65 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65  ager open on the
20780 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
20790 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20  /.  Pgno pgno,  
207a0 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20          /* Page 
207b0 6e 75 6d 62 65 72 20 74 6f 20 66 65 74 63 68 20  number to fetch 
207c0 2a 2f 0a 20 20 44 62 50 61 67 65 20 2a 2a 70 70  */.  DbPage **pp
207d0 50 61 67 65 2c 20 20 20 20 2f 2a 20 57 72 69 74  Page,    /* Writ
207e0 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
207f0 68 65 20 70 61 67 65 20 68 65 72 65 20 2a 2f 0a  he page here */.
20800 20 20 69 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20    int noContent 
20810 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
20820 62 6f 74 68 65 72 20 72 65 61 64 69 6e 67 20 63  bother reading c
20830 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b  ontent from disk
20840 20 69 66 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20   if true */.){. 
20850 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
20860 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
20870 20 72 63 20 3d 20 70 61 67 65 72 41 63 71 75 69   rc = pagerAcqui
20880 72 65 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c  re(pPager, pgno,
20890 20 70 70 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65   ppPage, noConte
208a0 6e 74 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  nt);.  pagerLeav
208b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
208c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
208d0 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
208e0 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61 64   if it is alread
208f0 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  y in the in-memo
20900 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a  ry cache.  Do.**
20910 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70 61   not read the pa
20920 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52  ge from disk.  R
20930 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20  eturn a pointer 
20940 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20  to the page,.** 
20950 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67 65  or 0 if the page
20960 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65   is not in cache
20970 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
20980 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
20990 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72 65  ().  The differe
209a0 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69 73  nce between this
209b0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20   routine.** and 
209c0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
209d0 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28 29  ) is that _get()
209e0 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20   will go to the 
209f0 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a  disk and read.**
20a00 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66 20   in the page if 
20a10 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
20a20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68 65  already in cache
20a30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
20a40 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20  ** returns NULL 
20a50 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
20a60 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20 69  ot in cache or i
20a70 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72 72  f a disk I/O err
20a80 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72 20  or .** has ever 
20a90 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50  happened..*/.DbP
20aa0 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67 65  age *sqlite3Page
20ab0 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  rLookup(Pager *p
20ac0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
20ad0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
20ae0 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
20af0 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61  pPager!=0 );.  a
20b00 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
20b10 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
20b20 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
20b30 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
20b40 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
20b50 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
20b60 72 2d 3e 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65  r->pAll || pPage
20b70 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
20b80 20 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20   );.  }else if( 
20b90 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
20ba0 26 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  && pPager->errCo
20bb0 64 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  de!=SQLITE_FULL 
20bc0 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  ){.    /* Do not
20bd0 68 69 6e 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20  hing */.  }else 
20be0 69 66 28 20 28 70 50 67 20 3d 20 70 61 67 65 72  if( (pPg = pager
20bf0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
20c00 70 67 6e 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20  pgno))!=0 ){.   
20c10 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
20c20 20 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65    }.  pagerLeave
20c30 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
20c40 72 6e 20 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  rn pPg;.}../*.**
20c50 20 52 65 6c 65 61 73 65 20 61 20 70 61 67 65 2e   Release a page.
20c60 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
20c70 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
20c80 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  es to the page d
20c90 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65  rop to zero, the
20ca0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 69 73  n the.** page is
20cb0 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 4c 52   added to the LR
20cc0 55 20 6c 69 73 74 2e 20 20 57 68 65 6e 20 61 6c  U list.  When al
20cd0 6c 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  l references to 
20ce0 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20 61 72 65  all pages.** are
20cf0 20 72 65 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c   released, a rol
20d00 6c 62 61 63 6b 20 6f 63 63 75 72 73 20 61 6e 64  lback occurs and
20d10 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65   the lock on the
20d20 20 64 61 74 61 62 61 73 65 20 69 73 0a 2a 2a 20   database is.** 
20d30 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20  removed..*/.int 
20d40 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
20d50 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
20d60 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
20d70 0a 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  ..  if( pPg==0 )
20d80 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
20d90 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 50  K;.  pPager = pP
20da0 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
20db0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
20dc0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
20dd0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
20de0 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  /.  assert( pPg-
20df0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61 67  >nRef>0 );.  pag
20e00 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50 61  erEnter(pPg->pPa
20e10 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65  ger);.  pPg->nRe
20e20 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41  f--;..  CHECK_PA
20e30 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57  GE(pPg);..  /* W
20e40 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  hen the number o
20e50 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
20e60 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20  a page reach 0, 
20e70 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65  call the.  ** de
20e80 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64  structor and add
20e90 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65   the page to the
20ea0 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a   freelist..  */.
20eb0 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
20ec0 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69  =0 ){..    lruLi
20ed0 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20 20  stAdd(pPg);.    
20ee0 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73  if( pPager->xDes
20ef0 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20  tructor ){.     
20f00 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
20f10 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72  ctor(pPg, pPager
20f20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
20f30 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65   }.  .    /* Whe
20f40 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63  n all pages reac
20f50 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  h the freelist, 
20f60 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f  drop the read lo
20f70 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74  ck from.    ** t
20f80 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
20f90 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61  ..    */.    pPa
20fa0 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20  ger->nRef--;.   
20fb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20fc0 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20  >nRef>=0 );.    
20fd0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  if( pPager->nRef
20fe0 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d  ==0 && (!pPager-
20ff0 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c  >exclusiveMode |
21000 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
21010 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20  lOff>0) ){.     
21020 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
21030 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
21040 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67  .    }.  }.  pag
21050 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
21060 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
21070 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72  _OK;.}../*.** Cr
21080 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66  eate a journal f
21090 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20  ile for pPager. 
210a0 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c   There should al
210b0 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52  ready be a RESER
210c0 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53  VED.** or EXCLUS
210d0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
210e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68  database file wh
210f0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
21100 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a  is called..**.**
21110 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
21120 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e  K if everything.
21130 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f    Return an erro
21140 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61  r code and relea
21150 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20  se the.** write 
21160 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67  lock if anything
21170 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
21180 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
21190 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61  _open_journal(Pa
211a0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
211b0 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66  sqlite3_vfs *pVf
211c0 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73  s = pPager->pVfs
211d0 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d 20  ;.  int flags = 
211e0 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  (SQLITE_OPEN_REA
211f0 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50  DWRITE|SQLITE_OP
21200 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51 4c  EN_EXCLUSIVE|SQL
21210 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29  ITE_OPEN_CREATE)
21220 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61  ;..  int rc;.  a
21230 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
21240 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
21250 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
21260 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61 73  RESERVED );.  as
21270 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
21280 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61 73  eJournal );.  as
21290 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
212a0 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
212b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67   sqlite3PagerPag
212c0 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
212d0 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61    pagerLeave(pPa
212e0 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
212f0 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  pInJournal = sql
21300 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74 65  ite3BitvecCreate
21310 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29  (pPager->dbSize)
21320 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
21330 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
21340 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
21350 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
21360 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
21370 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
21380 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
21390 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
213a0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
213b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
213c0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
213d0 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
213e0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45  SQLITE_OPEN_DELE
213f0 54 45 4f 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45  TEONCLOSE|SQLITE
21400 5f 4f 50 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e  _OPEN_TEMP_JOURN
21410 41 4c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  AL);.    }else{.
21420 20 20 20 20 20 20 66 6c 61 67 73 20 7c 3d 20 28        flags |= (
21430 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e  SQLITE_OPEN_MAIN
21440 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 7d  _JOURNAL);.    }
21450 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
21460 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52 49  NABLE_ATOMIC_WRI
21470 54 45 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  TE.    rc = sqli
21480 74 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a  te3JournalOpen(.
21490 20 20 20 20 20 20 20 20 70 56 66 73 2c 20 70 50          pVfs, pP
214a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
214b0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
214c0 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65 72 53 69  gs, jrnlBufferSi
214d0 7a 65 28 70 50 61 67 65 72 29 0a 20 20 20 20 29  ze(pPager).    )
214e0 3b 0a 23 65 6c 73 65 0a 20 20 20 20 72 63 20 3d  ;.#else.    rc =
214f0 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70   sqlite3OsOpen(p
21500 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
21510 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a  urnal, pPager->j
21520 66 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23  fd, flags, 0);.#
21530 65 6e 64 69 66 0a 20 20 20 20 61 73 73 65 72 74  endif.    assert
21540 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
21550 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e  || pPager->jfd->
21560 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20  pMethods );.    
21570 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
21580 66 66 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ff = 0;.    pPag
21590 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
215a0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  0;.    pPager->j
215b0 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20  ournalHdr = 0;. 
215c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
215d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
215e0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d  ( rc==SQLITE_NOM
215f0 45 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  EM ){.        sq
21600 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56  lite3OsDelete(pV
21610 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
21620 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  rnal, 0);.      
21630 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 66 61 69  }.      goto fai
21640 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
21650 6e 61 6c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  nal;.    }.  }. 
21660 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
21670 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67  Open = 1;.  pPag
21680 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
21690 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ed = 0;.  pPager
216a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
216b0 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
216c0 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20  Rollback = 0;.  
216d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
216e0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
216f0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72  errCode ){.    r
21700 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  c = pPager->errC
21710 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61  ode;.    goto fa
21720 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75  iled_to_open_jou
21730 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67  rnal;.  }.  pPag
21740 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
21750 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
21760 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
21770 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
21780 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
21790 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
217a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
217b0 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
217c0 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e  e3PagerStmtBegin
217d0 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
217e0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
217f0 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
21800 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51 4c  NOMEM && rc!=SQL
21810 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 20  ITE_IOERR_NOMEM 
21820 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
21830 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
21840 6e 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20  n(pPager, 0);.  
21850 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
21860 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
21870 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
21880 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
21890 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
218a0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
218b0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44 65   sqlite3BitvecDe
218c0 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70 49  stroy(pPager->pI
218d0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
218e0 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20  ger->pInJournal 
218f0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 0;.  return rc
21900 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
21910 72 65 20 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20  re a write-lock 
21920 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
21930 20 20 54 68 65 20 6c 6f 63 6b 20 69 73 20 72 65    The lock is re
21940 6d 6f 76 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68  moved when.** th
21950 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c  e any of the fol
21960 6c 6f 77 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a  lowing happen:.*
21970 2a 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  *.**   *  sqlite
21980 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
21990 65 54 77 6f 28 29 20 69 73 20 63 61 6c 6c 65 64  eTwo() is called
219a0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
219b0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
219c0 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20   is called..**  
219d0 20 2a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72   *  sqlite3Pager
219e0 43 6c 6f 73 65 28 29 20 69 73 20 63 61 6c 6c 65  Close() is calle
219f0 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
21a00 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 20 69  e3PagerUnref() i
21a10 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 6e 20 65  s called to on e
21a20 76 65 72 79 20 6f 75 74 73 74 61 6e 64 69 6e 67  very outstanding
21a30 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   page..**.** The
21a40 20 66 69 72 73 74 20 70 61 72 61 6d 65 74 65 72   first parameter
21a50 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
21a60 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f   is a pointer to
21a70 20 61 6e 79 20 6f 70 65 6e 20 70 61 67 65 20 6f   any open page o
21a80 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
21a90 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68 69 6e 67  e file.  Nothing
21aa0 20 63 68 61 6e 67 65 73 20 61 62 6f 75 74 20 74   changes about t
21ab0 68 65 20 70 61 67 65 20 2d 20 69 74 20 69 73 20  he page - it is 
21ac0 75 73 65 64 20 6d 65 72 65 6c 79 20 74 6f 0a 2a  used merely to.*
21ad0 2a 20 61 63 71 75 69 72 65 20 61 20 70 6f 69 6e  * acquire a poin
21ae0 74 65 72 20 74 6f 20 74 68 65 20 50 61 67 65 72  ter to the Pager
21af0 20 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 61   structure and a
21b00 73 20 70 72 6f 6f 66 20 74 68 61 74 20 74 68 65  s proof that the
21b10 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65 61 64 79  re is.** already
21b20 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 6f 6e 20   a read-lock on 
21b30 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
21b40 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e 64 20 70  .** The second p
21b50 61 72 61 6d 65 74 65 72 20 69 6e 64 69 63 61 74  arameter indicat
21b60 65 73 20 68 6f 77 20 6d 75 63 68 20 73 70 61 63  es how much spac
21b70 65 20 69 6e 20 62 79 74 65 73 20 74 6f 20 72 65  e in bytes to re
21b80 73 65 72 76 65 20 66 6f 72 20 61 0a 2a 2a 20 6d  serve for a.** m
21b90 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
21ba0 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68 65 20 73  le-name at the s
21bb0 74 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72  tart of the jour
21bc0 6e 61 6c 20 77 68 65 6e 20 69 74 20 69 73 20 63  nal when it is c
21bd0 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  reated..**.** A 
21be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
21bf0 6f 70 65 6e 65 64 20 69 66 20 74 68 69 73 20 69  opened if this i
21c00 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f 72 61 72  s not a temporar
21c10 79 20 66 69 6c 65 2e 20 20 46 6f 72 20 74 65 6d  y file.  For tem
21c20 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c 65 73 2c  porary.** files,
21c30 20 74 68 65 20 6f 70 65 6e 69 6e 67 20 6f 66 20   the opening of 
21c40 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
21c50 20 69 73 20 64 65 66 65 72 72 65 64 20 75 6e 74   is deferred unt
21c60 69 6c 20 74 68 65 72 65 20 69 73 20 61 6e 0a 2a  il there is an.*
21c70 2a 20 61 63 74 75 61 6c 20 6e 65 65 64 20 74 6f  * actual need to
21c80 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f   write to the jo
21c90 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urnal..**.** If 
21ca0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
21cb0 61 6c 72 65 61 64 79 20 72 65 73 65 72 76 65 64  already reserved
21cc0 20 66 6f 72 20 77 72 69 74 69 6e 67 2c 20 74 68   for writing, th
21cd0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
21ce0 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  no-op..**.** If 
21cf0 65 78 46 6c 61 67 20 69 73 20 74 72 75 65 2c 20  exFlag is true, 
21d00 67 6f 20 61 68 65 61 64 20 61 6e 64 20 67 65 74  go ahead and get
21d10 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   an EXCLUSIVE lo
21d20 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c 65 0a 2a  ck on the file.*
21d30 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e  * immediately in
21d40 73 74 65 61 64 20 6f 66 20 77 61 69 74 69 6e 67  stead of waiting
21d50 20 75 6e 74 69 6c 20 77 65 20 74 72 79 20 74 6f   until we try to
21d60 20 66 6c 75 73 68 20 74 68 65 20 63 61 63 68 65   flush the cache
21d70 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46 6c 61 67  .  The.** exFlag
21d80 20 69 73 20 69 67 6e 6f 72 65 64 20 69 66 20 61   is ignored if a
21d90 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
21da0 61 6c 72 65 61 64 79 20 61 63 74 69 76 65 2e 0a  already active..
21db0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
21dc0 67 65 72 42 65 67 69 6e 28 44 62 50 61 67 65 20  gerBegin(DbPage 
21dd0 2a 70 50 67 2c 20 69 6e 74 20 65 78 46 6c 61 67  *pPg, int exFlag
21de0 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
21df0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
21e00 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
21e10 49 54 45 5f 4f 4b 3b 0a 20 20 70 61 67 65 72 45  ITE_OK;.  pagerE
21e20 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
21e30 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
21e40 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
21e50 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
21e60 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
21e70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
21e80 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
21e90 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
21ea0 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
21eb0 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
21ec0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
21ed0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
21ee0 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
21ef0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
21f00 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
21f10 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
21f20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
21f30 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
21f40 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
21f50 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
21f60 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
21f80 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
21f90 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
21fa0 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
21fb0 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
21fc0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
21fd0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
21fe0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
21ff0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22000 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
22010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
22020 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76 65        pagerLeave
22030 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
22040 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
22050 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
22060 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
22070 30 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52  0;.      PAGERTR
22080 41 43 45 32 28 22 54 52 41 4e 53 41 43 54 49 4f  ACE2("TRANSACTIO
22090 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  N %d\n", PAGERID
220a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
220b0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65   if( pPager->use
220c0 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70 50 61 67  Journal && !pPag
220d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 0a 20 20 20  er->tempFile.   
220e0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
220f0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
22100 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
22110 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
22120 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70     rc = pager_op
22130 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65  en_journal(pPage
22140 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
22150 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50  }.  }else if( pP
22160 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
22170 6e 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n && pPager->jou
22180 72 6e 61 6c 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  rnalOff==0 ){.  
22190 20 20 2f 2a 20 54 68 69 73 20 68 61 70 70 65 6e    /* This happen
221a0 73 20 77 68 65 6e 20 74 68 65 20 70 61 67 65 72  s when the pager
221b0 20 77 61 73 20 69 6e 20 65 78 63 6c 75 73 69 76   was in exclusiv
221c0 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74 68  e-access mode th
221d0 65 20 6c 61 73 74 0a 20 20 20 20 2a 2a 20 74 69  e last.    ** ti
221e0 6d 65 20 61 20 28 72 65 61 64 20 6f 72 20 77 72  me a (read or wr
221f0 69 74 65 29 20 74 72 61 6e 73 61 63 74 69 6f 6e  ite) transaction
22200 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
22210 79 20 63 6f 6e 63 6c 75 64 65 64 0a 20 20 20 20  y concluded.    
22220 2a 2a 20 62 79 20 74 68 69 73 20 63 6f 6e 6e 65  ** by this conne
22230 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61 64 20 6f  ction. Instead o
22240 66 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6a  f deleting the j
22250 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 20 77  ournal file it w
22260 61 73 20 0a 20 20 20 20 2a 2a 20 6b 65 70 74 20  as .    ** kept 
22270 6f 70 65 6e 20 61 6e 64 20 65 69 74 68 65 72 20  open and either 
22280 77 61 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f  was truncated to
22290 20 30 20 62 79 74 65 73 20 6f 72 20 69 74 73 20   0 bytes or its 
222a0 68 65 61 64 65 72 20 77 61 73 0a 20 20 20 20 2a  header was.    *
222b0 2a 20 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69  * overwritten wi
222c0 74 68 20 7a 65 72 6f 73 2e 0a 20 20 20 20 2a 2f  th zeros..    */
222d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
222e0 67 65 72 2d 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a  ger->nRec==0 );.
222f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
22300 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
22310 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28  0 );.    assert(
22320 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
22330 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 73 71  nal==0 );.    sq
22340 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f  lite3PagerPageco
22350 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  unt(pPager);.   
22360 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
22370 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
22380 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
22390 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
223a0 65 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  e( pPager->dbSiz
223b0 65 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e  e );.    pagerEn
223c0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
223d0 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 70 49   if( !pPager->pI
223e0 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
223f0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
22400 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
22410 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
22420 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
22430 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
22440 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
22450 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
22460 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
22470 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t( !pPager->jour
22480 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
22490 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
224a0 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
224b0 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
224c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
224d0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
224e0 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
224f0 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
22500 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
22510 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
22520 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
22530 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
22540 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
22550 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
22560 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
22570 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
22580 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
22590 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
225a0 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
225b0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
225c0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
225d0 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
225e0 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
225f0 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
22600 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
22610 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
22620 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
22630 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
22640 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
22650 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
22660 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
22670 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
22680 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
22690 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
226a0 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
226b0 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
226c0 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
226d0 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
226e0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
226f0 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
22700 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22710 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
22720 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  vDirty==pPg );. 
22730 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
22740 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
22750 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
22760 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
22770 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
22780 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
22790 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
227a0 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
227b0 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
227c0 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
227d0 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
227e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
227f0 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
22800 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
22810 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
22820 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
22830 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
22840 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
22850 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
22860 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
22870 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
22880 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
22890 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
228a0 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
228b0 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
228c0 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
228d0 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
228e0 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
228f0 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
22900 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
22910 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
22920 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
22930 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
22940 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
22950 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
22960 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
22970 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
22980 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
22990 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
229a0 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
229b0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
229c0 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
229d0 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
229e0 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
229f0 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
22a00 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
22a10 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
22a20 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
22a30 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
22a40 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
22a50 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
22a60 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
22a70 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
22a80 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
22a90 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
22aa0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
22ab0 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
22ac0 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
22ad0 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
22ae0 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
22af0 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
22b00 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
22b10 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
22b20 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
22b30 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
22b40 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
22b50 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
22b60 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
22b70 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
22b80 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
22b90 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
22ba0 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
22bb0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
22bc0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
22bd0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
22be0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
22bf0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
22c00 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
22c10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
22c20 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
22c30 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
22c40 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
22c50 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
22c60 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
22c70 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
22c80 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
22c90 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
22ca0 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
22cb0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
22cc0 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
22cd0 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
22ce0 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
22cf0 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
22d00 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
22d10 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
22d20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
22d30 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
22d40 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
22d50 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
22d60 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
22d70 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
22d80 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
22d90 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
22da0 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
22db0 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
22dc0 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
22dd0 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
22de0 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
22df0 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
22e00 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
22e10 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
22e20 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
22e30 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
22e40 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
22e50 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
22e60 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
22e70 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
22e80 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
22e90 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
22ea0 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
22eb0 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
22ec0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
22ed0 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
22ee0 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
22ef0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
22f00 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
22f10 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
22f20 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
22f30 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
22f40 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
22f50 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
22f60 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
22f70 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
22f80 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
22f90 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  he = 1;.    pPag
22fa0 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20 3d  er->dbModified =
22fb0 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20   1;.  }else{..  
22fc0 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74    /* If we get t
22fd0 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e  his far, it mean
22fe0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20  s that the page 
22ff0 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20  needs to be.    
23000 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  ** written to th
23010 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
23020 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65  urnal or the cke
23030 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a  ckpoint journal.
23040 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a      ** or both..
23050 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69      **.    ** Fi
23060 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65  rst check to see
23070 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73 61   that the transa
23080 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78  ction journal ex
23090 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20  ists and.    ** 
230a0 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74 20  create it if it 
230b0 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f  does not..    */
230c0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
230d0 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
230e0 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20  R_UNLOCK );.    
230f0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
23100 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a  rBegin(pPg, 0);.
23110 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
23130 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
23140 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
23150 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
23160 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
23170 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
23180 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
23190 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 0a  ger->useJournal.
231a0 20 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61            && pPa
231b0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65  ger->journalMode
231c0 21 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d  !=PAGER_JOURNALM
231d0 4f 44 45 5f 4f 46 46 20 29 7b 0a 20 20 20 20 20  ODE_OFF ){.     
231e0 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
231f0 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
23200 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
23210 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
23220 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
23230 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
23240 63 68 65 20 3d 20 31 3b 0a 20 20 20 20 70 50 61  che = 1;.    pPa
23250 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
23260 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 54  = 1;.  .    /* T
23270 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
23280 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73 74  ournal now exist
23290 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61 20  s and we have a 
232a0 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a 20  RESERVED or an. 
232b0 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
232c0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e  lock on the main
232d0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
232e0 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72 65   Write the curre
232f0 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a  nt page to.    *
23300 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * the transactio
23310 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74 20  n journal if it 
23320 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c 72  is not there alr
23330 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  eady..    */.   
23340 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
23350 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72 2d  rnal && (pPager-
23360 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20  >journalOpen || 
23370 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
23380 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
23390 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
233a0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
233b0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
233c0 0a 20 20 20 20 20 20 20 20 20 20 50 67 48 69 73  .          PgHis
233d0 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
233e0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
233f0 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
23400 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
23410 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
23420 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
23430 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
23440 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
23450 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
23460 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
23470 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
23480 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
23490 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
234a0 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ize );.         
234b0 20 69 66 28 20 21 70 48 69 73 74 2d 3e 70 4f 72   if( !pHist->pOr
234c0 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
234d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
234e0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
234f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d   }.          mem
23500 63 70 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  cpy(pHist->pOrig
23510 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
23520 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
23530 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
23540 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23550 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 20    u32 cksum;.   
23560 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
23570 74 61 32 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  ta2;..          
23580 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20 6e 65 76  /* We should nev
23590 65 72 20 77 72 69 74 65 20 74 6f 20 74 68 65 20  er write to the 
235a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65  journal file the
235b0 20 70 61 67 65 20 74 68 61 74 0a 20 20 20 20 20   page that.     
235c0 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73       ** contains
235d0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
235e0 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77  cks.  The follow
235f0 69 6e 67 20 61 73 73 65 72 74 20 76 65 72 69 66  ing assert verif
23600 69 65 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ies.          **
23610 20 74 68 61 74 20 77 65 20 64 6f 20 6e 6f 74 2e   that we do not.
23620 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 61 73   */.          as
23630 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e 6f 21  sert( pPg->pgno!
23640 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
23650 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20  Pager) );.      
23660 20 20 20 20 70 44 61 74 61 32 20 3d 20 43 4f 44      pData2 = COD
23670 45 43 32 28 70 50 61 67 65 72 2c 20 70 44 61 74  EC2(pPager, pDat
23680 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
23690 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
236a0 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
236b0 70 50 61 67 65 72 2c 20 28 75 38 2a 29 70 44 61  pPager, (u8*)pDa
236c0 74 61 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ta2);.          
236d0 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
236e0 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  (pPager->jfd, pP
236f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
23700 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
23710 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23720 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23730 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
23740 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
23750 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32  ger->jfd, pData2
23760 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
23770 7a 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ze,.            
23780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23790 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
237a0 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a 20 20 20  nalOff + 4);.   
237b0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
237c0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70  >journalOff += p
237d0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
237e0 34 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  4;.          }. 
237f0 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d           if( rc=
23800 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23810 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77            rc = w
23820 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
23830 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
23840 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63 6b 73 75  journalOff, cksu
23850 6d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  m);.            
23860 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
23870 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 20 20 20  ff += 4;.       
23880 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 49     }.          I
23890 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20 25 70  OTRACE(("JOUT %p
238a0 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20   %d %lld %d\n", 
238b0 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
238c0 6f 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  o, .            
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 2c 20 70 50 61 67 65  ournalOff, pPage
238f0 72 2d 3e 70 61 67 65 53 69 7a 65 29 29 3b 0a 20  r->pageSize));. 
23900 20 20 20 20 20 20 20 20 20 50 41 47 45 52 5f 49           PAGER_I
23910 4e 43 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65  NCR(sqlite3_page
23920 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74 29 3b  r_writej_count);
23930 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52  .          PAGER
23940 54 52 41 43 45 35 28 22 4a 4f 55 52 4e 41 4c 20  TRACE5("JOURNAL 
23950 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
23960 79 6e 63 3d 25 64 20 68 61 73 68 28 25 30 38 78  ync=%d hash(%08x
23970 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  )\n",.          
23980 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
23990 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
239a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20   pPg->needSync, 
239b0 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70  pager_pagehash(p
239c0 50 67 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  Pg));..         
239d0 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 68 61 73   /* An error has
239e0 20 6f 63 63 75 72 65 64 20 77 72 69 74 69 6e 67   occured writing
239f0 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   to the journal 
23a00 66 69 6c 65 2e 20 54 68 65 20 0a 20 20 20 20 20  file. The .     
23a10 20 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74       ** transact
23a20 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 6f 6c 6c  ion will be roll
23a30 65 64 20 62 61 63 6b 20 62 79 20 74 68 65 20 6c  ed back by the l
23a40 61 79 65 72 20 61 62 6f 76 65 2e 0a 20 20 20 20  ayer above..    
23a50 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
23a60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23a70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
23a80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
23a90 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
23aa0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
23ab0 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ec++;.          
23ac0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23ad0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
23ae0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
23af0 65 33 42 69 74 76 65 63 53 65 74 28 70 50 61 67  e3BitvecSet(pPag
23b00 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->pInJournal, 
23b10 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
23b20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
23b30 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e  ync = !pPager->n
23b40 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20  oSync;.         
23b50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
23b60 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
23b70 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
23b80 76 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70  vecSet(pPager->p
23b90 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e  InStmt, pPg->pgn
23ba0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  o);.          }.
23bb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23bc0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
23bd0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
23be0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
23bf0 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67 65  tarted && !pPage
23c00 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20  r->noSync;.     
23c10 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28 22     PAGERTRACE4("
23c20 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
23c30 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
23c40 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
23c50 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
23c60 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
23c70 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
23c80 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
23c90 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
23ca0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
23cb0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
23cc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
23cd0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
23ce0 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
23cf0 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
23d00 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
23d10 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
23d20 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
23d30 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
23d40 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
23d50 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
23d60 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
23d70 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
23d80 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
23d90 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
23da0 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
23db0 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
23dc0 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
23dd0 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
23de0 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
23df0 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
23e00 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
23e10 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20 26  tmtInUse .     &
23e20 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d 65  & !pageInStateme
23e30 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26 26  nt(pPg) .     &&
23e40 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
23e50 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
23e60 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  e .    ){.      
23e70 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
23e80 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70  ournal || (int)p
23e90 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d  Pg->pgno>pPager-
23ea0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
23eb0 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
23ec0 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74  {.        PgHist
23ed0 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
23ee0 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
23ef0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
23f00 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
23f10 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pStmt==0 );.    
23f20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
23f30 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
23f40 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  c( pPager->pageS
23f50 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
23f60 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
23f70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
23f80 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
23f90 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
23fa0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
23fb0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
23fc0 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45 52   }.        PAGER
23fd0 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
23fe0 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
23ff0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
24000 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
24010 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61 64  .        page_ad
24020 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
24030 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  Pg);.      }else
24040 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f 66  {.        i64 of
24050 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 73  fset = pPager->s
24060 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67 65  tmtNRec*(4+pPage
24070 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
24080 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
24090 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
240a0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
240b0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
240c0 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
240d0 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  ts(pPager->stfd,
240e0 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70 67   offset, pPg->pg
240f0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  no);.        if(
24100 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24110 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
24120 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
24130 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44  pPager->stfd, pD
24140 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61  ata2, pPager->pa
24150 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b 34  geSize, offset+4
24160 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
24170 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33       PAGERTRACE3
24180 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25  ("STMT-JOURNAL %
24190 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
241a0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
241b0 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
241c0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
241d0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
241e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
241f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
24200 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b  Pager->stmtNRec+
24210 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  +;.        asser
24220 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  t( pPager->pInSt
24230 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  mt!=0 );.       
24240 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 53 65   sqlite3BitvecSe
24250 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  t(pPager->pInStm
24260 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  t, pPg->pgno);. 
24270 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
24280 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
24290 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
242a0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
242b0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
242c0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
242d0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
242e0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
242f0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
24300 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
24310 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
24320 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
24330 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
24340 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
24350 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24360 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
24370 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
24380 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
24390 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
243a0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
243b0 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
243c0 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
243d0 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
243e0 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
243f0 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
24400 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
24410 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
24420 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
24430 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
24440 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
24450 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
24460 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
24470 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
24480 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
24490 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
244a0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
244b0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
244c0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
244d0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
244e0 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
244f0 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
24500 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
24510 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
24520 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
24530 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
24540 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
24550 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
24560 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
24570 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
24580 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
24590 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
245a0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
245b0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
245c0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
245d0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
245e0 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
245f0 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
24600 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
24610 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ze);..  pagerEnt
24620 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
24630 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 50 61 67  ( !MEMDB && nPag
24640 65 50 65 72 53 65 63 74 6f 72 3e 31 20 29 7b 0a  ePerSector>1 ){.
24650 20 20 20 20 50 67 6e 6f 20 6e 50 61 67 65 43 6f      Pgno nPageCo
24660 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  unt;          /*
24670 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66   Total number of
24680 20 70 61 67 65 73 20 69 6e 20 64 61 74 61 62 61   pages in databa
24690 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 50  se file */.    P
246a0 67 6e 6f 20 70 67 31 3b 20 20 20 20 20 20 20 20  gno pg1;        
246b0 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
246c0 74 20 70 61 67 65 20 6f 66 20 74 68 65 20 73 65  t page of the se
246d0 63 74 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61  ctor pPg is loca
246e0 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20 20 20 69  ted on. */.    i
246f0 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
24700 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24710 65 72 20 6f 66 20 70 61 67 65 73 20 73 74 61 72  er of pages star
24720 74 69 6e 67 20 61 74 20 70 67 31 20 74 6f 20 6a  ting at pg1 to j
24730 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20 20 69 6e  ournal */.    in
24740 74 20 69 69 3b 0a 20 20 20 20 69 6e 74 20 6e 65  t ii;.    int ne
24750 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20  edSync = 0;..   
24760 20 2f 2a 20 53 65 74 20 74 68 65 20 64 6f 4e 6f   /* Set the doNo
24770 74 53 79 6e 63 20 66 6c 61 67 20 74 6f 20 31 2e  tSync flag to 1.
24780 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
24790 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c 6c 6f 77   we cannot allow
247a0 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a   a journal.    *
247b0 2a 20 68 65 61 64 65 72 20 74 6f 20 62 65 20 77  * header to be w
247c0 72 69 74 74 65 6e 20 62 65 74 77 65 65 6e 20 74  ritten between t
247d0 68 65 20 70 61 67 65 73 20 6a 6f 75 72 6e 61 6c  he pages journal
247e0 65 64 20 62 79 20 74 68 69 73 20 66 75 6e 63 74  ed by this funct
247f0 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
24800 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24810 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
24820 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
24830 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20 20 20 20  tSync = 1;..    
24840 2f 2a 20 54 68 69 73 20 74 72 69 63 6b 20 61 73  /* This trick as
24850 73 75 6d 65 73 20 74 68 61 74 20 62 6f 74 68 20  sumes that both 
24860 74 68 65 20 70 61 67 65 2d 73 69 7a 65 20 61 6e  the page-size an
24870 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 61 72  d sector-size ar
24880 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65  e.    ** an inte
24890 67 65 72 20 70 6f 77 65 72 20 6f 66 20 32 2e 20  ger power of 2. 
248a0 49 74 20 73 65 74 73 20 76 61 72 69 61 62 6c 65  It sets variable
248b0 20 70 67 31 20 74 6f 20 74 68 65 20 69 64 65 6e   pg1 to the iden
248c0 74 69 66 69 65 72 0a 20 20 20 20 2a 2a 20 6f 66  tifier.    ** of
248d0 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65 20   the first page 
248e0 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70 50  of the sector pP
248f0 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e 2e  g is located on.
24900 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 67 31 20  .    */.    pg1 
24910 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29  = ((pPg->pgno-1)
24920 20 26 20 7e 28 6e 50 61 67 65 50 65 72 53 65 63   & ~(nPagePerSec
24930 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a 0a 20 20  tor-1)) + 1;..  
24940 20 20 6e 50 61 67 65 43 6f 75 6e 74 20 3d 20 73    nPageCount = s
24950 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65 63  qlite3PagerPagec
24960 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
24970 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3e    if( pPg->pgno>
24980 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b 0a 20 20  nPageCount ){.  
24990 20 20 20 20 6e 50 61 67 65 20 3d 20 28 70 50 67      nPage = (pPg
249a0 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29 2b 31 3b  ->pgno - pg1)+1;
249b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
249c0 70 67 31 2b 6e 50 61 67 65 50 65 72 53 65 63 74  pg1+nPagePerSect
249d0 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f 75 6e 74  or-1)>nPageCount
249e0 20 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20   ){.      nPage 
249f0 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b 31 2d 70  = nPageCount+1-p
24a00 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g1;.    }else{. 
24a10 20 20 20 20 20 6e 50 61 67 65 20 3d 20 6e 50 61       nPage = nPa
24a20 67 65 50 65 72 53 65 63 74 6f 72 3b 0a 20 20 20  gePerSector;.   
24a30 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 6e 50   }.    assert(nP
24a40 61 67 65 3e 30 29 3b 0a 20 20 20 20 61 73 73 65  age>0);.    asse
24a50 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e 70 67 6e  rt(pg1<=pPg->pgn
24a60 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 28  o);.    assert((
24a70 70 67 31 2b 6e 50 61 67 65 29 3e 70 50 67 2d 3e  pg1+nPage)>pPg->
24a80 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66 6f 72 28  pgno);..    for(
24a90 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67 65 20 26  ii=0; ii<nPage &
24aa0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
24ab0 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 50 67   ii++){.      Pg
24ac0 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69 69 3b 0a  no pg = pg1+ii;.
24ad0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 61        PgHdr *pPa
24ae0 67 65 3b 0a 20 20 20 20 20 20 69 66 28 20 70 67  ge;.      if( pg
24af0 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c 7c 20 21  ==pPg->pgno || !
24b00 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65 73  sqlite3BitvecTes
24b10 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  t(pPager->pInJou
24b20 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a 20 20 20  rnal, pg) ){.   
24b30 20 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47       if( pg!=PAG
24b40 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
24b50 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
24b60 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
24b70 72 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 2c  rGet(pPager, pg,
24b80 20 26 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20   &pPage);.      
24b90 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
24ba0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
24bb0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
24bc0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
24bd0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
24be0 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  age->needSync ){
24bf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  .              n
24c00 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24c10 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
24c20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
24c30 67 65 72 55 6e 72 65 66 28 70 50 61 67 65 29 3b  gerUnref(pPage);
24c40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
24c50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
24c60 73 65 20 69 66 28 20 28 70 50 61 67 65 20 3d 20  se if( (pPage = 
24c70 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
24c80 67 65 72 2c 20 70 67 29 29 21 3d 30 20 29 7b 0a  ger, pg))!=0 ){.
24c90 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
24ca0 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
24cb0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
24cc0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
24cd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
24ce0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67      /* If the Pg
24cf0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
24d00 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
24d10 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
24d20 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
24d30 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
24d40 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
24d50 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
24d60 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
24d70 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
24d80 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
24d90 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
24da0 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
24db0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
24dc0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
24dd0 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
24de0 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
24df0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
24e00 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
24e10 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
24e20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
24e30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
24e40 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
24e50 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
24e60 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
24e70 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
24e80 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
24e90 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
24ea0 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
24eb0 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
24ec0 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e  pPage ) pPage->n
24ed0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24ee0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
24ef0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
24f00 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
24f10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
24f20 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
24f30 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
24f40 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
24f50 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
24f60 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
24f70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
24f80 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
24f90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
24fa0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
24fb0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
24fc0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
24fd0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
24fe0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
24ff0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
25000 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
25010 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
25020 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
25030 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
25040 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
25050 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
25060 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
25070 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
25080 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
25090 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
250a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
250b0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
250c0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
250d0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 74  he pager that it
250e0 20 69 73 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   is not necessar
250f0 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65 20 74 68  y to.** write th
25100 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e  e information on
25110 20 70 61 67 65 20 70 50 67 20 62 61 63 6b 20 74   page pPg back t
25120 6f 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e  o the disk, even
25130 20 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20   though.** that 
25140 70 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61  page might be ma
25150 72 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a  rked as dirty..*
25160 2a 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69  *.** The overlyi
25170 6e 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65  ng software laye
25180 72 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75  r calls this rou
25190 74 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66  tine when all of
251a0 20 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20   the data.** on 
251b0 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69  the given page i
251c0 73 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70  s unused.  The p
251d0 61 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70  ager marks the p
251e0 61 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a  age as clean so.
251f0 2a 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20  ** that it does 
25200 6e 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20  not get written 
25210 74 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54  to disk..**.** T
25220 65 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74  ests show that t
25230 68 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  his optimization
25240 2c 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20  , together with 
25250 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  the.** sqlite3Pa
25260 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
25270 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68  ) below, more th
25280 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70  an double the sp
25290 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20  eed.** of large 
252a0 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e  INSERT operation
252b0 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20  s and quadruple 
252c0 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72  the speed of lar
252d0 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a  ge DELETEs..**.*
252e0 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
252f0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73  ine is called, s
25300 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c  et the alwaysRol
25310 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72  lback flag to tr
25320 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e  ue..** Subsequen
25330 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
25340 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
25350 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
25360 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
25370 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
25380 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
25390 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
253a0 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
253b0 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
253c0 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
253d0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
253e0 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
253f0 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
25400 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
25410 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
25420 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
25430 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
25440 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
25450 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
25460 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
25470 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
25480 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
25490 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
254a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
254b0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
254c0 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 73 71  eused,.** the sq
254d0 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
254e0 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  llback() routine
254f0 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74   is called.  But
25500 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
25510 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 20 63 72  page contains cr
25520 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20  itical data, we 
25530 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65  still need to be
25540 20 73 75 72 65 20 69 74 20 67 65 74 73 0a 2a 2a   sure it gets.**
25550 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20   rolled back in 
25560 73 70 69 74 65 20 6f 66 20 74 68 65 20 73 71 6c  spite of the sql
25570 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
25580 6c 62 61 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f  lback() call..*/
25590 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
255a0 65 72 44 6f 6e 74 57 72 69 74 65 28 44 62 50 61  erDontWrite(DbPa
255b0 67 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20  ge *pDbPage){.  
255c0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44 62  PgHdr *pPg = pDb
255d0 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a 70  Page;.  Pager *p
255e0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
255f0 67 65 72 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44  ger;..  if( MEMD
25600 42 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 61  B ) return;.  pa
25610 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
25620 3b 0a 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  ;.  pPg->alwaysR
25630 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69  ollback = 1;.  i
25640 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 26 26  f( pPg->dirty &&
25650 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
25660 55 73 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  Use ){.    asser
25670 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  t( pPager->state
25680 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 29  >=PAGER_SHARED )
25690 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
256a0 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
256b0 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
256c0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
256d0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
256e0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
256f0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
25700 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
25710 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
25720 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
25730 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
25740 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
25750 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
25760 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
25770 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
25780 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
25790 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
257a0 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
257b0 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
257c0 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
257d0 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
257e0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
257f0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
25800 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
25810 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
25820 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
25830 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
25840 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
25850 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
25860 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
25870 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
25880 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
25890 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
258a0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
258b0 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
258c0 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
258d0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
258e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 50 41 47 45  else{.      PAGE
258f0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52  RTRACE3("DONT_WR
25900 49 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25  ITE page %d of %
25910 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
25920 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
25930 29 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45  );.      IOTRACE
25940 28 28 22 43 4c 45 41 4e 20 25 70 20 25 64 5c 6e  (("CLEAN %p %d\n
25950 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
25960 70 67 6e 6f 29 29 0a 20 20 20 20 20 20 6d 61 6b  pgno)).      mak
25970 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 23 69 66  eClean(pPg);.#if
25980 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
25990 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67  _PAGES.      pPg
259a0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
259b0 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
259c0 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20  ;.#endif.    }. 
259d0 20 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28   }.  pagerLeave(
259e0 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPager);.}../*.*
259f0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
25a00 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
25a10 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
25a20 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
25a30 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
25a40 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
25a50 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
25a60 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
25a70 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
25a80 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
25a90 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
25aa0 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
25ab0 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
25ac0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
25ad0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
25ae0 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
25af0 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
25b00 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
25b10 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
25b20 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
25b30 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
25b40 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
25b50 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
25b60 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
25b70 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
25b80 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
25b90 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
25ba0 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
25bb0 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
25bc0 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
25bd0 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
25be0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
25bf0 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
25c00 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
25c10 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
25c20 67 65 72 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74  ger;..  pagerEnt
25c30 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 61 73  er(pPager);.  as
25c40 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25c50 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52  ate>=PAGER_RESER
25c60 56 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  VED );..  /* If 
25c70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
25c80 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72   is not open, or
25c90 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25ca0 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a   been called on.
25cb0 20 20 2a 2a 20 74 68 69 73 20 70 61 67 65 20 28    ** this page (
25cc0 44 6f 6e 74 57 72 69 74 65 28 29 20 73 65 74 73  DontWrite() sets
25cd0 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
25ce0 61 63 6b 20 66 6c 61 67 29 2c 20 74 68 65 6e 20  ack flag), then 
25cf0 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69  this.  ** functi
25d00 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  on is a no-op.. 
25d10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
25d20 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
25d30 20 7c 7c 20 70 50 67 2d 3e 61 6c 77 61 79 73 52   || pPg->alwaysR
25d40 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
25d50 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
25d60 6b 20 29 7b 0a 20 20 20 20 70 61 67 65 72 4c 65  k ){.    pagerLe
25d70 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
25d80 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 61   return;.  }.  a
25d90 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b  ssert( !MEMDB );
25da0 20 20 20 20 2f 2a 20 46 6f 72 20 61 20 6d 65 6d      /* For a mem
25db0 64 62 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  db, pPager->jour
25dc0 6e 61 6c 4f 70 65 6e 20 69 73 20 61 6c 77 61 79  nalOpen is alway
25dd0 73 20 30 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  s 0 */..#ifdef S
25de0 51 4c 49 54 45 5f 53 45 43 55 52 45 5f 44 45 4c  QLITE_SECURE_DEL
25df0 45 54 45 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  ETE.  if( pPg->i
25e00 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74  nJournal || (int
25e10 29 70 50 67 2d 3e 70 67 6e 6f 20 3e 20 70 50 61  )pPg->pgno > pPa
25e20 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
25e30 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  ){.    return;. 
25e40 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
25e50 49 66 20 53 45 43 55 52 45 5f 44 45 4c 45 54 45  If SECURE_DELETE
25e60 20 69 73 20 64 69 73 61 62 6c 65 64 2c 20 74 68   is disabled, th
25e70 65 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 77  en there is no w
25e80 61 79 20 74 68 61 74 20 74 68 69 73 0a 20 20 2a  ay that this.  *
25e90 2a 20 72 6f 75 74 69 6e 65 20 63 61 6e 20 62 65  * routine can be
25ea0 20 63 61 6c 6c 65 64 20 6f 6e 20 61 20 70 61 67   called on a pag
25eb0 65 20 66 6f 72 20 77 68 69 63 68 20 73 71 6c 69  e for which sqli
25ec0 74 65 33 50 61 67 65 72 44 6f 6e 74 57 72 69 74  te3PagerDontWrit
25ed0 65 28 29 0a 20 20 2a 2a 20 68 61 73 20 6e 6f 74  e().  ** has not
25ee0 20 62 65 65 6e 20 70 72 65 76 69 6f 75 73 6c 79   been previously
25ef0 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74   called during t
25f00 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74  he same transact
25f10 69 6f 6e 2e 0a 20 20 2a 2a 20 41 6e 64 20 69 66  ion..  ** And if
25f20 20 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73   DontWrite() has
25f30 20 70 72 65 76 69 6f 75 73 6c 79 20 62 65 65 6e   previously been
25f40 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 66 6f 6c   called, the fol
25f50 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 6f 6e 64  lowing.  ** cond
25f60 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 20 6d  itions must be m
25f70 65 74 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  et..  */.  asser
25f80 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  t( !pPg->inJourn
25f90 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
25fa0 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
25fb0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20  origDbSize );.. 
25fc0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
25fd0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >pInJournal!=0 )
25fe0 3b 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65  ;.  sqlite3Bitve
25ff0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
26000 4a 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67  Journal, pPg->pg
26010 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f  no);.  pPg->inJo
26020 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67  urnal = 1;.  pPg
26030 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a  ->needRead = 0;.
26040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
26050 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61  mtInUse ){.    a
26060 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
26070 74 6d 74 53 69 7a 65 20 3e 3d 20 70 50 61 67 65  tmtSize >= pPage
26080 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
26090 0a 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76  .    sqlite3Bitv
260a0 65 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49  ecSet(pPager->pI
260b0 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f  nStmt, pPg->pgno
260c0 29 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52  );.  }.  PAGERTR
260d0 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42  ACE3("DONT_ROLLB
260e0 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25  ACK page %d of %
260f0 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  d\n", pPg->pgno,
26100 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
26110 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47  );.  IOTRACE(("G
26120 41 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c  ARBAGE %p %d\n",
26130 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
26140 6e 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76  no)).  pagerLeav
26150 65 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f  e(pPager);.}.../
26160 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
26170 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69  e is called to i
26180 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74  ncrement the dat
26190 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67  abase file chang
261a0 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74  e-counter,.** st
261b0 6f 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20  ored at byte 24 
261c0 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  of the pager fil
261d0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
261e0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
261f0 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20  gecounter(Pager 
26200 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44  *pPager, int isD
26210 69 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20  irect){.  PgHdr 
26220 2a 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63  *pPgHdr;.  u32 c
26230 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20  hange_counter;. 
26240 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
26250 5f 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61  _OK;..  if( !pPa
26260 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74  ger->changeCount
26270 44 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f  Done ){.    /* O
26280 70 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68  pen page 1 of th
26290 65 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69  e file for writi
262a0 6e 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ng. */.    rc = 
262b0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28  sqlite3PagerGet(
262c0 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48  pPager, 1, &pPgH
262d0 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  dr);.    if( rc!
262e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
262f0 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28  urn rc;..    if(
26300 20 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20   !isDirect ){.  
26310 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26320 50 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64  PagerWrite(pPgHd
26330 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
26340 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
26350 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
26360 67 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29  gerUnref(pPgHdr)
26370 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
26380 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
26390 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65   }..    /* Incre
263a0 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a  ment the value j
263b0 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69  ust read and wri
263c0 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79  te it back to by
263d0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
263e0 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73  ange_counter = s
263f0 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28  qlite3Get4byte((
26400 75 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69  u8*)pPager->dbFi
26410 6c 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61  leVers);.    cha
26420 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
26430 20 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63     put32bits(((c
26440 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41  har*)PGHDR_TO_DA
26450 54 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20  TA(pPgHdr))+24, 
26460 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b  change_counter);
26470 0a 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65  ..    if( isDire
26480 63 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64  ct && pPager->fd
26490 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20  ->pMethods ){.  
264a0 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
264b0 7a 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f  zBuf = PGHDR_TO_
264c0 44 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20  DATA(pPgHdr);.  
264d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
264e0 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
264f0 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
26500 2d 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a  ->pageSize, 0);.
26510 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65      }..    /* Re
26520 6c 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72  lease the page r
26530 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20  eference. */.   
26540 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
26550 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  ef(pPgHdr);.    
26560 70 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f  pPager->changeCo
26570 75 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d  untDone = 1;.  }
26580 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
26590 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
265a0 70 61 67 65 72 20 66 69 6c 65 20 74 6f 20 64 69  pager file to di
265b0 73 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  sk..*/.int sqlit
265c0 65 33 50 61 67 65 72 53 79 6e 63 28 50 61 67 65  e3PagerSync(Page
265d0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
265e0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
265f0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
26600 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
26610 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61  (pPager->fd, pPa
26620 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 29  ger->sync_flags)
26630 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
26640 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
26650 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79   rc;.}../*.** Sy
26660 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
26670 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
26680 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
26690 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
266a0 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
266b0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
266c0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
266d0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
266e0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
266f0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
26700 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
26710 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
26720 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
26730 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
26740 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
26750 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
26760 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
26770 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
26780 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
26790 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
267a0 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
267b0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
267c0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
267d0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
267e0 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
267f0 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
26800 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
26810 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
26820 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
26830 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
26840 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
26850 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
26860 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
26870 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
26880 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
26890 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
268a0 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
268b0 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
268c0 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  n sqlite3PagerCo
268d0 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20 63  mmitPhaseOne() c
268e0 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  all..**.** If pa
268f0 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20 69  rameter nTrunc i
26900 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
26910 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65 20   the pager file 
26920 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f 0a  is truncated to.
26930 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73 20  ** nTrunc pages 
26940 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62 79  (this is used by
26950 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61 74   auto-vacuum dat
26960 61 62 61 73 65 73 29 2e 0a 2a 2a 0a 2a 2a 20 49  abases)..**.** I
26970 66 20 74 68 65 20 66 69 6e 61 6c 20 70 61 72 61  f the final para
26980 6d 65 74 65 72 20 2d 20 6e 6f 53 79 6e 63 20 2d  meter - noSync -
26990 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 74   is true, then t
269a0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
269b0 20 69 74 73 65 6c 66 0a 2a 2a 20 69 73 20 6e 6f   itself.** is no
269c0 74 20 73 79 6e 63 65 64 2e 20 54 68 65 20 63 61  t synced. The ca
269d0 6c 6c 65 72 20 6d 75 73 74 20 63 61 6c 6c 20 73  ller must call s
269e0 71 6c 69 74 65 33 50 61 67 65 72 53 79 6e 63 28  qlite3PagerSync(
269f0 29 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a  ) directly to.**
26a00 20 73 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   sync the databa
26a10 73 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20 63  se file before c
26a20 61 6c 6c 69 6e 67 20 43 6f 6d 6d 69 74 50 68 61  alling CommitPha
26a30 73 65 54 77 6f 28 29 20 74 6f 20 64 65 6c 65 74  seTwo() to delet
26a40 65 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  e the.** journal
26a50 20 66 69 6c 65 20 69 6e 20 74 68 69 73 20 63 61   file in this ca
26a60 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  se..*/.int sqlit
26a70 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61  e3PagerCommitPha
26a80 73 65 4f 6e 65 28 0a 20 20 50 61 67 65 72 20 2a  seOne(.  Pager *
26a90 70 50 61 67 65 72 2c 20 0a 20 20 63 6f 6e 73 74  pPager, .  const
26aa0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
26ab0 0a 20 20 50 67 6e 6f 20 6e 54 72 75 6e 63 2c 0a  .  Pgno nTrunc,.
26ac0 20 20 69 6e 74 20 6e 6f 53 79 6e 63 0a 29 7b 0a    int noSync.){.
26ad0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26ae0 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 49 66 20 6e  E_OK;..  /* If n
26af0 6f 20 63 68 61 6e 67 65 73 20 68 61 76 65 20 62  o changes have b
26b00 65 65 6e 20 6d 61 64 65 2c 20 77 65 20 63 61 6e  een made, we can
26b10 20 6c 65 61 76 65 20 74 68 65 20 74 72 61 6e 73   leave the trans
26b20 61 63 74 69 6f 6e 20 65 61 72 6c 79 2e 0a 20 20  action early..  
26b30 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
26b40 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
26b50 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
26b60 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
26b70 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
26b80 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
26b90 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
26ba0 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
26bb0 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
26bc0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
26bd0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
26be0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
26bf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
26c00 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 50  ITE_OK;.  }..  P
26c10 41 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41  AGERTRACE4("DATA
26c20 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
26c30 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
26c40 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
26c50 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
26c60 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
26c70 54 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45  Trunc);.  pagerE
26c80 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  nter(pPager);.. 
26c90 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61   /* If this is a
26ca0 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20  n in-memory db, 
26cb0 6f 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65  or no pages have
26cc0 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
26cd0 2c 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66  , or this.  ** f
26ce0 75 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65  unction has alre
26cf0 61 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c  ady been called,
26d00 20 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a   it is a no-op..
26d10 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
26d20 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
26d30 53 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42  SYNCED && !MEMDB
26d40 20 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74   && pPager->dirt
26d50 79 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67  yCache ){.    Pg
26d60 48 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65  Hdr *pPg;..#ifde
26d70 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
26d80 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20  ATOMIC_WRITE.   
26d90 20 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77   /* The atomic-w
26da0 72 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f  rite optimizatio
26db0 6e 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66  n can be used if
26dc0 20 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20   all of the.    
26dd0 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65  ** following are
26de0 20 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20   true:.    **.  
26df0 20 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69    **    + The fi
26e00 6c 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72  le-system suppor
26e10 74 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72  ts the atomic-wr
26e20 69 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72  ite property for
26e30 0a 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f  .    **      blo
26e40 63 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65  cks of size page
26e50 2d 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a  -size, and.    *
26e60 2a 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d  *    + This comm
26e70 69 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  it is not part o
26e80 66 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74  f a multi-file t
26e90 72 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a  ransaction, and.
26ea0 20 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63      **    + Exac
26eb0 74 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73  tly one page has
26ec0 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61   been modified a
26ed0 6e 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20  nd store in the 
26ee0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20  journal file..  
26ef0 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
26f00 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20  he optimization 
26f10 63 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65  can be used, the
26f20 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
26f30 6c 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20  le will never.  
26f40 20 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20    ** be created 
26f50 66 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63  for this transac
26f60 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tion..    */.   
26f70 20 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72   int useAtomicWr
26f80 69 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20  ite = (.        
26f90 21 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20  !zMaster && .   
26fa0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
26fb0 72 6e 61 6c 4f 70 65 6e 20 26 26 0a 20 20 20 20  rnalOpen &&.    
26fc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
26fd0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
26fe0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26  erSize(pPager) &
26ff0 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e  & .        nTrun
27000 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  c==0 && .       
27010 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69   (0==pPager->pDi
27020 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  rty || 0==pPager
27030 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79  ->pDirty->pDirty
27040 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 61 73 73  ).    );.    ass
27050 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
27060 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67  rnalOpen || pPag
27070 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3d  er->journalMode=
27080 3d 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f  =PAGER_JOURNALMO
27090 44 45 5f 4f 46 46 20 29 3b 0a 20 20 20 20 69 66  DE_OFF );.    if
270a0 28 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65  ( useAtomicWrite
270b0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64   ){.      /* Upd
270c0 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
270d0 6c 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ld in the journa
270e0 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20  l file. */.     
270f0 20 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50   int offset = pP
27100 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
27110 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e   + sizeof(aJourn
27120 61 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20  alMagic);.      
27130 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e  assert(pPager->n
27140 52 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72  Rec==1);.      r
27150 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
27160 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66  pPager->jfd, off
27170 73 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  set, pPager->nRe
27180 63 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70  c);..      /* Up
27190 64 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65  date the db file
271a0 20 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e   change counter.
271b0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
271c0 61 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a  all will modify.
271d0 20 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d        ** the in-
271e0 6d 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74  memory represent
271f0 61 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20  ation of page 1 
27200 74 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75  to include the u
27210 70 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20  pdated.      ** 
27220 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61  change counter a
27230 6e 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61  nd then write pa
27240 67 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f  ge 1 directly to
27250 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
27260 20 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63      ** file. Bec
27270 61 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d  ause of the atom
27280 69 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74  ic-write propert
27290 79 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69  y of the host fi
272a0 6c 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20  le-system, .    
272b0 20 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66    ** this is saf
272c0 65 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  e..      */.    
272d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
272e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
272f0 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
27300 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
27310 67 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  ger, 1);.      }
27320 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27330 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f    rc = sqlite3Jo
27340 75 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67  urnalCreate(pPag
27350 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a  er->jfd);.    }.
27360 0a 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f  .    if( !useAto
27370 6d 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d  micWrite && rc==
27380 53 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64  SQLITE_OK ).#end
27390 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  if..    /* If a 
273a0 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
273b0 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
273c0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
273d0 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
273e0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
273f0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
27400 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
27410 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
27420 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
27430 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
27440 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
27450 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
27460 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
27470 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
27480 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
27490 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
274a0 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
274b0 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
274c0 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
274d0 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
274e0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
274f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
27500 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
27510 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
27520 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
27530 75 6e 74 65 72 28 70 50 61 67 65 72 2c 20 30 29  unter(pPager, 0)
27540 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
27550 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
27560 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
27570 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
27580 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
27590 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
275a0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
275b0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
275c0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
275d0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
275e0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
275f0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
27600 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
27610 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
27620 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
27630 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
27640 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
27650 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
27660 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 69  gno i;.        i
27670 6e 74 20 69 53 6b 69 70 20 3d 20 50 41 47 45 52  nt iSkip = PAGER
27680 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
27690 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 20 69  ;.        for( i
276a0 3d 6e 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50  =nTrunc+1; i<=pP
276b0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
276c0 3b 20 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20  ; i++ ){.       
276d0 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 42     if( !sqlite3B
276e0 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
276f0 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 69 29  ->pInJournal, i)
27700 20 26 26 20 69 21 3d 69 53 6b 69 70 20 29 7b 0a   && i!=iSkip ){.
27710 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
27720 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
27730 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50 67  (pPager, i, &pPg
27740 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
27750 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
27760 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
27770 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
27780 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
27790 57 72 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20  Write(pPg);.    
277a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50          sqlite3P
277b0 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
277c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
277d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
277e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
277f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
27800 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a 23      } .      }.#
27810 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20 3d  endif.      rc =
27820 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
27830 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61 73  nal(pPager, zMas
27840 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ter);.      if( 
27850 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
27860 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
27870 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63 4a        rc = syncJ
27880 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
27890 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
278a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
278b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 23  to sync_exit;..#
278c0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
278d0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20  IT_AUTOVACUUM.  
278e0 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
278f0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ){.      rc = sq
27900 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
27910 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
27920 63 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c);.      if( rc
27930 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
27940 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
27950 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
27960 2f 2a 20 57 72 69 74 65 20 61 6c 6c 20 64 69 72  /* Write all dir
27970 74 79 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ty pages to the 
27980 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
27990 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
279a0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
279b0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
279c0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69    rc = pager_wri
279d0 74 65 5f 70 61 67 65 6c 69 73 74 28 70 50 67 29  te_pagelist(pPg)
279e0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
279f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
27a00 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
27a10 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45  ITE_IOERR_BLOCKE
27a20 44 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 54 68  D );.      /* Th
27a30 65 20 65 72 72 6f 72 20 6d 69 67 68 74 20 68 61  e error might ha
27a40 76 65 20 6c 65 66 74 20 74 68 65 20 64 69 72 74  ve left the dirt
27a50 79 20 6c 69 73 74 20 61 6c 6c 20 66 6f 75 6c 65  y list all foule
27a60 64 20 75 70 20 68 65 72 65 2c 0a 20 20 20 20 20  d up here,.     
27a70 20 2a 2a 20 62 75 74 20 74 68 61 74 20 64 6f 65   ** but that doe
27a80 73 20 6e 6f 74 20 6d 61 74 74 65 72 20 62 65 63  s not matter bec
27a90 61 75 73 65 20 69 66 20 74 68 65 20 69 66 20 74  ause if the if t
27aa0 68 65 20 64 69 72 74 79 20 6c 69 73 74 20 64 69  he dirty list di
27ab0 64 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 20 63  d.      ** get c
27ac0 6f 72 72 75 70 74 65 64 2c 20 74 68 65 6e 20 74  orrupted, then t
27ad0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
27ae0 69 6c 6c 20 72 6f 6c 6c 20 62 61 63 6b 20 61 6e  ill roll back an
27af0 64 0a 20 20 20 20 20 20 2a 2a 20 64 69 73 63 61  d.      ** disca
27b00 72 64 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  rd the dirty lis
27b10 74 2e 20 20 54 68 65 72 65 20 69 73 20 61 6e 20  t.  There is an 
27b20 61 73 73 65 72 74 20 69 6e 0a 20 20 20 20 20 20  assert in.      
27b30 2a 2a 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  ** pager_get_all
27b40 5f 64 69 72 74 79 5f 70 61 67 65 73 28 29 20 74  _dirty_pages() t
27b50 68 61 74 20 76 65 72 69 66 69 65 73 20 74 68 61  hat verifies tha
27b60 74 20 6e 6f 20 61 74 74 65 6d 70 74 0a 20 20 20  t no attempt.   
27b70 20 20 20 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f     ** is made to
27b80 20 75 73 65 20 61 6e 20 69 6e 76 61 6c 69 64 20   use an invalid 
27b90 64 69 72 74 79 20 6c 69 73 74 2e 0a 20 20 20 20  dirty list..    
27ba0 20 20 2a 2f 0a 20 20 20 20 20 20 67 6f 74 6f 20    */.      goto 
27bb0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
27bc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
27bd0 72 74 79 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  rty = 0;..    /*
27be0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
27bf0 73 65 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20  se file. */.    
27c00 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  if( !pPager->noS
27c10 79 6e 63 20 26 26 20 21 6e 6f 53 79 6e 63 20 29  ync && !noSync )
27c20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
27c30 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
27c40 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 73  r->fd, pPager->s
27c50 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20  ync_flags);.    
27c60 7d 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22  }.    IOTRACE(("
27c70 44 42 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  DBSYNC %p\n", pP
27c80 61 67 65 72 29 29 0a 0a 20 20 20 20 70 50 61 67  ager))..    pPag
27c90 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
27ca0 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 65 6c 73  R_SYNCED;.  }els
27cb0 65 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 6e  e if( MEMDB && n
27cc0 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20  Trunc!=0 ){.    
27cd0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
27ce0 72 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  rTruncate(pPager
27cf0 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 7d 0a 0a  , nTrunc);.  }..
27d00 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 69 66 28  sync_exit:.  if(
27d10 20 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52   rc==SQLITE_IOER
27d20 52 5f 42 4c 4f 43 4b 45 44 20 29 7b 0a 20 20 20  R_BLOCKED ){.   
27d30 20 2f 2a 20 70 61 67 65 72 5f 69 6e 63 72 5f 63   /* pager_incr_c
27d40 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 29 20 6d  hangecounter() m
27d50 61 79 20 61 74 74 65 6d 70 74 20 74 6f 20 6f 62  ay attempt to ob
27d60 74 61 69 6e 20 61 6e 20 65 78 63 6c 75 73 69 76  tain an exclusiv
27d70 65 0a 20 20 20 20 20 2a 20 6c 6f 63 6b 20 74 6f  e.     * lock to
27d80 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
27d90 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4f 45 52   and return IOER
27da0 52 5f 42 4c 4f 43 4b 45 44 2e 20 42 75 74 20 73  R_BLOCKED. But s
27db0 69 6e 63 65 20 0a 20 20 20 20 20 2a 20 74 68 65  ince .     * the
27dc0 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63 65 20  re is no chance 
27dd0 74 68 65 20 63 61 63 68 65 20 69 73 20 69 6e 63  the cache is inc
27de0 6f 6e 73 69 73 74 65 6e 74 2c 20 69 74 20 69 73  onsistent, it is
27df0 0a 20 20 20 20 20 2a 20 62 65 74 74 65 72 20 74  .     * better t
27e00 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  o return SQLITE_
27e10 42 55 53 59 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BUSY..     */.  
27e20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
27e30 53 59 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  SY;.  }.  pagerL
27e40 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27e50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
27e60 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20  *.** Commit all 
27e70 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
27e80 61 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65  atabase and rele
27e90 61 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f  ase the write lo
27ea0 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ck..**.** If the
27eb0 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f   commit fails fo
27ec0 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20  r any reason, a 
27ed0 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74  rollback attempt
27ee0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20   is made.** and 
27ef0 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  an error code is
27f00 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74   returned.  If t
27f10 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64  he commit worked
27f20 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69  , SQLITE_OK.** i
27f30 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
27f40 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  nt sqlite3PagerC
27f50 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f 28 50 61  ommitPhaseTwo(Pa
27f60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27f70 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72 20  int rc;.  PgHdr 
27f80 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50 61  *pPg;..  if( pPa
27f90 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a  ger->errCode ){.
27fa0 20 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65      return pPage
27fb0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a  r->errCode;.  }.
27fc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
27fd0 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56  ate<PAGER_RESERV
27fe0 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ED ){.    return
27ff0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
28000 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
28010 3e 64 62 4d 6f 64 69 66 69 65 64 3d 3d 30 20 26  >dbModified==0 &
28020 26 0a 20 20 20 20 20 20 20 20 28 70 50 61 67 65  &.        (pPage
28030 72 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 21 3d  r->journalMode!=
28040 50 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44  PAGER_JOURNALMOD
28050 45 5f 44 45 4c 45 54 45 20 7c 7c 0a 20 20 20 20  E_DELETE ||.    
28060 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 78        pPager->ex
28070 63 6c 75 73 69 76 65 4d 6f 64 65 21 3d 30 29 20  clusiveMode!=0) 
28080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
28090 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
280a0 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
280b0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
280c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
280d0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61  ITE_OK;.  }.  pa
280e0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
280f0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
28100 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
28110 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
28120 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
28130 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
28140 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
28150 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
28160 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
28170 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
28180 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
28190 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
281a0 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48  r);.      clearH
281b0 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
281c0 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
281d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
281e0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
281f0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
28200 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
28210 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
28220 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
28230 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
28240 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
28250 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
28260 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
28270 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
28280 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
28290 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
282a0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
282b0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
282c0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
282d0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
282e0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
282f0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
28300 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
28310 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
28320 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
28330 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
28340 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
28350 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
28360 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
28370 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
28380 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
28390 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
283a0 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67 65  SHARED;.    page
283b0 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
283c0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
283d0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
283e0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
283f0 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e==PAGER_SYNCED 
28400 7c 7c 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  || !pPager->dirt
28410 79 43 61 63 68 65 20 29 3b 0a 20 20 72 63 20 3d  yCache );.  rc =
28420 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
28430 61 63 74 69 6f 6e 28 70 50 61 67 65 72 2c 20 70  action(pPager, p
28440 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
28450 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
28460 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
28470 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  );.  pagerLeave(
28480 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
28490 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
284a0 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
284b0 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
284c0 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
284d0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
284e0 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
284f0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
28500 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
28510 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
28520 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
28530 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
28540 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
28550 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
28560 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
28570 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
28580 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
28590 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
285a0 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72  king protocol or
285b0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
285c0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
285d0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
285e0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
285f0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
28600 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
28610 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
28620 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
28630 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
28640 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
28650 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
28660 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
28670 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
28680 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
28690 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
286a0 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
286b0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
286c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
286d0 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52   int rc;.  PAGER
286e0 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
286f0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
28700 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
28710 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
28720 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
28730 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
28740 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
28750 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
28760 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
28770 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
28780 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
28790 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
287a0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
287b0 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
287c0 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
287d0 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
287e0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
287f0 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
28800 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
28810 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
28820 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
28830 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
28840 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
28850 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
28860 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
28870 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
28880 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
28890 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
288a0 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
288b0 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
288c0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
288d0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52    PAGERTRACE3("R
288e0 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20  OLLBACK-PAGE %d 
288f0 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  of %d\n", p->pgn
28900 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
28910 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r));.      }else
28920 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
28930 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
28940 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
28950 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
28960 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
28970 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
28980 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
28990 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
289a0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
289b0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
289c0 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
289d0 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
289e0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
289f0 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
28a00 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
28a10 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
28a20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
28a30 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20  r->xReiniter(p, 
28a40 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
28a50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28a60 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
28a70 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
28a80 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
28a90 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
28aa0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
28ab0 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67  gDbSize;.    pag
28ac0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
28ad0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
28ae0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
28af0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
28b00 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
28b10 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
28b20 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
28b30 7d 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  }..  pagerEnter(
28b40 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 21  pPager);.  if( !
28b50 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
28b60 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
28b70 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
28b80 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
28b90 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
28ba0 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 65 74  ger, pPager->set
28bb0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 70 61 67  Master);.    pag
28bc0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
28bd0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
28be0 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
28bf0 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50  r->errCode && pP
28c00 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53  ager->errCode!=S
28c10 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20  QLITE_FULL ){.  
28c20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
28c30 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
28c40 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
28c50 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
28c60 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ger, 0);.    }. 
28c70 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
28c80 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
28c90 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
28ca0 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
28cb0 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
28cc0 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
28cd0 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72    int rc2;.    r
28ce0 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
28cf0 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  ck(pPager, 0);. 
28d00 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 65     rc2 = pager_e
28d10 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
28d20 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
28d30 65 74 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 69  etMaster);.    i
28d40 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28d50 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
28d60 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
28d70 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
28d80 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
28d90 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  r, 0);.  }.  /* 
28da0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
28db0 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  er); */.  pPager
28dc0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
28dd0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
28de0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
28df0 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
28e00 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
28e10 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
28e20 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
28e30 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
28e40 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
28e50 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
28e60 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
28e70 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
28e80 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
28e90 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61   rc);.  pagerLea
28ea0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
28eb0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
28ec0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
28ed0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28ee0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
28ef0 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
28f00 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
28f10 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
28f20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
28f30 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28f40 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
28f50 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
28f60 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
28f70 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
28f80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
28f90 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
28fa0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
28fb0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
28fc0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61  PagerRefcount(Pa
28fd0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28fe0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
28ff0 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ref;.}..#ifdef S
29000 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
29010 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
29020 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
29030 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
29040 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
29050 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
29060 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
29070 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
29080 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
29090 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
290a0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
290b0 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
290c0 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
290d0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
290e0 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
290f0 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
29100 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
29110 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
29120 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
29130 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
29140 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
29150 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
29160 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
29170 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
29180 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
29190 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
291a0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
291b0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
291c0 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
291d0 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
291e0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
291f0 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
29200 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
29210 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
29220 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
29230 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
29240 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
29250 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
29260 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
29270 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
29280 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
29290 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
292a0 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
292b0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
292c0 74 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e  t pagerStmtBegin
292d0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
292e0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
292f0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
29300 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
29310 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
29320 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
29330 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
29340 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
29350 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
29360 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
29370 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
29380 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
29390 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
293a0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
293b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
293c0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
293d0 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
293e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
293f0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
29400 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
29410 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
29420 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
29430 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
29440 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
29450 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
29460 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c  Open );.  pagerL
29470 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
29480 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
29490 70 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  pInStmt==0 );.  
294a0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
294b0 3d 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43  = sqlite3BitvecC
294c0 72 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62  reate(pPager->db
294d0 53 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e  Size);.  pagerEn
294e0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
294f0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
29500 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  mt==0 ){.    /* 
29510 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
29520 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44  ager->fd, SHARED
29530 5f 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72  _LOCK); */.    r
29540 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
29550 45 4d 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  EM;.  }.  pPager
29560 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50  ->stmtJSize = pP
29570 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
29580 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
29590 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
295a0 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d  bSize;.  pPager-
295b0 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b  >stmtHdrOff = 0;
295c0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43  .  pPager->stmtC
295d0 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63  ksum = pPager->c
295e0 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20  ksumInit;.  if( 
295f0 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65  !pPager->stmtOpe
29600 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  n ){.    rc = sq
29610 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65  lite3PagerOpente
29620 6d 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c  mp(pPager->pVfs,
29630 20 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70   pPager->stfd, p
29640 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c  Pager->zStmtJrnl
29650 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
29660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29670 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a  SQLITE_OPEN_SUBJ
29680 4f 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28  OURNAL);.    if(
29690 20 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74   rc ){.      got
296a0 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69  o stmt_begin_fai
296b0 6c 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  led;.    }.    p
296c0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
296d0 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
296e0 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
296f0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d   }.  pPager->stm
29700 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65  tInUse = 1;.  re
29710 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29720 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
29730 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
29740 72 2d 3e 70 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->pInStmt ){.  
29750 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 44    sqlite3BitvecD
29760 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e 70  estroy(pPager->p
29770 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50 61  InStmt);.    pPa
29780 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d 20 30  ger->pInStmt = 0
29790 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
297a0 63 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33  c;.}.int sqlite3
297b0 50 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 50  PagerStmtBegin(P
297c0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
297d0 20 69 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72   int rc;.  pager
297e0 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
297f0 20 72 63 20 3d 20 70 61 67 65 72 53 74 6d 74 42   rc = pagerStmtB
29800 65 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  egin(pPager);.  
29810 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
29820 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
29830 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74  .}../*.** Commit
29840 20 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f   a statement..*/
29850 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
29860 72 53 74 6d 74 43 6f 6d 6d 69 74 28 50 61 67 65  rStmtCommit(Page
29870 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 61  r *pPager){.  pa
29880 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
29890 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
298a0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
298b0 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
298c0 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52  ext;.    PAGERTR
298d0 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
298e0 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
298f0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
29900 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
29910 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 54     /* sqlite3OsT
29920 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e  runcate(pPager->
29930 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20 20 20  stfd, 0); */.   
29940 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
29950 44 65 73 74 72 6f 79 28 70 50 61 67 65 72 2d 3e  Destroy(pPager->
29960 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  pInStmt);.      
29970 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20  pPager->pInStmt 
29980 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
29990 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
299a0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
299b0 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20  ; pPg=pNext){.  
299c0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
299d0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
299e0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
299f0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  er);.        pNe
29a00 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78  xt = pHist->pNex
29a10 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61  tStmt;.        a
29a20 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e  ssert( pHist->in
29a30 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20  Stmt );.        
29a40 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20  pHist->inStmt = 
29a50 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74  0;.        pHist
29a60 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
29a70 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
29a80 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   0;.        sqli
29a90 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
29aa0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
29ab0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
29ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29ad0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
29ae0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70 50  NRec = 0;.    pP
29af0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
29b00 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
29b10 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a  >pStmt = 0;.  }.
29b20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
29b30 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61  toopen = 0;.  pa
29b40 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
29b50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29b60 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
29b70 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
29b80 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
29b90 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c 6c  te3PagerStmtRoll
29ba0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
29bb0 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
29bc0 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
29bd0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
29be0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
29bf0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
29c00 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
29c10 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
29c20 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
29c30 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
29c40 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
29c50 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
29c60 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  t;.      for(pPg
29c70 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
29c80 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e  pPg; pPg=pHist->
29c90 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20  pNextStmt){.    
29ca0 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
29cb0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
29cc0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
29cd0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
29ce0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
29cf0 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
29d00 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
29d10 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
29d20 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
29d30 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29d40 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
29d50 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
29d60 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
29d70 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
29d80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
29d90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ze = pPager->stm
29da0 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67  tSize;.      pag
29db0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
29dc0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
29dd0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
29de0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29df0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
29e00 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
29e10 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
29e20 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
29e30 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
29e40 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
29e50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
29e60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
29e70 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61 67  oopen = 0;.  pag
29e80 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
29e90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29ea0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
29eb0 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
29ec0 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
29ed0 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
29ee0 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65  har *sqlite3Page
29ef0 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20  rFilename(Pager 
29f00 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
29f10 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  rn pPager->zFile
29f20 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  name;.}../*.** R
29f30 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73 74  eturn the VFS st
29f40 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65 20  ructure for the 
29f50 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74 20  pager..*/.const 
29f60 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71 6c  sqlite3_vfs *sql
29f70 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61 67  ite3PagerVfs(Pag
29f80 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
29f90 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 56  eturn pPager->pV
29fa0 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  fs;.}../*.** Ret
29fb0 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61 6e  urn the file han
29fc0 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  dle for the data
29fd0 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63 69  base file associ
29fe0 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  ated.** with the
29ff0 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d 69   pager.  This mi
2a000 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c 20  ght return NULL 
2a010 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73 0a  if the file has.
2a020 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e 20  ** not yet been 
2a030 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69 74  opened..*/.sqlit
2a040 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65 33  e3_file *sqlite3
2a050 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72 20  PagerFile(Pager 
2a060 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
2a070 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a 7d  rn pPager->fd;.}
2a080 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
2a090 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
2a0a0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
2a0b0 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
2a0c0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69   *sqlite3PagerDi
2a0d0 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61  rname(Pager *pPa
2a0e0 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70  ger){.  return p
2a0f0 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
2a100 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  y;.}../*.** Retu
2a110 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68  rn the full path
2a120 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  name of the jour
2a130 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e  nal file..*/.con
2a140 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  st char *sqlite3
2a150 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65  PagerJournalname
2a160 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
2a170 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
2a180 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f  ->zJournal;.}../
2a190 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
2a1a0 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c   if fsync() call
2a1b0 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66  s are disabled f
2a1c0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
2a1d0 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20  Return FALSE.** 
2a1e0 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20  if fsync()s are 
2a1f0 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c  executed normall
2a200 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
2a210 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67  3PagerNosync(Pag
2a220 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
2a230 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f  eturn pPager->no
2a240 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  Sync;.}..#ifdef 
2a250 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
2a260 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
2a270 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
2a280 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
2a290 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63  te3PagerSetCodec
2a2a0 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
2a2b0 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f  r,.  void *(*xCo
2a2c0 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a  dec)(void*,void*
2a2d0 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f  ,Pgno,int),.  vo
2a2e0 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b  id *pCodecArg.){
2a2f0 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65  .  pPager->xCode
2a300 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50  c = xCodec;.  pP
2a310 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20  ager->pCodecArg 
2a320 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23  = pCodecArg;.}.#
2a330 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
2a340 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
2a350 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65  ACUUM./*.** Move
2a360 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f   the page pPg to
2a370 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69   location pgno i
2a380 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a  n the file..**.*
2a390 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
2a3a0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
2a3b0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
2a3c0 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
2a3d0 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
2a3e0 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
2a3f0 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
2a400 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
2a410 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
2a420 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
2a430 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70  ous located at p
2a440 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
2a450 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
2a460 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
2a470 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
2a480 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
2a490 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
2a4a0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
2a4b0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
2a4c0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
2a4d0 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
2a4e0 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
2a4f0 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
2a500 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
2a510 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
2a520 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
2a530 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
2a540 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
2a550 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
2a560 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
2a570 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
2a580 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
2a590 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
2a5a0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
2a5b0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
2a5c0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
2a5d0 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
2a5e0 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
2a5f0 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
2a600 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
2a610 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
2a620 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
2a630 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
2a640 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
2a650 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
2a660 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
2a670 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
2a680 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
2a690 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
2a6a0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
2a6b0 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67  Old;  /* The pag
2a6c0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
2a6d0 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  ten. */.  int h;
2a6e0 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
2a6f0 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61 67  Pgno = 0;..  pag
2a700 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
2a710 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
2a720 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41 47  nRef>0 );..  PAG
2a730 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20 25  ERTRACE5("MOVE %
2a740 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64 53  d page %d (needS
2a750 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f  ync=%d) moves to
2a760 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50   %d\n", .      P
2a770 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
2a780 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e  pPg->pgno, pPg->
2a790 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b  needSync, pgno);
2a7a0 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f 56  .  IOTRACE(("MOV
2a7b0 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20 70  E %p %d %d\n", p
2a7c0 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
2a7d0 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67 65  , pgno))..  page
2a7e0 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50  r_get_content(pP
2a7f0 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g);.  if( pPg->n
2a800 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 6e  eedSync ){.    n
2a810 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70 50  eedSyncPgno = pP
2a820 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73  g->pgno;.    ass
2a830 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
2a840 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f  nal || (int)pgno
2a850 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
2a860 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
2a870 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 3b  t( pPg->dirty );
2a880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
2a890 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
2a8a0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
2a8b0 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68  k pPg from its h
2a8c0 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20 75  ash-chain */.  u
2a8d0 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
2a8e0 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20 20  Pager, pPg);..  
2a8f0 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65 20  /* If the cache 
2a900 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65 20  contains a page 
2a910 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65 72  with page-number
2a920 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69 74   pgno, remove it
2a930 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20 68  .  ** from its h
2a940 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c  ash chain. Also,
2a950 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e 65   if the PgHdr.ne
2a960 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20 66  edSync was set f
2a970 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70 67  or .  ** page pg
2a980 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27 6d  no before the 'm
2a990 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20  ove' operation, 
2a9a0 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  it needs to be r
2a9b0 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f  etained .  ** fo
2a9c0 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65 64  r the page moved
2a9d0 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70   there..  */.  p
2a9e0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
2a9f0 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  ;.  pPgOld = pag
2aa00 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
2aa10 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
2aa20 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  PgOld ){.    ass
2aa30 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  ert( pPgOld->nRe
2aa40 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69  f==0 );.    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 4f 6c 64 29 3b 0a 20 20 20  er, pPgOld);.   
2aa70 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f 6c   makeClean(pPgOl
2aa80 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65  d);.    pPg->nee
2aa90 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d 3e  dSync = pPgOld->
2aaa0 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c 73  needSync;.  }els
2aab0 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  e{.    pPg->need
2aac0 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Sync = 0;.  }.  
2aad0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
2aae0 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 54 65   sqlite3BitvecTe
2aaf0 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  st(pPager->pInJo
2ab00 75 72 6e 61 6c 2c 20 70 67 6e 6f 29 3b 0a 0a 20  urnal, pgno);.. 
2ab10 20 2f 2a 20 43 68 61 6e 67 65 20 74 68 65 20 70   /* Change the p
2ab20 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 70  age number for p
2ab30 50 67 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  Pg and insert it
2ab40 20 69 6e 74 6f 20 74 68 65 20 6e 65 77 20 68 61   into the new ha
2ab50 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 61  sh-chain. */.  a
2ab60 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29  ssert( pgno!=0 )
2ab70 3b 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20  ;.  pPg->pgno = 
2ab80 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 67 6e 6f  pgno;.  h = pgno
2ab90 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
2aba0 68 2d 31 29 3b 0a 20 20 69 66 28 20 70 50 61 67  h-1);.  if( pPag
2abb0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a  er->aHash[h] ){.
2abc0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
2abd0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
2abe0 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20  revHash==0 );.  
2abf0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
2ac00 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  h]->pPrevHash = 
2ac10 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
2ac20 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
2ac30 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
2ac40 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
2ac50 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70   = pPg;.  pPg->p
2ac60 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20  PrevHash = 0;.. 
2ac70 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b   makeDirty(pPg);
2ac80 0a 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  .  pPager->dirty
2ac90 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 70 50 61  Cache = 1;.  pPa
2aca0 67 65 72 2d 3e 64 62 4d 6f 64 69 66 69 65 64 20  ger->dbModified 
2acb0 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
2acc0 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
2acd0 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
2ace0 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
2acf0 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
2ad00 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
2ad10 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
2ad20 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
2ad30 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
2ad40 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
2ad50 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
2ad60 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
2ad70 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
2ad80 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
2ad90 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
2ada0 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
2adb0 70 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  pInJournal bit h
2adc0 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
2add0 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
2ade0 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
2adf0 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
2ae00 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
2ae10 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
2ae20 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
2ae30 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
2ae40 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
2ae50 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
2ae60 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
2ae70 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61  he page-cache fa
2ae80 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a  ils, (due.    **
2ae90 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   to a malloc() o
2aea0 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63  r IO failure), c
2aeb0 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20  lear the bit in 
2aec0 74 68 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d  the pInJournal[]
2aed0 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f  .    ** array. O
2aee0 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
2aef0 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
2af00 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69  and written agai
2af10 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  n in.    ** this
2af20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
2af30 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
2af40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
2af50 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20  file before.    
2af60 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  ** it is synced 
2af70 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
2af80 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c   file. This way,
2af90 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69   it may end up i
2afa0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
2afb0 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c  rnal file twice,
2afc0 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74   but that is not
2afd0 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20   a problem..    
2afe0 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
2aff0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
2b000 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
2b010 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
2b020 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
2b030 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
2b040 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
2b050 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
2b060 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
2b070 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
2b080 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
2b090 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
2b0a0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2b0b0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
2b0c0 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
2b0d0 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
2b0e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
2b0f0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
2b100 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
2b110 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e   && (int)needSyn
2b120 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  cPgno<=pPager->o
2b130 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
2b140 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76       sqlite3Bitv
2b150 65 63 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e  ecClear(pPager->
2b160 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64  pInJournal, need
2b170 53 79 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20  SyncPgno);.     
2b180 20 7d 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65   }.      pagerLe
2b190 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ave(pPager);.   
2b1a0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
2b1b0 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
2b1c0 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
2b1d0 20 20 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79    pPgHdr->needSy
2b1e0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48  nc = 1;.    pPgH
2b1f0 64 72 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  dr->inJournal = 
2b200 31 3b 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79  1;.    makeDirty
2b210 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71  (pPgHdr);.    sq
2b220 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
2b230 70 50 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20  pPgHdr);.  }..  
2b240 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
2b250 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  r);.  return SQL
2b260 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66  ITE_OK;.}.#endif
2b270 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
2b280 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
2b290 64 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65  data for the spe
2b2a0 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a  cified page..*/.
2b2b0 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67  void *sqlite3Pag
2b2c0 65 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65  erGetData(DbPage
2b2d0 20 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e   *pPg){.  return
2b2e0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
2b2f0 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Pg);.}../*.** Re
2b300 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
2b310 6f 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74  o the Pager.nExt
2b320 72 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74  ra bytes of "ext
2b330 72 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c  ra" space .** al
2b340 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
2b350 74 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64  th the specified
2b360 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a   page..*/.void *
2b370 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45  sqlite3PagerGetE
2b380 78 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67  xtra(DbPage *pPg
2b390 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
2b3a0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
2b3b0 3b 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67  ;.  return (pPag
2b3c0 65 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  er?PGHDR_TO_EXTR
2b3d0 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30  A(pPg, pPager):0
2b3e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f  );.}../*.** Get/
2b3f0 73 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  set the locking-
2b400 6d 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61  mode for this pa
2b410 67 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65  ger. Parameter e
2b420 4d 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65  Mode must be one
2b430 0a 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43  .** of PAGER_LOC
2b440 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20  KINGMODE_QUERY, 
2b450 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b460 45 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20  E_NORMAL or .** 
2b470 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b480 45 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20  E_EXCLUSIVE. If 
2b490 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73  the parameter is
2b4a0 20 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65   not _QUERY, the
2b4b0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67  n.** the locking
2b4c0 2d 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20  -mode is set to 
2b4d0 74 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66  the value specif
2b4e0 69 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ied..**.** The r
2b4f0 65 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73  eturned value is
2b500 20 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f   either PAGER_LO
2b510 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2b520 20 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43   or.** PAGER_LOC
2b530 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2b540 56 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74  VE, indicating t
2b550 68 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73  he current (poss
2b560 69 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a  ibly updated).**
2b570 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a   locking-mode..*
2b580 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
2b590 65 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61  erLockingMode(Pa
2b5a0 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
2b5b0 20 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72   eMode){.  asser
2b5c0 74 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f  t( eMode==PAGER_
2b5d0 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52  LOCKINGMODE_QUER
2b5e0 59 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c  Y.            ||
2b5f0 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
2b600 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
2b610 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2b620 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
2b630 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
2b640 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
2b650 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2b660 45 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61  E_QUERY<0 );.  a
2b670 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43  ssert( PAGER_LOC
2b680 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e  KINGMODE_NORMAL>
2b690 3d 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b  =0 && PAGER_LOCK
2b6a0 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
2b6b0 45 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d  E>=0 );.  if( eM
2b6c0 6f 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65  ode>=0 && !pPage
2b6d0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
2b6e0 20 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75     pPager->exclu
2b6f0 73 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65  siveMode = eMode
2b700 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  ;.  }.  return (
2b710 69 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c  int)pPager->excl
2b720 75 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 2f 2a  usiveMode;.}../*
2b730 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
2b740 6a 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 66 6f 72  journal-mode for
2b750 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
2b760 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
2b770 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
2b780 41 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45  AGER_JOURNALMODE
2b790 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4a 4f  _QUERY, PAGER_JO
2b7a0 55 52 4e 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45  URNALMODE_DELETE
2b7b0 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4a 4f   or .** PAGER_JO
2b7c0 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52 53 49 53  URNALMODE_PERSIS
2b7d0 54 2e 20 49 66 20 74 68 65 20 70 61 72 61 6d 65  T. If the parame
2b7e0 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55 45 52  ter is not _QUER
2b7f0 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 6a  Y, then.** the j
2b800 6f 75 72 6e 61 6c 2d 6d 6f 64 65 20 69 73 20 73  ournal-mode is s
2b810 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65 20  et to the value 
2b820 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a 2a 2a  specified..**.**
2b830 20 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61   The returned va
2b840 6c 75 65 20 69 73 20 65 69 74 68 65 72 20 50 41  lue is either PA
2b850 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b860 44 45 4c 45 54 45 20 6f 72 0a 2a 2a 20 50 41 47  DELETE or.** PAG
2b870 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50  ER_JOURNALMODE_P
2b880 45 52 53 49 53 54 2c 20 69 6e 64 69 63 61 74 69  ERSIST, indicati
2b890 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 28  ng the current (
2b8a0 70 6f 73 73 69 62 6c 79 20 75 70 64 61 74 65 64  possibly updated
2b8b0 29 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 2d 6d 6f 64  ).** journal-mod
2b8c0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
2b8d0 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 4d 6f 64  3PagerJournalMod
2b8e0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
2b8f0 20 69 6e 74 20 65 4d 6f 64 65 29 7b 0a 20 20 61   int eMode){.  a
2b900 73 73 65 72 74 28 20 65 4d 6f 64 65 3d 3d 50 41  ssert( eMode==PA
2b910 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b920 51 55 45 52 59 0a 20 20 20 20 20 20 20 20 20 20  QUERY.          
2b930 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45    || eMode==PAGE
2b940 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 44 45  R_JOURNALMODE_DE
2b950 4c 45 54 45 0a 20 20 20 20 20 20 20 20 20 20 20  LETE.           
2b960 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
2b970 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 50 45 52  _JOURNALMODE_PER
2b980 53 49 53 54 0a 20 20 20 20 20 20 20 20 20 20 20  SIST.           
2b990 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52   || eMode==PAGER
2b9a0 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f 4f 46 46  _JOURNALMODE_OFF
2b9b0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2b9c0 47 45 52 5f 4a 4f 55 52 4e 41 4c 4d 4f 44 45 5f  GER_JOURNALMODE_
2b9d0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
2b9e0 65 72 74 28 20 50 41 47 45 52 5f 4a 4f 55 52 4e  ert( PAGER_JOURN
2b9f0 41 4c 4d 4f 44 45 5f 44 45 4c 45 54 45 3e 3d 30  ALMODE_DELETE>=0
2ba00 20 26 26 20 50 41 47 45 52 5f 4a 4f 55 52 4e 41   && PAGER_JOURNA
2ba10 4c 4d 4f 44 45 5f 50 45 52 53 49 53 54 3e 3d 30  LMODE_PERSIST>=0
2ba20 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64 65 3e   );.  if( eMode>
2ba30 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
2ba40 2d 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 20 3d 20  ->journalMode = 
2ba50 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20 72 65 74  eMode;.  }.  ret
2ba60 75 72 6e 20 28 69 6e 74 29 70 50 61 67 65 72 2d  urn (int)pPager-
2ba70 3e 6a 6f 75 72 6e 61 6c 4d 6f 64 65 3b 0a 7d 0a  >journalMode;.}.
2ba80 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
2ba90 45 53 54 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20  EST./*.** Print 
2baa0 61 20 6c 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c  a listing of all
2bab0 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   referenced page
2bac0 73 20 61 6e 64 20 74 68 65 69 72 20 72 65 66 20  s and their ref 
2bad0 63 6f 75 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  count..*/.void s
2bae0 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 64 75  qlite3PagerRefdu
2baf0 6d 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  mp(Pager *pPager
2bb00 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
2bb10 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
2bb20 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
2bb30 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
2bb40 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e  {.    if( pPg->n
2bb50 52 65 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Ref<=0 ) continu
2bb60 65 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65  e;.    sqlite3De
2bb70 62 75 67 50 72 69 6e 74 66 28 22 50 41 47 45 20  bugPrintf("PAGE 
2bb80 25 33 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %3d addr=%p nRef
2bb90 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  =%d\n", .       
2bba0 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52  pPg->pgno, PGHDR
2bbb0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
2bbc0 50 67 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d  Pg->nRef);.  }.}
2bbd0 0a 23 65 6e 64 69 66 0a 0a 23 65 6e 64 69 66 20  .#endif..#endif 
2bbe0 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44  /* SQLITE_OMIT_D
2bbf0 49 53 4b 49 4f 20 2a 2f 0a                       ISKIO */.