/ Hex Artifact Content
Login

Artifact 2ed81808091ce42ceb1cf209e4ce87922a0065c8:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 34 30  : pager.c,v 1.40
0350: 35 20 32 30 30 38 2f 30 32 2f 30 32 20 32 30 3a  5 2008/02/02 20:
0360: 34 37 3a 33 38 20 64 72 68 20 45 78 70 20 24 0a  47:38 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
24d0: 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28 70 67 6e  >aInJournal[(pgn
24e0: 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c 3c 28 28  o-1)/8] & (1<<((
24f0: 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d 30 0a 2a  pgno-1)%8))!=0.*
2500: 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20 70 50 61  *.**     The pPa
2510: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b  ger->aInJournal[
2520: 5d 20 61 72 72 61 79 20 69 73 20 6f 6e 6c 79 20  ] array is only 
2530: 76 61 6c 69 64 20 66 6f 72 20 74 68 65 20 6f 72  valid for the or
2540: 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20 20 70 61  iginal.**     pa
2550: 67 65 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ges of the datab
2560: 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20 70 61 67  ase, not new pag
2570: 65 73 20 74 68 61 74 20 61 72 65 20 61 64 64 65  es that are adde
2580: 64 20 74 6f 20 74 68 65 20 65 6e 64 0a 2a 2a 20  d to the end.** 
2590: 20 20 20 20 6f 66 20 74 68 65 20 64 61 74 61 62      of the datab
25a0: 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f 75 73 6c  ase, so obviousl
25b0: 79 20 74 68 65 20 61 62 6f 76 65 20 65 78 70 72  y the above expr
25c0: 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65  ession cannot be
25d0: 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64 20 66 6f  .**     valid fo
25e0: 72 20 6e 65 77 20 70 61 67 65 73 2e 20 20 46 6f  r new pages.  Fo
25f0: 72 20 6e 65 77 20 70 61 67 65 73 20 69 6e 4a 6f  r new pages inJo
2600: 75 72 6e 61 6c 20 69 73 20 61 6c 77 61 79 73 20  urnal is always 
2610: 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74 79 0a 2a  0..**.** dirty.*
2620: 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e 20 74 72  *.**     When tr
2630: 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 74  ue, this means t
2640: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
2650: 6f 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  of the page has 
2660: 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d 6f 64 69  been.**     modi
2670: 66 69 65 64 20 61 6e 64 20 6e 65 65 64 73 20 74  fied and needs t
2680: 6f 20 62 65 20 77 72 69 74 74 65 6e 20 62 61 63  o be written bac
2690: 6b 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  k to the databas
26a0: 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20 49  e file..**     I
26b0: 66 20 66 61 6c 73 65 2c 20 69 74 20 6d 65 61 6e  f false, it mean
26c0: 73 20 74 68 61 74 20 65 69 74 68 65 72 20 74 68  s that either th
26d0: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
26e0: 20 70 61 67 65 20 69 73 0a 2a 2a 20 20 20 20 20   page is.**     
26f0: 75 6e 63 68 61 6e 67 65 64 20 6f 72 20 65 6c 73  unchanged or els
2700: 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 69 73  e the content is
2710: 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20 61 6e 64   unimportant and
2720: 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a 20 20 20   we do not.**   
2730: 20 20 63 61 72 65 20 77 68 65 74 68 65 72 20 6f    care whether o
2740: 72 20 6e 6f 74 20 69 74 20 69 73 20 70 72 65 73  r not it is pres
2750: 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 61 6c 77  erved..**.** alw
2760: 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a 2a 0a 2a  aysRollback.**.*
2770: 2a 20 20 20 20 20 54 68 69 73 20 6d 65 61 6e 73  *     This means
2780: 20 74 68 61 74 20 74 68 65 20 73 71 6c 69 74 65   that the sqlite
2790: 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
27a0: 63 6b 28 29 20 41 50 49 20 73 68 6f 75 6c 64 20  ck() API should 
27b0: 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e 6f 72 65  be.**     ignore
27c0: 64 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 2e  d for this page.
27d0: 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c 6c 62 61    The DontRollba
27e0: 63 6b 28 29 20 41 50 49 20 61 74 74 65 6d 70 74  ck() API attempt
27f0: 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20 20 20 20  s to say.**     
2800: 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74  that the content
2810: 20 6f 66 20 74 68 65 20 70 61 67 65 20 6f 6e 20   of the page on 
2820: 64 69 73 6b 20 69 73 20 75 6e 69 6d 70 6f 72 74  disk is unimport
2830: 61 6e 74 20 28 69 74 20 69 73 20 61 6e 0a 2a 2a  ant (it is an.**
2840: 20 20 20 20 20 75 6e 75 73 65 64 20 70 61 67 65       unused page
2850: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
2860: 29 20 73 6f 20 74 68 61 74 20 69 74 20 69 73 20  ) so that it is 
2870: 75 6e 6e 65 63 65 73 73 61 72 79 20 74 6f 20 0a  unnecessary to .
2880: 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61 63 6b 20  **     rollback 
2890: 63 68 61 6e 67 65 73 20 74 6f 20 74 68 69 73 20  changes to this 
28a0: 70 61 67 65 20 62 65 63 61 75 73 65 20 74 68 65  page because the
28b0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20   content of the 
28c0: 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 61 6e 20  page.**     can 
28d0: 63 68 61 6e 67 65 20 77 69 74 68 6f 75 74 20 63  change without c
28e0: 68 61 6e 67 69 6e 67 20 74 68 65 20 6d 65 61 6e  hanging the mean
28f0: 69 6e 67 20 6f 66 20 74 68 65 20 64 61 74 61 62  ing of the datab
2900: 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a 20 20 20  ase.  This.**   
2910: 20 20 66 6c 61 67 20 6f 76 65 72 72 69 64 65 73    flag overrides
2920: 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c 62 61 63   any DontRollbac
2930: 6b 28 29 20 61 74 74 65 6d 70 74 2e 20 20 54 68  k() attempt.  Th
2940: 69 73 20 66 6c 61 67 20 69 73 20 73 65 74 0a 2a  is flag is set.*
2950: 2a 20 20 20 20 20 77 68 65 6e 20 61 20 70 61 67  *     when a pag
2960: 65 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 6c  e that originall
2970: 79 20 63 6f 6e 74 61 69 6e 65 64 20 76 61 6c 69  y contained vali
2980: 64 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  d data is added 
2990: 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 66 72  to.**     the fr
29a0: 65 65 6c 69 73 74 2e 20 20 4c 61 74 65 72 20 69  eelist.  Later i
29b0: 6e 20 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73  n the same trans
29c0: 61 63 74 69 6f 6e 2c 20 74 68 69 73 20 70 61 67  action, this pag
29d0: 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20 20 20 62  e might.**     b
29e0: 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d 20 74 68  e pulled from th
29f0: 65 20 66 72 65 65 6c 69 73 74 20 61 6e 64 20 72  e freelist and r
2a00: 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 74 68  eused for someth
2a10: 69 6e 67 20 64 69 66 66 65 72 65 6e 74 0a 2a 2a  ing different.**
2a20: 20 20 20 20 20 61 6e 64 20 61 74 20 74 68 61 74       and at that
2a30: 20 70 6f 69 6e 74 20 74 68 65 20 44 6f 6e 74 52   point the DontR
2a40: 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 77 69  ollback() API wi
2a50: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 62 65 63  ll be called bec
2a60: 61 75 73 65 0a 2a 2a 20 20 20 20 20 70 61 67 65  ause.**     page
2a70: 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20 74 68 65  s taken from the
2a80: 20 66 72 65 65 6c 69 73 74 20 64 6f 20 6e 6f 74   freelist do not
2a90: 20 6e 65 65 64 20 74 6f 20 62 65 20 70 72 6f 74   need to be prot
2aa0: 65 63 74 65 64 20 62 79 0a 2a 2a 20 20 20 20 20  ected by.**     
2ab0: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
2ac0: 72 6e 61 6c 2e 20 20 42 75 74 20 74 68 69 73 20  rnal.  But this 
2ad0: 66 6c 61 67 20 73 61 79 73 20 74 68 61 74 20 74  flag says that t
2ae0: 68 65 20 70 61 67 65 20 77 61 73 0a 2a 2a 20 20  he page was.**  
2af0: 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e 61 6c 6c     not originall
2b00: 79 20 70 61 72 74 20 6f 66 20 74 68 65 20 66 72  y part of the fr
2b10: 65 65 6c 69 73 74 20 73 6f 20 74 68 61 74 20 69  eelist so that i
2b20: 74 20 73 74 69 6c 6c 20 6e 65 65 64 73 20 74 6f  t still needs to
2b30: 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f 6c 6c 65  .**     be rolle
2b40: 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
2b50: 6f 66 20 61 6e 79 20 73 75 62 73 65 71 75 65 6e  of any subsequen
2b60: 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  t DontRollback()
2b70: 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a 20 6e 65   calls..**.** ne
2b80: 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a 20 20 20  edRead .**.**   
2b90: 20 20 54 68 69 73 20 66 6c 61 67 20 6d 65 61 6e    This flag mean
2ba0: 73 20 28 77 68 65 6e 20 74 72 75 65 29 20 74 68  s (when true) th
2bb0: 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  at the content o
2bc0: 66 20 74 68 65 20 70 61 67 65 20 68 61 73 0a 2a  f the page has.*
2bd0: 2a 20 20 20 20 20 6e 6f 74 20 79 65 74 20 62 65  *     not yet be
2be0: 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f 6d 20 64  en loaded from d
2bf0: 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d 6d 65 6d  isk.  The in-mem
2c00: 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69 73 20 6a  ory content is j
2c10: 75 73 74 0a 2a 2a 20 20 20 20 20 67 61 72 62 61  ust.**     garba
2c20: 67 65 2e 20 20 28 41 63 74 75 61 6c 6c 79 2c 20  ge.  (Actually, 
2c30: 77 65 20 7a 65 72 6f 20 74 68 65 20 63 6f 6e 74  we zero the cont
2c40: 65 6e 74 2c 20 62 75 74 20 79 6f 75 20 73 68 6f  ent, but you sho
2c50: 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20 20 20 6d  uld not.**     m
2c60: 61 6b 65 20 61 6e 79 20 61 73 73 75 6d 70 74 69  ake any assumpti
2c70: 6f 6e 73 20 61 62 6f 75 74 20 74 68 65 20 63 6f  ons about the co
2c80: 6e 74 65 6e 74 20 6e 65 76 65 72 74 68 65 6c 65  ntent neverthele
2c90: 73 73 2e 29 20 20 49 66 20 74 68 65 0a 2a 2a 20  ss.)  If the.** 
2ca0: 20 20 20 20 63 6f 6e 74 65 6e 74 20 69 73 20 6e      content is n
2cb0: 65 65 64 65 64 20 69 6e 20 74 68 65 20 66 75 74  eeded in the fut
2cc0: 75 72 65 2c 20 69 74 20 73 68 6f 75 6c 64 20 62  ure, it should b
2cd0: 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 0a  e read from the.
2ce0: 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e 61 6c 20  **     original 
2cf0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
2d00: 2f 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b  /.struct PgHdr {
2d10: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2d20: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2d30: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74    /* The pager t
2d40: 6f 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67  o which this pag
2d50: 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50  e belongs */.  P
2d60: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
2d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2d80: 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   The page number
2d90: 20 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a   for this page *
2da0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74  /.  PgHdr *pNext
2db0: 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68  Hash, *pPrevHash
2dc0: 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69  ;  /* Hash colli
2dd0: 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50  sion chain for P
2de0: 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50  gHdr.pgno */.  P
2df0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 66 72 65 65  agerLruLink free
2e00: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
2e10: 20 4e 65 78 74 20 61 6e 64 20 70 72 65 76 69 6f   Next and previo
2e20: 75 73 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  us free pages */
2e30: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 41  .  PgHdr *pNextA
2e40: 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ll;             
2e50: 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66 20 61    /* A list of a
2e60: 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38  ll pages */.  u8
2e70: 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   inJournal;     
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e90: 54 52 55 45 20 69 66 20 68 61 73 20 62 65 65 6e  TRUE if has been
2ea0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72   written to jour
2eb0: 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74  nal */.  u8 dirt
2ec0: 79 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y;              
2ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20          /* TRUE 
2ee0: 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72  if we need to wr
2ef0: 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73  ite back changes
2f00: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
2f10: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2f20: 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75       /* Sync jou
2f30: 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74  rnal before writ
2f40: 69 6e 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f  ing this page */
2f50: 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c  .  u8 alwaysRoll
2f60: 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  back;           
2f70: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f 6e    /* Disable Don
2f80: 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20  tRollback() for 
2f90: 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 75  this page */.  u
2fa0: 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20 20 20  8 needRead;     
2fb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2fc0: 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20 69 66   Read content if
2fd0: 20 50 61 67 65 72 57 72 69 74 65 28 29 20 69 73   PagerWrite() is
2fe0: 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73 68 6f   called */.  sho
2ff0: 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  rt int nRef;    
3000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
3010: 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20 6f  umber of users o
3020: 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  f this page */. 
3030: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 2c 20   PgHdr *pDirty, 
3040: 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20 20 20  *pPrevDirty;    
3050: 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20 2a  /* Dirty pages *
3060: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3070: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
3080: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
3090: 4c 72 75 4c 69 6e 6b 20 67 66 72 65 65 3b 20 20  LruLink gfree;  
30a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 47 6c 6f            /* Glo
30b0: 62 61 6c 20 6c 69 73 74 20 6f 66 20 6e 52 65 66  bal list of nRef
30c0: 3d 3d 30 20 70 61 67 65 73 20 2a 2f 0a 23 65 6e  ==0 pages */.#en
30d0: 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
30e0: 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20  E_CHECK_PAGES.  
30f0: 75 33 32 20 70 61 67 65 48 61 73 68 3b 0a 23 65  u32 pageHash;.#e
3100: 6e 64 69 66 0a 20 20 76 6f 69 64 20 2a 70 44 61  ndif.  void *pDa
3110: 74 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ta;             
3120: 20 20 20 20 20 20 2f 2a 20 50 61 67 65 20 64 61        /* Page da
3130: 74 61 20 2a 2f 0a 20 20 2f 2a 20 50 61 67 65 72  ta */.  /* Pager
3140: 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20 6f 66  .nExtra bytes of
3150: 20 6c 6f 63 61 6c 20 64 61 74 61 20 61 70 70 65   local data appe
3160: 6e 64 65 64 20 74 6f 20 74 68 69 73 20 68 65 61  nded to this hea
3170: 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  der */.};../*.**
3180: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
3190: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
31a0: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
31b0: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
31c0: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
31d0: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
31e0: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
31f0: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
3200: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
3210: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
3220: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
3230: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
3240: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
3250: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
3260: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
3270: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
3280: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
3290: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
32a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
32b0: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
32c0: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
32d0: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
32e0: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
32f0: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
3300: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
3310: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
3320: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
3330: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
3340: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
3350: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
3360: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
3370: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
3380: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
3390: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
33a0: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
33b0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
33c0: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
33d0: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
33e0: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
33f0: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
3400: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
3410: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
3420: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
3430: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
3440: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
3450: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
3460: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
3470: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
3480: 6d 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20  ment */.  PgHdr 
3490: 2a 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72  *pNextStmt, *pPr
34a0: 65 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74  evStmt;  /* List
34b0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
34c0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
34d0: 61 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d  al */.  u8 inStm
34e0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
34f0: 20 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69         /* TRUE i
3500: 66 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65  f in the stateme
3510: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f  nt subjournal */
3520: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63  .};../*.** A mac
3530: 72 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f  ro used for invo
3540: 6b 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69  king the codec i
3550: 66 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a  f there is one.*
3560: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3570: 48 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69  HAS_CODEC.# defi
3580: 6e 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c  ne CODEC1(P,D,N,
3590: 58 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63  X) if( P->xCodec
35a0: 21 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63  !=0 ){ P->xCodec
35b0: 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c  (P->pCodecArg,D,
35c0: 4e 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65  N,X); }.# define
35d0: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
35e0: 20 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f   ((char*)(P->xCo
35f0: 64 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63  dec!=0?P->xCodec
3600: 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c  (P->pCodecArg,D,
3610: 4e 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23  N,X):D)).#else.#
3620: 20 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50   define CODEC1(P
3630: 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50  ,D,N,X) /* NO-OP
3640: 20 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44   */.# define COD
3650: 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63  EC2(P,D,N,X) ((c
3660: 68 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a  har*)D).#endif..
3670: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
3680: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
3690: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
36a0: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
36b0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
36c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
36d0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 20 20  R_TO_DATA(P)    
36e0: 28 28 50 29 2d 3e 70 44 61 74 61 29 0a 23 64 65  ((P)->pData).#de
36f0: 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 45 58  fine PGHDR_TO_EX
3700: 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69 64 2a  TRA(G,P) ((void*
3710: 29 26 28 28 47 29 5b 31 5d 29 29 0a 23 64 65 66  )&((G)[1])).#def
3720: 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  ine PGHDR_TO_HIS
3730: 54 28 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20  T(P,PGR)  \.    
3740: 20 20 20 20 20 20 20 20 28 28 50 67 48 69 73 74          ((PgHist
3750: 6f 72 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26  ory*)&((char*)(&
3760: 28 50 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e  (P)[1]))[(PGR)->
3770: 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20  nExtra])../*.** 
3780: 41 20 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68  A open page cach
3790: 65 20 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65  e is an instance
37a0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
37b0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2a 0a  g structure..**.
37c0: 2a 2a 20 50 61 67 65 72 2e 65 72 72 43 6f 64 65  ** Pager.errCode
37d0: 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 53   may be set to S
37e0: 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c  QLITE_IOERR, SQL
37f0: 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 0a  ITE_CORRUPT, or.
3800: 2a 2a 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  ** or SQLITE_FUL
3810: 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20 6f 66 20 74  L. Once one of t
3820: 68 65 20 66 69 72 73 74 20 74 68 72 65 65 20 65  he first three e
3830: 72 72 6f 72 73 20 6f 63 63 75 72 73 2c 20 69 74  rrors occurs, it
3840: 20 70 65 72 73 69 73 74 73 0a 2a 2a 20 61 6e 64   persists.** and
3850: 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 73 20   is returned as 
3860: 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20 65 76  the result of ev
3870: 65 72 79 20 6d 61 6a 6f 72 20 70 61 67 65 72 20  ery major pager 
3880: 41 50 49 20 63 61 6c 6c 2e 20 20 54 68 65 0a 2a  API call.  The.*
3890: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 72 65  * SQLITE_FULL re
38a0: 74 75 72 6e 20 63 6f 64 65 20 69 73 20 73 6c 69  turn code is sli
38b0: 67 68 74 6c 79 20 64 69 66 66 65 72 65 6e 74 2e  ghtly different.
38c0: 20 49 74 20 70 65 72 73 69 73 74 73 20 6f 6e 6c   It persists onl
38d0: 79 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6e  y until the.** n
38e0: 65 78 74 20 73 75 63 63 65 73 73 66 75 6c 20 72  ext successful r
38f0: 6f 6c 6c 62 61 63 6b 20 69 73 20 70 65 72 66 6f  ollback is perfo
3900: 72 6d 65 64 20 6f 6e 20 74 68 65 20 70 61 67 65  rmed on the page
3910: 72 20 63 61 63 68 65 2e 20 41 6c 73 6f 2c 0a 2a  r cache. Also,.*
3920: 2a 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 64 6f  * SQLITE_FULL do
3930: 65 73 20 6e 6f 74 20 61 66 66 65 63 74 20 74 68  es not affect th
3940: 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  e sqlite3PagerGe
3950: 74 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 50  t() and sqlite3P
3960: 61 67 65 72 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  agerLookup().** 
3970: 41 50 49 73 2c 20 74 68 65 79 20 6d 61 79 20 73  APIs, they may s
3980: 74 69 6c 6c 20 62 65 20 75 73 65 64 20 73 75 63  till be used suc
3990: 63 65 73 73 66 75 6c 6c 79 2e 0a 2a 2f 0a 73 74  cessfully..*/.st
39a0: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 73  ruct Pager {.  s
39b0: 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73  qlite3_vfs *pVfs
39c0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 53  ;          /* OS
39d0: 20 66 75 6e 63 74 69 6f 6e 73 20 74 6f 20 75 73   functions to us
39e0: 65 20 66 6f 72 20 49 4f 20 2a 2f 0a 20 20 75 38  e for IO */.  u8
39f0: 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20   journalOpen;   
3a00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3a10: 65 20 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  e if journal fil
3a20: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 69 73  e descriptors is
3a30: 20 76 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a   valid */.  u8 j
3a40: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20  ournalStarted;  
3a50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
3a60: 69 66 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75  if header of jou
3a70: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a  rnal is synced *
3a80: 2f 0a 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61  /.  u8 useJourna
3a90: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
3aa0: 2f 2a 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63  /* Use a rollbac
3ab0: 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69  k journal on thi
3ac0: 73 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e  s file */.  u8 n
3ad0: 6f 52 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20  oReadlock;      
3ae0: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
3af0: 74 20 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61  t bother to obta
3b00: 69 6e 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a  in readlocks */.
3b10: 20 20 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20    u8 stmtOpen;  
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3b30: 20 54 72 75 65 20 69 66 20 74 68 65 20 73 74 61   True if the sta
3b40: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3b50: 6c 20 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75  l is open */.  u
3b60: 38 20 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20  8 stmtInUse;    
3b70: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3b80: 75 65 20 77 65 20 61 72 65 20 69 6e 20 61 20 73  ue we are in a s
3b90: 74 61 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e  tatement subtran
3ba0: 73 61 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20  saction */.  u8 
3bb0: 73 74 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20  stmtAutoopen;   
3bc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e           /* Open
3bd0: 20 73 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68   stmt journal wh
3be0: 65 6e 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20  en main journal 
3bf0: 69 73 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38  is opened*/.  u8
3c00: 20 6e 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20   noSync;        
3c10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3c20: 6e 6f 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75  not sync the jou
3c30: 72 6e 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a  rnal if true */.
3c40: 20 20 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20    u8 fullSync;  
3c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c60: 20 44 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20   Do extra syncs 
3c70: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
3c80: 6f 72 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f  or robustness */
3c90: 0a 20 20 75 38 20 73 79 6e 63 5f 66 6c 61 67 73  .  u8 sync_flags
3ca0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
3cb0: 2a 20 4f 6e 65 20 6f 66 20 53 59 4e 43 5f 4e 4f  * One of SYNC_NO
3cc0: 52 4d 41 4c 20 6f 72 20 53 59 4e 43 5f 46 55 4c  RMAL or SYNC_FUL
3cd0: 4c 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 65 3b  L */.  u8 state;
3ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3cf0: 20 20 20 2f 2a 20 50 41 47 45 52 5f 55 4e 4c 4f     /* PAGER_UNLO
3d00: 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20 5f 52 45  CK, _SHARED, _RE
3d10: 53 45 52 56 45 44 2c 20 65 74 63 2e 20 2a 2f 0a  SERVED, etc. */.
3d20: 20 20 75 38 20 74 65 6d 70 46 69 6c 65 3b 20 20    u8 tempFile;  
3d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3d40: 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 61 20   zFilename is a 
3d50: 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 2a  temporary file *
3d60: 2f 0a 20 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b  /.  u8 readOnly;
3d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3d80: 2f 2a 20 54 72 75 65 20 66 6f 72 20 61 20 72 65  /* True for a re
3d90: 61 64 2d 6f 6e 6c 79 20 64 61 74 61 62 61 73 65  ad-only database
3da0: 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e   */.  u8 needSyn
3db0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3dc0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 6e 20    /* True if an 
3dd0: 66 73 79 6e 63 28 29 20 69 73 20 6e 65 65 64 65  fsync() is neede
3de0: 64 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d on the journal
3df0: 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 43 61   */.  u8 dirtyCa
3e00: 63 68 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  che;            
3e10: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 63 61 63    /* True if cac
3e20: 68 65 64 20 70 61 67 65 73 20 68 61 76 65 20 63  hed pages have c
3e30: 68 61 6e 67 65 64 20 2a 2f 0a 20 20 75 38 20 61  hanged */.  u8 a
3e40: 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20  lwaysRollback;  
3e50: 20 20 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62          /* Disab
3e60: 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  le DontRollback(
3e70: 29 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20  ) for all pages 
3e80: 2a 2f 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20  */.  u8 memDb;  
3e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ea0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69   /* True to inhi
3eb0: 62 69 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f  bit all file I/O
3ec0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
3ed0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
3ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3ef0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3f00: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3f10: 20 2a 2f 0a 20 20 75 38 20 64 6f 4e 6f 74 53 79   */.  u8 doNotSy
3f20: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
3f30: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 57 68    /* Boolean. Wh
3f40: 69 6c 65 20 74 72 75 65 2c 20 64 6f 20 6e 6f 74  ile true, do not
3f50: 20 73 70 69 6c 6c 20 74 68 65 20 63 61 63 68 65   spill the cache
3f60: 20 2a 2f 0a 20 20 75 38 20 65 78 63 6c 75 73 69   */.  u8 exclusi
3f70: 76 65 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20  veMode;         
3f80: 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e 2e 20 54 72    /* Boolean. Tr
3f90: 75 65 20 69 66 20 6c 6f 63 6b 69 6e 67 5f 6d 6f  ue if locking_mo
3fa0: 64 65 3d 3d 45 58 43 4c 55 53 49 56 45 20 2a 2f  de==EXCLUSIVE */
3fb0: 0a 20 20 75 38 20 63 68 61 6e 67 65 43 6f 75 6e  .  u8 changeCoun
3fc0: 74 44 6f 6e 65 3b 20 20 20 20 20 20 20 20 20 2f  tDone;         /
3fd0: 2a 20 53 65 74 20 61 66 74 65 72 20 69 6e 63 72  * Set after incr
3fe0: 65 6d 65 6e 74 69 6e 67 20 74 68 65 20 63 68 61  ementing the cha
3ff0: 6e 67 65 2d 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  nge-counter */. 
4000: 20 75 33 32 20 76 66 73 46 6c 61 67 73 3b 20 20   u32 vfsFlags;  
4010: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4020: 46 6c 61 67 73 20 66 6f 72 20 73 71 6c 69 74 65  Flags for sqlite
4030: 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
4040: 0a 20 20 69 6e 74 20 65 72 72 43 6f 64 65 3b 20  .  int errCode; 
4050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4060: 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72 61 6c  * One of several
4070: 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f 72 73   kinds of errors
4080: 20 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65   */.  int dbSize
4090: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
40a0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
40b0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
40c0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
40d0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
40e0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
40f0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
4100: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
4110: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
4120: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
4130: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
4140: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
4150: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  gin() */.  int n
4160: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
4170: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
4180: 20 6f 66 20 70 61 67 65 73 20 77 72 69 74 74 65   of pages writte
4190: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
41a0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 49   */.  u32 cksumI
41b0: 6e 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  nit;            
41c0: 20 20 2f 2a 20 51 75 61 73 69 2d 72 61 6e 64 6f    /* Quasi-rando
41d0: 6d 20 76 61 6c 75 65 20 61 64 64 65 64 20 74 6f  m value added to
41e0: 20 65 76 65 72 79 20 63 68 65 63 6b 73 75 6d 20   every checksum 
41f0: 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74 4e 52 65  */.  int stmtNRe
4200: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
4210: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
4220: 63 6f 72 64 73 20 69 6e 20 73 74 6d 74 20 73 75  cords in stmt su
4230: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e  bjournal */.  in
4240: 74 20 6e 45 78 74 72 61 3b 20 20 20 20 20 20 20  t nExtra;       
4250: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
4260: 20 74 68 69 73 20 6d 61 6e 79 20 62 79 74 65 73   this many bytes
4270: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
4280: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
4290: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
42a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
42b0: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
42c0: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   page */.  int n
42d0: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
42e0: 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c 20         /* Total 
42f0: 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d  number of in-mem
4300: 6f 72 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69  ory pages */.  i
4310: 6e 74 20 6e 52 65 66 3b 20 20 20 20 20 20 20 20  nt nRef;        
4320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4330: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
4340: 79 20 70 61 67 65 73 20 77 69 74 68 20 50 67 48  y pages with PgH
4350: 64 72 2e 6e 52 65 66 3e 30 20 2a 2f 0a 20 20 69  dr.nRef>0 */.  i
4360: 6e 74 20 6d 78 50 61 67 65 3b 20 20 20 20 20 20  nt mxPage;      
4370: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61             /* Ma
4380: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
4390: 70 61 67 65 73 20 74 6f 20 68 6f 6c 64 20 69 6e  pages to hold in
43a0: 20 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f   cache */.  Pgno
43b0: 20 6d 78 50 67 6e 6f 3b 20 20 20 20 20 20 20 20   mxPgno;        
43c0: 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d          /* Maxim
43d0: 75 6d 20 61 6c 6c 6f 77 65 64 20 73 69 7a 65 20  um allowed size 
43e0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
43f0: 2a 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72  */.  u8 *aInJour
4400: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
4410: 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20   /* One bit for 
4420: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
4430: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a   database file *
4440: 2f 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b  /.  u8 *aInStmt;
4450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4460: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
4470: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4480: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
4490: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
44a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
44b0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
44c0: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
44d0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
44e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
44f0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
4500: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
4510: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
4520: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
4530: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
4540: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
4550: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 74  s */.  char *zSt
4560: 6d 74 4a 72 6e 6c 3b 20 20 20 20 20 20 20 20 20  mtJrnl;         
4570: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4580: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
4590: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 73 71  nal file */.  sq
45a0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20  lite3_file *fd, 
45b0: 2a 6a 66 64 3b 20 20 20 20 20 2f 2a 20 46 69 6c  *jfd;     /* Fil
45c0: 65 20 64 65 73 63 72 69 70 74 6f 72 73 20 66 6f  e descriptors fo
45d0: 72 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a  r database and j
45e0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 73 71 6c 69  ournal */.  sqli
45f0: 74 65 33 5f 66 69 6c 65 20 2a 73 74 66 64 3b 20  te3_file *stfd; 
4600: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65 20          /* File 
4610: 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72 20 74  descriptor for t
4620: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4630: 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75 73 79  journal*/.  Busy
4640: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
4650: 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74  ndler;  /* Point
4660: 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73  er to sqlite.bus
4670: 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 61  yHandler */.  Pa
4680: 67 65 72 4c 72 75 4c 69 73 74 20 6c 72 75 3b 20  gerLruList lru; 
4690: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 52 55            /* LRU
46a0: 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70 61   list of free pa
46b0: 67 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ges */.  PgHdr *
46c0: 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  pAll;           
46d0: 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20       /* List of 
46e0: 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  all pages */.  P
46f0: 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20 20  gHdr *pStmt;    
4700: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69             /* Li
4710: 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74  st of pages in t
4720: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62  he statement sub
4730: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 50 67 48  journal */.  PgH
4740: 64 72 20 2a 70 44 69 72 74 79 3b 20 20 20 20 20  dr *pDirty;     
4750: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
4760: 20 6f 66 20 61 6c 6c 20 64 69 72 74 79 20 70 61   of all dirty pa
4770: 67 65 73 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ges */.  i64 jou
4780: 72 6e 61 6c 4f 66 66 3b 20 20 20 20 20 20 20 20  rnalOff;        
4790: 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
47a0: 62 79 74 65 20 6f 66 66 73 65 74 20 69 6e 20 74  byte offset in t
47b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
47c0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
47d0: 48 64 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Hdr;            
47e0: 20 2f 2a 20 42 79 74 65 20 6f 66 66 73 65 74 20   /* Byte offset 
47f0: 74 6f 20 70 72 65 76 69 6f 75 73 20 6a 6f 75 72  to previous jour
4800: 6e 61 6c 20 68 65 61 64 65 72 20 2a 2f 0a 20 20  nal header */.  
4810: 69 36 34 20 73 74 6d 74 48 64 72 4f 66 66 3b 20  i64 stmtHdrOff; 
4820: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
4830: 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61  irst journal hea
4840: 64 65 72 20 77 72 69 74 74 65 6e 20 74 68 69 73  der written this
4850: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
4860: 69 36 34 20 73 74 6d 74 43 6b 73 75 6d 3b 20 20  i64 stmtCksum;  
4870: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63              /* c
4880: 6b 73 75 6d 49 6e 69 74 20 77 68 65 6e 20 73 74  ksumInit when st
4890: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
48a0: 74 65 64 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ted */.  i64 stm
48b0: 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  tJSize;         
48c0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
48d0: 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74 5f  journal at stmt_
48e0: 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e 74  begin() */.  int
48f0: 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20 20   sectorSize;    
4900: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73 75           /* Assu
4910: 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20  med sector size 
4920: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20  during rollback 
4930: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4940: 5f 54 45 53 54 0a 20 20 69 6e 74 20 6e 48 69 74  _TEST.  int nHit
4950: 2c 20 6e 4d 69 73 73 3b 20 20 20 20 20 20 20 20  , nMiss;        
4960: 20 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74      /* Cache hit
4970: 73 20 61 6e 64 20 6d 69 73 73 69 6e 67 20 2a 2f  s and missing */
4980: 0a 20 20 69 6e 74 20 6e 52 65 61 64 2c 20 6e 57  .  int nRead, nW
4990: 72 69 74 65 3b 20 20 20 20 20 20 20 20 20 20 2f  rite;          /
49a0: 2a 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73  * Database pages
49b0: 20 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f   read/written */
49c0: 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20 28  .#endif.  void (
49d0: 2a 78 44 65 73 74 72 75 63 74 6f 72 29 28 44 62  *xDestructor)(Db
49e0: 50 61 67 65 2a 2c 69 6e 74 29 3b 20 2f 2a 20 43  Page*,int); /* C
49f0: 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  all this routine
4a00: 20 77 68 65 6e 20 66 72 65 65 69 6e 67 20 70 61   when freeing pa
4a10: 67 65 73 20 2a 2f 0a 20 20 76 6f 69 64 20 28 2a  ges */.  void (*
4a20: 78 52 65 69 6e 69 74 65 72 29 28 44 62 50 61 67  xReiniter)(DbPag
4a30: 65 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20 43 61  e*,int);   /* Ca
4a40: 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ll this routine 
4a50: 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67 20 70  when reloading p
4a60: 61 67 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53  ages */.#ifdef S
4a70: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
4a80: 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64 65 63    void *(*xCodec
4a90: 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67  )(void*,void*,Pg
4aa0: 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74  no,int); /* Rout
4ab0: 69 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64  ine for en/decod
4ac0: 69 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f  ing data */.  vo
4ad0: 69 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20  id *pCodecArg;  
4ae0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72            /* Fir
4af0: 73 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78  st argument to x
4b00: 43 6f 64 65 63 28 29 20 2a 2f 0a 23 65 6e 64 69  Codec() */.#endi
4b10: 66 0a 20 20 69 6e 74 20 6e 48 61 73 68 3b 20 20  f.  int nHash;  
4b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4b30: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 70  /* Size of the p
4b40: 61 67 65 72 20 68 61 73 68 20 74 61 62 6c 65 20  ager hash table 
4b50: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 2a 61 48 61  */.  PgHdr **aHa
4b60: 73 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  sh;             
4b70: 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20 74   /* Hash table t
4b80: 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62 65  o map page numbe
4b90: 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 23 69  r to PgHdr */.#i
4ba0: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
4bb0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
4bc0: 4d 45 4e 54 0a 20 20 50 61 67 65 72 20 2a 70 4e  MENT.  Pager *pN
4bd0: 65 78 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  ext;            
4be0: 20 20 20 2f 2a 20 44 6f 75 62 6c 79 20 6c 69 6e     /* Doubly lin
4bf0: 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67 65  ked list of page
4c00: 72 73 20 6f 6e 20 77 68 69 63 68 20 2a 2f 0a 20  rs on which */. 
4c10: 20 50 61 67 65 72 20 2a 70 50 72 65 76 3b 20 20   Pager *pPrev;  
4c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4c30: 73 71 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f  sqlite3_release_
4c40: 6d 65 6d 6f 72 79 28 29 20 77 69 6c 6c 20 77 6f  memory() will wo
4c50: 72 6b 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 55  rk */.  int iInU
4c60: 73 65 4d 4d 3b 20 20 20 20 20 20 20 20 20 20 20  seMM;           
4c70: 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72 6f 20      /* Non-zero 
4c80: 69 66 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 74  if unavailable t
4c90: 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e 74 20 69 49  o MM */.  int iI
4ca0: 6e 55 73 65 44 42 3b 20 20 20 20 20 20 20 20 20  nUseDB;         
4cb0: 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a 65 72        /* Non-zer
4cc0: 6f 20 69 66 20 69 6e 20 73 71 6c 69 74 65 33 5f  o if in sqlite3_
4cd0: 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29  release_memory()
4ce0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 63 68 61   */.#endif.  cha
4cf0: 72 20 2a 70 54 6d 70 53 70 61 63 65 3b 20 20 20  r *pTmpSpace;   
4d00: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67 65           /* Page
4d10: 72 2e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  r.pageSize bytes
4d20: 20 6f 66 20 73 70 61 63 65 20 66 6f 72 20 74 6d   of space for tm
4d30: 70 20 75 73 65 20 2a 2f 0a 20 20 63 68 61 72 20  p use */.  char 
4d40: 64 62 46 69 6c 65 56 65 72 73 5b 31 36 5d 3b 20  dbFileVers[16]; 
4d50: 20 20 20 20 20 20 20 2f 2a 20 43 68 61 6e 67 65         /* Change
4d60: 73 20 77 68 65 6e 65 76 65 72 20 64 61 74 61 62  s whenever datab
4d70: 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65 73  ase file changes
4d80: 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68   */.};../*.** Th
4d90: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62  e following glob
4da0: 61 6c 20 76 61 72 69 61 62 6c 65 73 20 68 6f 6c  al variables hol
4db0: 64 20 63 6f 75 6e 74 65 72 73 20 75 73 65 64 20  d counters used 
4dc0: 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 70  for.** testing p
4dd0: 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e 20 20 54  urposes only.  T
4de0: 68 65 73 65 20 76 61 72 69 61 62 6c 65 73 20 64  hese variables d
4df0: 6f 20 6e 6f 74 20 65 78 69 73 74 20 69 6e 0a 2a  o not exist in.*
4e00: 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69 6e 67 20  * a non-testing 
4e10: 62 75 69 6c 64 2e 20 20 54 68 65 73 65 20 76 61  build.  These va
4e20: 72 69 61 62 6c 65 73 20 61 72 65 20 6e 6f 74 20  riables are not 
4e30: 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 2a 2f 0a  thread-safe..*/.
4e40: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
4e50: 53 54 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70  ST.int sqlite3_p
4e60: 61 67 65 72 5f 72 65 61 64 64 62 5f 63 6f 75 6e  ager_readdb_coun
4e70: 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  t = 0;    /* Num
4e80: 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65  ber of full page
4e90: 73 20 72 65 61 64 20 66 72 6f 6d 20 44 42 20 2a  s read from DB *
4ea0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4eb0: 67 65 72 5f 77 72 69 74 65 64 62 5f 63 6f 75 6e  ger_writedb_coun
4ec0: 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62  t = 0;   /* Numb
4ed0: 65 72 20 6f 66 20 66 75 6c 6c 20 70 61 67 65 73  er of full pages
4ee0: 20 77 72 69 74 74 65 6e 20 74 6f 20 44 42 20 2a   written to DB *
4ef0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4f00: 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e 74  ger_writej_count
4f10: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4f20: 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69 74  er of pages writ
4f30: 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a  ten to journal *
4f40: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 5f 70 61  /.int sqlite3_pa
4f50: 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e 74  ger_pgfree_count
4f60: 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62   = 0;    /* Numb
4f70: 65 72 20 6f 66 20 63 61 63 68 65 20 70 61 67 65  er of cache page
4f80: 73 20 66 72 65 65 64 20 2a 2f 0a 23 20 64 65 66  s freed */.# def
4f90: 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52 28 76  ine PAGER_INCR(v
4fa0: 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a 23 20 64  )  v++.#else.# d
4fb0: 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43 52  efine PAGER_INCR
4fc0: 28 76 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (v).#endif../*.*
4fd0: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4fe0: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
4ff0: 74 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 61  to the head of a
5000: 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b 65 64 20 6c   double-linked l
5010: 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 20 70 61  ist.** of all pa
5020: 67 65 72 73 20 74 68 61 74 20 61 72 65 20 65 6c  gers that are el
5030: 69 67 69 62 6c 65 20 66 6f 72 20 70 61 67 65 20  igible for page 
5040: 73 74 65 61 6c 69 6e 67 20 62 79 20 74 68 65 0a  stealing by the.
5050: 2a 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65 61  ** sqlite3_relea
5060: 73 65 5f 6d 65 6d 6f 72 79 28 29 20 69 6e 74 65  se_memory() inte
5070: 72 66 61 63 65 2e 20 20 41 63 63 65 73 73 20 74  rface.  Access t
5080: 6f 20 74 68 69 73 20 6c 69 73 74 20 69 73 0a 2a  o this list is.*
5090: 2a 20 70 72 6f 74 65 63 74 65 64 20 62 79 20 74  * protected by t
50a0: 68 65 20 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f  he SQLITE_MUTEX_
50b0: 53 54 41 54 49 43 5f 4d 45 4d 32 20 6d 75 74 65  STATIC_MEM2 mute
50c0: 78 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  x..*/.#ifdef SQL
50d0: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
50e0: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 73 74 61  Y_MANAGEMENT.sta
50f0: 74 69 63 20 50 61 67 65 72 20 2a 73 71 6c 69 74  tic Pager *sqlit
5100: 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 30 3b  e3PagerList = 0;
5110: 0a 73 74 61 74 69 63 20 50 61 67 65 72 4c 72 75  .static PagerLru
5120: 4c 69 73 74 20 73 71 6c 69 74 65 33 4c 72 75 50  List sqlite3LruP
5130: 61 67 65 4c 69 73 74 20 3d 20 7b 30 2c 20 30 2c  ageList = {0, 0,
5140: 20 30 7d 3b 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a   0};.#endif.../*
5150: 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** Journal file
5160: 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68 65  s begin with the
5170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63   following magic
5180: 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61   string.  The da
5190: 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e  ta.** was obtain
51a0: 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e  ed from /dev/ran
51b0: 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64  dom.  It is used
51c0: 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74   only as a sanit
51d0: 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53  y check..**.** S
51e0: 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38  ince version 2.8
51f0: 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .0, the journal 
5200: 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20  format contains 
5210: 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74  additional sanit
5220: 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e  y.** checking in
5230: 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74  formation.  If t
5240: 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77  he power fails w
5250: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
5260: 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69   is begin.** wri
5270: 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f  tten, semi-rando
5280: 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20 6d  m garbage data m
5290: 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 74  ight appear in t
52a0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
52b0: 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20 69  le after power i
52c0: 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20  s restored.  If 
52d0: 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74 68  an attempt is th
52e0: 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f  en made.** to ro
52f0: 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62  ll the journal b
5300: 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73  ack, the databas
5310: 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75  e could be corru
5320: 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69 74  pted.  The addit
5330: 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20  ional.** sanity 
5340: 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73  checking data is
5350: 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64   an attempt to d
5360: 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72 62  iscover the garb
5370: 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f  age in the.** jo
5380: 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65  urnal and ignore
5390: 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73   it..**.** The s
53a0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69  anity checking i
53b0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
53c0: 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66  he new journal f
53d0: 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a  ormat consists.*
53e0: 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68  * of a 32-bit ch
53f0: 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70  ecksum on each p
5400: 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68  age of data.  Th
5410: 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72  e checksum cover
5420: 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61  s both.** the pa
5430: 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68  ge number and th
5440: 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e pPager->pageSi
5450: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
5460: 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a   for the page..*
5470: 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20  * This cksum is 
5480: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61  initialized to a
5490: 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76   32-bit random v
54a0: 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61 72  alue that appear
54b0: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  s in the.** jour
54c0: 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61  nal file right a
54d0: 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72 2e  fter the header.
54e0: 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69    The random ini
54f0: 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f  tializer is impo
5500: 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73  rtant,.** becaus
5510: 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74  e garbage data t
5520: 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20 74  hat appears at t
5530: 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72  he end of a jour
5540: 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a  nal is likely.**
5550: 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20 6f   data that was o
5560: 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c  nce in other fil
5570: 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77  es that have now
5580: 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20   been deleted.  
5590: 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67  If the.** garbag
55a0: 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d  e data came from
55b0: 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75   an obsolete jou
55c0: 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63  rnal file, the c
55d0: 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a  hecksums might.*
55e0: 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42  * be correct.  B
55f0: 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69  ut by initializi
5600: 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20  ng the checksum 
5610: 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20  to random value 
5620: 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66  which.** is diff
5630: 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20  erent for every 
5640: 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69  journal, we mini
5650: 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a  mize that risk..
5660: 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20  */.static const 
5670: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a  unsigned char aJ
5680: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20  ournalMagic[] = 
5690: 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20  {.  0xd9, 0xd5, 
56a0: 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30  0x05, 0xf9, 0x20
56b0: 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78  , 0xa1, 0x63, 0x
56c0: 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68  d7,.};../*.** Th
56d0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65  e size of the he
56e0: 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68  ader and of each
56f0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75   page in the jou
5700: 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e  rnal is determin
5710: 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c  ed.** by the fol
5720: 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a  lowing macros..*
5730: 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41  /.#define JOURNA
5740: 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20  L_PG_SZ(pPager) 
5750: 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53   ((pPager->pageS
5760: 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a  ize) + 8)../*.**
5770: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   The journal hea
5780: 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  der size for thi
5790: 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20  s pager. In the 
57a0: 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75  future, this cou
57b0: 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20  ld be.** set to 
57c0: 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20  some value read 
57d0: 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f  from the disk co
57e0: 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d  ntroller. The im
57f0: 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61  portant.** chara
5800: 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68 61  cteristic is tha
5810: 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d 65  t it is the same
5820: 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20   size as a disk 
5830: 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69  sector..*/.#defi
5840: 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ne JOURNAL_HDR_S
5850: 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67 65  Z(pPager) (pPage
5860: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a  r->sectorSize)..
5870: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20  /*.** The macro 
5880: 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69 66  MEMDB is true if
5890: 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20   we are dealing 
58a0: 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  with an in-memor
58b0: 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57  y database..** W
58c0: 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d  e do this as a m
58d0: 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20  acro so that if 
58e0: 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  the SQLITE_OMIT_
58f0: 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69  MEMORYDB macro i
5900: 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61  s set,.** the va
5910: 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c  lue of MEMDB wil
5920: 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20  l be a constant 
5930: 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72  and the compiler
5940: 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a   will optimize.*
5950: 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20  * out code that 
5960: 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63  would never exec
5970: 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  ute..*/.#ifdef S
5980: 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
5990: 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d  YDB.# define MEM
59a0: 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66  DB 0.#else.# def
59b0: 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72  ine MEMDB pPager
59c0: 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a  ->memDb.#endif..
59d0: 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75 6d 62 65  /*.** Page numbe
59e0: 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 20  r PAGER_MJ_PGNO 
59f0: 69 73 20 6e 65 76 65 72 20 75 73 65 64 20 69 6e  is never used in
5a00: 20 61 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62   an SQLite datab
5a10: 61 73 65 20 28 69 74 20 69 73 0a 2a 2a 20 72 65  ase (it is.** re
5a20: 73 65 72 76 65 64 20 66 6f 72 20 77 6f 72 6b 69  served for worki
5a30: 6e 67 20 61 72 6f 75 6e 64 20 61 20 77 69 6e 64  ng around a wind
5a40: 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63 6f 6d 70  ows/posix incomp
5a50: 61 74 69 62 69 6c 69 74 79 29 2e 20 49 74 20 69  atibility). It i
5a60: 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20 74 68 65  s.** used in the
5a70: 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 69 67 6e   journal to sign
5a80: 69 66 79 20 74 68 61 74 20 74 68 65 20 72 65 6d  ify that the rem
5a90: 61 69 6e 64 65 72 20 6f 66 20 74 68 65 20 6a 6f  ainder of the jo
5aa0: 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a 2a 20 69  urnal file .** i
5ab0: 73 20 64 65 76 6f 74 65 64 20 74 6f 20 73 74 6f  s devoted to sto
5ac0: 72 69 6e 67 20 61 20 6d 61 73 74 65 72 20 6a 6f  ring a master jo
5ad0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20 74 68 65  urnal name - the
5ae0: 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 70  re are no more p
5af0: 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f 6c 6c 20  ages to.** roll 
5b00: 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d 6d 65 6e  back. See commen
5b10: 74 73 20 66 6f 72 20 66 75 6e 63 74 69 6f 6e 20  ts for function 
5b20: 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e  writeMasterJourn
5b30: 61 6c 28 29 20 66 6f 72 20 64 65 74 61 69 6c 73  al() for details
5b40: 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69 6e 65 20  ..*/./* #define 
5b50: 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29  PAGER_MJ_PGNO(x)
5b60: 20 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28   (PENDING_BYTE/(
5b70: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 20  (x)->pageSize)) 
5b80: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
5b90: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 28 50 45  _MJ_PGNO(x) ((PE
5ba0: 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d  NDING_BYTE/((x)-
5bb0: 3e 70 61 67 65 53 69 7a 65 29 29 2b 31 29 0a 0a  >pageSize))+1)..
5bc0: 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75  /*.** The maximu
5bd0: 6d 20 6c 65 67 61 6c 20 70 61 67 65 20 6e 75 6d  m legal page num
5be0: 62 65 72 20 69 73 20 28 32 5e 33 31 20 2d 20 31  ber is (2^31 - 1
5bf0: 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )..*/.#define PA
5c00: 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 32 31 34  GER_MAX_PGNO 214
5c10: 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a 2a 20 54  7483647../*.** T
5c20: 68 65 20 70 61 67 65 72 45 6e 74 65 72 28 29 20  he pagerEnter() 
5c30: 61 6e 64 20 70 61 67 65 72 4c 65 61 76 65 28 29  and pagerLeave()
5c40: 20 72 6f 75 74 69 6e 65 73 20 61 63 71 75 69 72   routines acquir
5c50: 65 20 61 6e 64 20 72 65 6c 65 61 73 65 0a 2a 2a  e and release.**
5c60: 20 61 20 6d 75 74 65 78 20 6f 6e 20 65 61 63 68   a mutex on each
5c70: 20 70 61 67 65 72 2e 20 20 54 68 65 20 6d 75 74   pager.  The mut
5c80: 65 78 20 69 73 20 72 65 63 75 72 73 69 76 65 2e  ex is recursive.
5c90: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
5ca0: 20 73 70 65 63 69 61 6c 2d 70 75 72 70 6f 73 65   special-purpose
5cb0: 20 6d 75 74 65 78 2e 20 20 49 74 20 6f 6e 6c 79   mutex.  It only
5cc0: 20 70 72 6f 76 69 64 65 73 20 6d 75 74 75 61 6c   provides mutual
5cd0: 20 65 78 63 6c 75 73 69 6f 6e 0a 2a 2a 20 62 65   exclusion.** be
5ce0: 74 77 65 65 6e 20 74 68 65 20 42 74 72 65 65 20  tween the Btree 
5cf0: 61 6e 64 20 74 68 65 20 4d 65 6d 6f 72 79 20 4d  and the Memory M
5d00: 61 6e 61 67 65 6d 65 6e 74 20 73 71 6c 69 74 65  anagement sqlite
5d10: 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79  3_release_memory
5d20: 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 2e 20  ().** function. 
5d30: 20 49 74 20 64 6f 65 73 20 6e 6f 74 20 70 72 65   It does not pre
5d40: 76 65 6e 74 2c 20 66 6f 72 20 65 78 61 6d 70 6c  vent, for exampl
5d50: 65 2c 20 74 77 6f 20 42 74 72 65 65 73 20 66 72  e, two Btrees fr
5d60: 6f 6d 20 61 63 63 65 73 73 69 6e 67 0a 2a 2a 20  om accessing.** 
5d70: 74 68 65 20 73 61 6d 65 20 70 61 67 65 72 20 61  the same pager a
5d80: 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
5d90: 20 20 4f 74 68 65 72 20 67 65 6e 65 72 61 6c 2d    Other general-
5da0: 70 75 72 70 6f 73 65 20 6d 75 74 65 78 65 73 20  purpose mutexes 
5db0: 69 6e 0a 2a 2a 20 74 68 65 20 62 74 72 65 65 20  in.** the btree 
5dc0: 6c 61 79 65 72 20 68 61 6e 64 6c 65 20 74 68 61  layer handle tha
5dd0: 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a 23 69 66 64  t chore..*/.#ifd
5de0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
5df0: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
5e00: 4e 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  NT.  static void
5e10: 20 70 61 67 65 72 45 6e 74 65 72 28 50 61 67 65   pagerEnter(Page
5e20: 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d 3e 69 49  r *p){.    p->iI
5e30: 6e 55 73 65 44 42 2b 2b 3b 0a 20 20 20 20 69 66  nUseDB++;.    if
5e40: 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 20 26 26  ( p->iInUseMM &&
5e50: 20 70 2d 3e 69 49 6e 55 73 65 44 42 3d 3d 31 20   p->iInUseDB==1 
5e60: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5e70: 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 0a 20  _mutex *mutex;. 
5e80: 20 20 20 20 20 6d 75 74 65 78 20 3d 20 73 71 6c       mutex = sql
5e90: 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
5ea0: 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
5eb0: 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20  ATIC_MEM2);.    
5ec0: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20    p->iInUseDB = 
5ed0: 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  0;.      sqlite3
5ee0: 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
5ef0: 65 78 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 49  ex);.      p->iI
5f00: 6e 55 73 65 44 42 20 3d 20 31 3b 0a 20 20 20 20  nUseDB = 1;.    
5f10: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
5f20: 6c 65 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20  leave(mutex);.  
5f30: 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
5f40: 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d 3d 30 20 29  p->iInUseMM==0 )
5f50: 3b 0a 20 20 7d 0a 20 20 73 74 61 74 69 63 20 76  ;.  }.  static v
5f60: 6f 69 64 20 70 61 67 65 72 4c 65 61 76 65 28 50  oid pagerLeave(P
5f70: 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70 2d  ager *p){.    p-
5f80: 3e 69 49 6e 55 73 65 44 42 2d 2d 3b 0a 20 20 20  >iInUseDB--;.   
5f90: 20 61 73 73 65 72 74 28 20 70 2d 3e 69 49 6e 55   assert( p->iInU
5fa0: 73 65 44 42 3e 3d 30 20 29 3b 0a 20 20 7d 0a 23  seDB>=0 );.  }.#
5fb0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
5fc0: 67 65 72 45 6e 74 65 72 28 58 29 0a 23 20 64 65  gerEnter(X).# de
5fd0: 66 69 6e 65 20 70 61 67 65 72 4c 65 61 76 65 28  fine pagerLeave(
5fe0: 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  X).#endif../*.**
5ff0: 20 41 64 64 20 70 61 67 65 20 70 50 67 20 74 6f   Add page pPg to
6000: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
6010: 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6d 61 6e 61  linked list mana
6020: 67 65 64 20 62 79 20 73 74 72 75 63 74 75 72 65  ged by structure
6030: 0a 2a 2a 20 70 4c 69 73 74 20 28 70 50 67 20 62  .** pList (pPg b
6040: 65 63 6f 6d 65 73 20 74 68 65 20 6c 61 73 74 20  ecomes the last 
6050: 65 6e 74 72 79 20 69 6e 20 74 68 65 20 6c 69 73  entry in the lis
6060: 74 20 2d 20 74 68 65 20 6d 6f 73 74 20 72 65 63  t - the most rec
6070: 65 6e 74 6c 79 20 0a 2a 2a 20 75 73 65 64 29 2e  ently .** used).
6080: 20 41 72 67 75 6d 65 6e 74 20 70 4c 69 6e 6b 20   Argument pLink 
6090: 73 68 6f 75 6c 64 20 70 6f 69 6e 74 20 74 6f 20  should point to 
60a0: 65 69 74 68 65 72 20 70 50 67 2d 3e 66 72 65 65  either pPg->free
60b0: 20 6f 72 20 70 50 67 2d 3e 67 66 72 65 65 2c 0a   or pPg->gfree,.
60c0: 2a 2a 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  ** depending on 
60d0: 77 68 65 74 68 65 72 20 70 50 67 20 69 73 20 62  whether pPg is b
60e0: 65 69 6e 67 20 61 64 64 65 64 20 74 6f 20 74 68  eing added to th
60f0: 65 20 70 61 67 65 72 2d 73 70 65 63 69 66 69 63  e pager-specific
6100: 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61 6c 20 4c 52   or.** global LR
6110: 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69  U list..*/.stati
6120: 63 20 76 6f 69 64 20 6c 69 73 74 41 64 64 28 50  c void listAdd(P
6130: 61 67 65 72 4c 72 75 4c 69 73 74 20 2a 70 4c 69  agerLruList *pLi
6140: 73 74 2c 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b  st, PagerLruLink
6150: 20 2a 70 4c 69 6e 6b 2c 20 50 67 48 64 72 20 2a   *pLink, PgHdr *
6160: 70 50 67 29 7b 0a 20 20 70 4c 69 6e 6b 2d 3e 70  pPg){.  pLink->p
6170: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 70 4c 69 6e  Next = 0;.  pLin
6180: 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c 69 73 74  k->pPrev = pList
6190: 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69 66 64 65 66  ->pLast;..#ifdef
61a0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
61b0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
61c0: 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d  .  assert(pLink=
61d0: 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70  =&pPg->free || p
61e0: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
61f0: 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69  e);.  assert(pLi
6200: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20  nk==&pPg->gfree 
6210: 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74  || pList!=&sqlit
6220: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a  e3LruPageList);.
6230: 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 4c  #endif..  if( pL
6240: 69 73 74 2d 3e 70 4c 61 73 74 20 29 7b 0a 20 20  ist->pLast ){.  
6250: 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63 68    int iOff = (ch
6260: 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68  ar *)pLink - (ch
6270: 61 72 20 2a 29 70 50 67 3b 0a 20 20 20 20 50 61  ar *)pPg;.    Pa
6280: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 61 73  gerLruLink *pLas
6290: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
62a0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
62b0: 29 70 4c 69 73 74 2d 3e 70 4c 61 73 74 29 5b 69  )pList->pLast)[i
62c0: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4c 61 73 74  Off]);.    pLast
62d0: 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 50  Link->pNext = pP
62e0: 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  g;.  }else{.    
62f0: 61 73 73 65 72 74 28 21 70 4c 69 73 74 2d 3e 70  assert(!pList->p
6300: 46 69 72 73 74 29 3b 0a 20 20 20 20 70 4c 69 73  First);.    pLis
6310: 74 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  t->pFirst = pPg;
6320: 0a 20 20 7d 0a 0a 20 20 70 4c 69 73 74 2d 3e 70  .  }..  pList->p
6330: 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20 69 66  Last = pPg;.  if
6340: 28 20 21 70 4c 69 73 74 2d 3e 70 46 69 72 73 74  ( !pList->pFirst
6350: 53 79 6e 63 65 64 20 26 26 20 70 50 67 2d 3e 6e  Synced && pPg->n
6360: 65 65 64 53 79 6e 63 3d 3d 30 20 29 7b 0a 20 20  eedSync==0 ){.  
6370: 20 20 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 53    pList->pFirstS
6380: 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 7d  ynced = pPg;.  }
6390: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65  .}../*.** Remove
63a0: 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20 6c 69   pPg from the li
63b0: 73 74 20 6d 61 6e 61 67 65 64 20 62 79 20 74 68  st managed by th
63c0: 65 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e  e structure poin
63d0: 74 65 64 20 74 6f 20 62 79 20 70 4c 69 73 74 2e  ted to by pList.
63e0: 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  .**.** Argument 
63f0: 70 4c 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69  pLink should poi
6400: 6e 74 20 74 6f 20 65 69 74 68 65 72 20 70 50 67  nt to either pPg
6410: 2d 3e 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67  ->free or pPg->g
6420: 66 72 65 65 2c 20 64 65 70 65 6e 64 69 6e 67 20  free, depending 
6430: 0a 2a 2a 20 6f 6e 20 77 68 65 74 68 65 72 20 70  .** on whether p
6440: 50 67 20 69 73 20 62 65 69 6e 67 20 61 64 64 65  Pg is being adde
6450: 64 20 74 6f 20 74 68 65 20 70 61 67 65 72 2d 73  d to the pager-s
6460: 70 65 63 69 66 69 63 20 6f 72 20 67 6c 6f 62 61  pecific or globa
6470: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6480: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 52  tatic void listR
6490: 65 6d 6f 76 65 28 50 61 67 65 72 4c 72 75 4c 69  emove(PagerLruLi
64a0: 73 74 20 2a 70 4c 69 73 74 2c 20 50 61 67 65 72  st *pList, Pager
64b0: 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20  LruLink *pLink, 
64c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
64d0: 6e 74 20 69 4f 66 66 20 3d 20 28 63 68 61 72 20  nt iOff = (char 
64e0: 2a 29 70 4c 69 6e 6b 20 2d 20 28 63 68 61 72 20  *)pLink - (char 
64f0: 2a 29 70 50 67 3b 0a 0a 23 69 66 64 65 66 20 53  *)pPg;..#ifdef S
6500: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
6510: 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
6520: 20 61 73 73 65 72 74 28 70 4c 69 6e 6b 3d 3d 26   assert(pLink==&
6530: 70 50 67 2d 3e 66 72 65 65 20 7c 7c 20 70 4c 69  pPg->free || pLi
6540: 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 29  nk==&pPg->gfree)
6550: 3b 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e 6b  ;.  assert(pLink
6560: 3d 3d 26 70 50 67 2d 3e 67 66 72 65 65 20 7c 7c  ==&pPg->gfree ||
6570: 20 70 4c 69 73 74 21 3d 26 73 71 6c 69 74 65 33   pList!=&sqlite3
6580: 4c 72 75 50 61 67 65 4c 69 73 74 29 3b 0a 23 65  LruPageList);.#e
6590: 6e 64 69 66 0a 0a 20 20 69 66 28 20 70 50 67 3d  ndif..  if( pPg=
65a0: 3d 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 29  =pList->pFirst )
65b0: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
65c0: 72 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  rst = pLink->pNe
65d0: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  xt;.  }.  if( pP
65e0: 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20  g==pList->pLast 
65f0: 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 4c  ){.    pList->pL
6600: 61 73 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72  ast = pLink->pPr
6610: 65 76 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  ev;.  }.  if( pL
6620: 69 6e 6b 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20  ink->pPrev ){.  
6630: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6640: 70 50 72 65 76 4c 69 6e 6b 20 3d 20 28 50 61 67  pPrevLink = (Pag
6650: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
6660: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 50 72 65  u8 *)pLink->pPre
6670: 76 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  v)[iOff]);.    p
6680: 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  PrevLink->pNext 
6690: 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a  = pLink->pNext;.
66a0: 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 6e 6b 2d    }.  if( pLink-
66b0: 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 50 61  >pNext ){.    Pa
66c0: 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4e 65 78  gerLruLink *pNex
66d0: 74 4c 69 6e 6b 20 3d 20 28 50 61 67 65 72 4c 72  tLink = (PagerLr
66e0: 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a  uLink *)(&((u8 *
66f0: 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 29 5b 69  )pLink->pNext)[i
6700: 4f 66 66 5d 29 3b 0a 20 20 20 20 70 4e 65 78 74  Off]);.    pNext
6710: 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70 4c  Link->pPrev = pL
6720: 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a 20 20 7d 0a  ink->pPrev;.  }.
6730: 20 20 69 66 28 20 70 50 67 3d 3d 70 4c 69 73 74    if( pPg==pList
6740: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
6750: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
6760: 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78 74 3b 0a 20   pLink->pNext;. 
6770: 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70     while( p && p
6780: 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
6790: 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b      PagerLruLink
67a0: 20 2a 70 4c 20 3d 20 28 50 61 67 65 72 4c 72 75   *pL = (PagerLru
67b0: 4c 69 6e 6b 20 2a 29 28 26 28 28 75 38 20 2a 29  Link *)(&((u8 *)
67c0: 70 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 20  p)[iOff]);.     
67d0: 20 70 20 3d 20 70 4c 2d 3e 70 4e 65 78 74 3b 0a   p = pL->pNext;.
67e0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
67f0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
6800: 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 6e 6b 2d  p;.  }..  pLink-
6810: 3e 70 4e 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e  >pNext = pLink->
6820: 70 50 72 65 76 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  pPrev = 0;.}../*
6830: 20 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50   .** Add page pP
6840: 67 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  g to the list of
6850: 20 66 72 65 65 20 70 61 67 65 73 20 66 6f 72 20   free pages for 
6860: 74 68 65 20 70 61 67 65 72 2e 20 49 66 20 0a 2a  the pager. If .*
6870: 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d  * memory-managem
6880: 65 6e 74 20 69 73 20 65 6e 61 62 6c 65 64 2c 20  ent is enabled, 
6890: 61 6c 73 6f 20 61 64 64 20 74 68 65 20 70 61 67  also add the pag
68a0: 65 20 74 6f 20 74 68 65 20 67 6c 6f 62 61 6c 20  e to the global 
68b0: 0a 2a 2a 20 6c 69 73 74 20 6f 66 20 66 72 65 65  .** list of free
68c0: 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69   pages..*/.stati
68d0: 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74 41 64  c void lruListAd
68e0: 64 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20  d(PgHdr *pPg){. 
68f0: 20 6c 69 73 74 41 64 64 28 26 70 50 67 2d 3e 70   listAdd(&pPg->p
6900: 50 61 67 65 72 2d 3e 6c 72 75 2c 20 26 70 50 67  Pager->lru, &pPg
6910: 2d 3e 66 72 65 65 2c 20 70 50 67 29 3b 0a 23 69  ->free, pPg);.#i
6920: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
6930: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
6940: 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50 67 2d  MENT.  if( !pPg-
6950: 3e 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29  >pPager->memDb )
6960: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75  {.    sqlite3_mu
6970: 74 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65  tex_enter(sqlite
6980: 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
6990: 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
69a0: 43 5f 4c 52 55 29 29 3b 0a 20 20 20 20 6c 69 73  C_LRU));.    lis
69b0: 74 41 64 64 28 26 73 71 6c 69 74 65 33 4c 72 75  tAdd(&sqlite3Lru
69c0: 50 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e  PageList, &pPg->
69d0: 67 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20  gfree, pPg);.   
69e0: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c   sqlite3_mutex_l
69f0: 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74  eave(sqlite3_mut
6a00: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
6a10: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6a20: 29 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d  ));.  }.#endif.}
6a30: 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d 6f 76 65 20  ../* .** Remove 
6a40: 70 61 67 65 20 70 50 67 20 66 72 6f 6d 20 74 68  page pPg from th
6a50: 65 20 6c 69 73 74 20 6f 66 20 66 72 65 65 20 70  e list of free p
6a60: 61 67 65 73 20 66 6f 72 20 74 68 65 20 61 73 73  ages for the ass
6a70: 6f 63 69 61 74 65 64 20 70 61 67 65 72 2e 0a 2a  ociated pager..*
6a80: 2a 20 49 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61  * If memory-mana
6a90: 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c 65  gement is enable
6aa0: 64 2c 20 61 6c 73 6f 20 72 65 6d 6f 76 65 20 70  d, also remove p
6ab0: 50 67 20 66 72 6f 6d 20 74 68 65 20 67 6c 6f 62  Pg from the glob
6ac0: 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 66 72  al list.** of fr
6ad0: 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  ee pages..*/.sta
6ae0: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6af0: 52 65 6d 6f 76 65 28 50 67 48 64 72 20 2a 70 50  Remove(PgHdr *pP
6b00: 67 29 7b 0a 20 20 6c 69 73 74 52 65 6d 6f 76 65  g){.  listRemove
6b10: 28 26 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6c  (&pPg->pPager->l
6b20: 72 75 2c 20 26 70 50 67 2d 3e 66 72 65 65 2c 20  ru, &pPg->free, 
6b30: 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51 4c  pPg);.#ifdef SQL
6b40: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
6b50: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69  Y_MANAGEMENT.  i
6b60: 66 28 20 21 70 50 67 2d 3e 70 50 61 67 65 72 2d  f( !pPg->pPager-
6b70: 3e 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 71  >memDb ){.    sq
6b80: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65  lite3_mutex_ente
6b90: 72 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  r(sqlite3_mutex_
6ba0: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6bb0: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6bc0: 0a 20 20 20 20 6c 69 73 74 52 65 6d 6f 76 65 28  .    listRemove(
6bd0: 26 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c  &sqlite3LruPageL
6be0: 69 73 74 2c 20 26 70 50 67 2d 3e 67 66 72 65 65  ist, &pPg->gfree
6bf0: 2c 20 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69  , pPg);.    sqli
6c00: 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28  te3_mutex_leave(
6c10: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
6c20: 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
6c30: 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
6c40: 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 20   }.#endif.}../* 
6c50: 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f  .** This functio
6c60: 6e 20 69 73 20 63 61 6c 6c 65 64 20 6a 75 73 74  n is called just
6c70: 20 61 66 74 65 72 20 74 68 65 20 6e 65 65 64 53   after the needS
6c80: 79 6e 63 20 66 6c 61 67 20 68 61 73 20 62 65 65  ync flag has bee
6c90: 6e 20 63 6c 65 61 72 65 64 0a 2a 2a 20 66 72 6f  n cleared.** fro
6ca0: 6d 20 61 6c 6c 20 70 61 67 65 73 20 6d 61 6e 61  m all pages mana
6cb0: 67 65 64 20 62 79 20 70 50 61 67 65 72 20 28 75  ged by pPager (u
6cc0: 73 75 61 6c 6c 79 20 62 65 63 61 75 73 65 20 74  sually because t
6cd0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
6ce0: 2a 2a 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e  ** has just been
6cf0: 20 73 79 6e 63 65 64 29 2e 20 49 74 20 75 70 64   synced). It upd
6d00: 61 74 65 73 20 74 68 65 20 70 50 61 67 65 72 2d  ates the pPager-
6d10: 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65  >lru.pFirstSynce
6d20: 64 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 61 6e  d variable.** an
6d30: 64 2c 20 69 66 20 6d 65 6d 6f 72 79 2d 6d 61 6e  d, if memory-man
6d40: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6d50: 65 64 2c 20 74 68 65 20 73 71 6c 69 74 65 33 4c  ed, the sqlite3L
6d60: 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
6d70: 74 53 79 6e 63 65 64 0a 2a 2a 20 76 61 72 69 61  tSynced.** varia
6d80: 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f 0a 73 74 61  ble also..*/.sta
6d90: 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69 73 74  tic void lruList
6da0: 53 65 74 46 69 72 73 74 53 79 6e 63 65 64 28 50  SetFirstSynced(P
6db0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
6dc0: 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69   pPager->lru.pFi
6dd0: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 61 67  rstSynced = pPag
6de0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b 0a  er->lru.pFirst;.
6df0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
6e00: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
6e10: 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21 70 50  GEMENT.  if( !pP
6e20: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20  ager->memDb ){. 
6e30: 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
6e40: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
6e50: 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75 74  nter(sqlite3_mut
6e60: 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f  ex_alloc(SQLITE_
6e70: 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55  MUTEX_STATIC_LRU
6e80: 29 29 3b 0a 20 20 20 20 66 6f 72 28 70 3d 73 71  ));.    for(p=sq
6e90: 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74  lite3LruPageList
6ea0: 2e 70 46 69 72 73 74 3b 20 70 20 26 26 20 70 2d  .pFirst; p && p-
6eb0: 3e 6e 65 65 64 53 79 6e 63 3b 20 70 3d 70 2d 3e  >needSync; p=p->
6ec0: 67 66 72 65 65 2e 70 4e 65 78 74 29 3b 0a 20 20  gfree.pNext);.  
6ed0: 20 20 61 73 73 65 72 74 28 70 3d 3d 70 50 61 67    assert(p==pPag
6ee0: 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
6ef0: 6e 63 65 64 20 7c 7c 20 70 3d 3d 73 71 6c 69 74  nced || p==sqlit
6f00: 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46  e3LruPageList.pF
6f10: 69 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 20  irstSynced);.   
6f20: 20 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c   sqlite3LruPageL
6f30: 69 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64  ist.pFirstSynced
6f40: 20 3d 20 70 3b 0a 20 20 20 20 73 71 6c 69 74 65   = p;.    sqlite
6f50: 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71  3_mutex_leave(sq
6f60: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6f70: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6f80: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 7d  TATIC_LRU));.  }
6f90: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
6fa0: 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   Return true if 
6fb0: 70 61 67 65 20 2a 70 50 67 20 68 61 73 20 61 6c  page *pPg has al
6fc0: 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
6fd0: 65 6e 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  en to the statem
6fe0: 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ent.** journal (
6ff0: 6f 72 20 73 74 61 74 65 6d 65 6e 74 20 73 6e 61  or statement sna
7000: 70 73 68 6f 74 20 68 61 73 20 62 65 65 6e 20 63  pshot has been c
7010: 72 65 61 74 65 64 2c 20 69 66 20 2a 70 50 67 20  reated, if *pPg 
7020: 69 73 20 70 61 72 74 0a 2a 2a 20 6f 66 20 61 6e  is part.** of an
7030: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
7040: 61 73 65 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ase)..*/.static 
7050: 69 6e 74 20 70 61 67 65 49 6e 53 74 61 74 65 6d  int pageInStatem
7060: 65 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ent(PgHdr *pPg){
7070: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
7080: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
7090: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
70a0: 20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f     return PGHDR_
70b0: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
70c0: 67 65 72 29 2d 3e 69 6e 53 74 6d 74 3b 0a 20 20  ger)->inStmt;.  
70d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 50 67 6e 6f 20  }else{.    Pgno 
70e0: 70 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f  pgno = pPg->pgno
70f0: 3b 0a 20 20 20 20 75 38 20 2a 61 20 3d 20 70 50  ;.    u8 *a = pP
7100: 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 3b 0a 20  ager->aInStmt;. 
7110: 20 20 20 72 65 74 75 72 6e 20 28 61 20 26 26 20     return (a && 
7120: 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
7130: 72 2d 3e 73 74 6d 74 53 69 7a 65 20 26 26 20 28  r->stmtSize && (
7140: 61 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  a[pgno/8] & (1<<
7150: 28 70 67 6e 6f 26 37 29 29 29 29 3b 0a 20 20 7d  (pgno&7))));.  }
7160: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65  .}../*.** Change
7170: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7180: 20 70 61 67 65 72 20 68 61 73 68 20 74 61 62 6c   pager hash tabl
7190: 65 20 74 6f 20 4e 2e 20 20 4e 20 6d 75 73 74 20  e to N.  N must 
71a0: 62 65 20 61 20 70 6f 77 65 72 0a 2a 2a 20 6f 66  be a power.** of
71b0: 20 74 77 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   two..*/.static 
71c0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 73 69 7a  void pager_resiz
71d0: 65 5f 68 61 73 68 5f 74 61 62 6c 65 28 50 61 67  e_hash_table(Pag
71e0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
71f0: 4e 29 7b 0a 20 20 50 67 48 64 72 20 2a 2a 61 48  N){.  PgHdr **aH
7200: 61 73 68 2c 20 2a 70 50 67 3b 0a 20 20 61 73 73  ash, *pPg;.  ass
7210: 65 72 74 28 20 4e 3e 30 20 26 26 20 28 4e 26 28  ert( N>0 && (N&(
7220: 4e 2d 31 29 29 3d 3d 30 20 29 3b 0a 20 20 70 61  N-1))==0 );.  pa
7230: 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
7240: 3b 0a 20 20 73 71 6c 69 74 65 33 46 61 75 6c 74  ;.  sqlite3Fault
7250: 42 65 6e 69 67 6e 28 53 51 4c 49 54 45 5f 46 41  Benign(SQLITE_FA
7260: 55 4c 54 49 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c  ULTINJECTOR_MALL
7270: 4f 43 2c 20 70 50 61 67 65 72 2d 3e 61 48 61 73  OC, pPager->aHas
7280: 68 21 3d 30 29 3b 0a 20 20 61 48 61 73 68 20 3d  h!=0);.  aHash =
7290: 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65   sqlite3MallocZe
72a0: 72 6f 28 20 73 69 7a 65 6f 66 28 61 48 61 73 68  ro( sizeof(aHash
72b0: 5b 30 5d 29 2a 4e 20 29 3b 0a 20 20 73 71 6c 69  [0])*N );.  sqli
72c0: 74 65 33 46 61 75 6c 74 42 65 6e 69 67 6e 28 53  te3FaultBenign(S
72d0: 51 4c 49 54 45 5f 46 41 55 4c 54 49 4e 4a 45 43  QLITE_FAULTINJEC
72e0: 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20 30 29 3b 0a  TOR_MALLOC, 0);.
72f0: 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
7300: 67 65 72 29 3b 0a 20 20 69 66 28 20 61 48 61 73  ger);.  if( aHas
7310: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46  h==0 ){.    /* F
7320: 61 69 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68  ailure to rehash
7330: 20 69 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72   is not an error
7340: 2e 20 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20  .  It is only a 
7350: 70 65 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e  performance hit.
7360: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
7370: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
7380: 65 65 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  ee(pPager->aHash
7390: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 48 61  );.  pPager->nHa
73a0: 73 68 20 3d 20 4e 3b 0a 20 20 70 50 61 67 65 72  sh = N;.  pPager
73b0: 2d 3e 61 48 61 73 68 20 3d 20 61 48 61 73 68 3b  ->aHash = aHash;
73c0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
73d0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
73e0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
73f0: 7b 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  {.    int h;.   
7400: 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d   if( pPg->pgno==
7410: 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  0 ){.      asser
7420: 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  t( pPg->pNextHas
7430: 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 50 72  h==0 && pPg->pPr
7440: 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
7450: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7460: 20 7d 0a 20 20 20 20 68 20 3d 20 70 50 67 2d 3e   }.    h = pPg->
7470: 70 67 6e 6f 20 26 20 28 4e 2d 31 29 3b 0a 20 20  pgno & (N-1);.  
7480: 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
7490: 20 3d 20 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20   = aHash[h];.   
74a0: 20 69 66 28 20 61 48 61 73 68 5b 68 5d 20 29 7b   if( aHash[h] ){
74b0: 0a 20 20 20 20 20 20 61 48 61 73 68 5b 68 5d 2d  .      aHash[h]-
74c0: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
74d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 48 61 73  ;.    }.    aHas
74e0: 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
74f0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
7500: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
7510: 20 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69   Read a 32-bit i
7520: 6e 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20  nteger from the 
7530: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7540: 69 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68  iptor.  Store th
7550: 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61  e integer.** tha
7560: 74 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52  t is read in *pR
7570: 65 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  es.  Return SQLI
7580: 54 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68  TE_OK if everyth
7590: 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61  ing worked, or a
75a0: 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20  n.** error code 
75b0: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65  is something goe
75c0: 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  s wrong..**.** A
75d0: 6c 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74  ll values are st
75e0: 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20  ored on disk as 
75f0: 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73  big-endian..*/.s
7600: 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32  tatic int read32
7610: 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66 69 6c  bits(sqlite3_fil
7620: 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66 73 65  e *fd, i64 offse
7630: 74 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a 20  t, u32 *pRes){. 
7640: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
7650: 63 5b 34 5d 3b 0a 20 20 69 6e 74 20 72 63 20 3d  c[4];.  int rc =
7660: 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66   sqlite3OsRead(f
7670: 64 2c 20 61 63 2c 20 73 69 7a 65 6f 66 28 61 63  d, ac, sizeof(ac
7680: 29 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 69 66  ), offset);.  if
7690: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
76a0: 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d 20 73  ){.    *pRes = s
76b0: 71 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 61  qlite3Get4byte(a
76c0: 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  c);.  }.  return
76d0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
76e0: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
76f0: 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74 72 69  eger into a stri
7700: 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62 69 67  ng buffer in big
7710: 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f 72 64  -endian byte ord
7720: 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 70  er..*/.#define p
7730: 75 74 33 32 62 69 74 73 28 41 2c 42 29 20 20 73  ut32bits(A,B)  s
7740: 71 6c 69 74 65 33 50 75 74 34 62 79 74 65 28 28  qlite3Put4byte((
7750: 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20  u8*)A,B)../*.** 
7760: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
7770: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
7780: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
7790: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
77a0: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
77b0: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
77c0: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
77d0: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
77e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
77f0: 72 69 74 65 33 32 62 69 74 73 28 73 71 6c 69 74  rite32bits(sqlit
7800: 65 33 5f 66 69 6c 65 20 2a 66 64 2c 20 69 36 34  e3_file *fd, i64
7810: 20 6f 66 66 73 65 74 2c 20 75 33 32 20 76 61 6c   offset, u32 val
7820: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
7830: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
7840: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
7850: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
7860: 64 2c 20 61 63 2c 20 34 2c 20 6f 66 66 73 65 74  d, ac, 4, offset
7870: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66  );.}../*.** If f
7880: 69 6c 65 20 70 46 64 20 69 73 20 6f 70 65 6e 2c  ile pFd is open,
7890: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 4f 73 55   call sqlite3OsU
78a0: 6e 6c 6f 63 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a  nlock() on it..*
78b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 73 55  /.static int osU
78c0: 6e 6c 6f 63 6b 28 73 71 6c 69 74 65 33 5f 66 69  nlock(sqlite3_fi
78d0: 6c 65 20 2a 70 46 64 2c 20 69 6e 74 20 65 4c 6f  le *pFd, int eLo
78e0: 63 6b 29 7b 0a 20 20 69 66 28 20 21 70 46 64 2d  ck){.  if( !pFd-
78f0: 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
7900: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
7910: 4b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  K;.  }.  return 
7920: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
7930: 70 46 64 2c 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a  pFd, eLock);.}..
7940: 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
7950: 69 6f 6e 20 64 65 74 65 72 6d 69 6e 65 73 20 77  ion determines w
7960: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
7970: 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f  e atomic-write o
7980: 70 74 69 6d 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63  ptimization.** c
7990: 61 6e 20 62 65 20 75 73 65 64 20 77 69 74 68 20  an be used with 
79a0: 74 68 69 73 20 70 61 67 65 72 2e 20 54 68 65 20  this pager. The 
79b0: 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e  optimization can
79c0: 20 62 65 20 75 73 65 64 20 69 66 3a 0a 2a 2a 0a   be used if:.**.
79d0: 2a 2a 20 20 28 61 29 20 74 68 65 20 76 61 6c 75  **  (a) the valu
79e0: 65 20 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73  e returned by Os
79f0: 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
7a00: 73 74 69 63 73 28 29 20 69 6e 64 69 63 61 74 65  stics() indicate
7a10: 73 20 74 68 61 74 0a 2a 2a 20 20 20 20 20 20 61  s that.**      a
7a20: 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20 6d   database page m
7a30: 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 61 74  ay be written at
7a40: 6f 6d 69 63 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a  omically, and.**
7a50: 20 20 28 62 29 20 74 68 65 20 76 61 6c 75 65 20    (b) the value 
7a60: 72 65 74 75 72 6e 65 64 20 62 79 20 4f 73 53 65  returned by OsSe
7a70: 63 74 6f 72 53 69 7a 65 28 29 20 69 73 20 6c 65  ctorSize() is le
7a80: 73 73 20 74 68 61 6e 20 6f 72 20 65 71 75 61 6c  ss than or equal
7a90: 0a 2a 2a 20 20 20 20 20 20 74 6f 20 74 68 65 20  .**      to the 
7aa0: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
7ab0: 20 49 66 20 74 68 65 20 6f 70 74 69 6d 69 7a 61   If the optimiza
7ac0: 74 69 6f 6e 20 63 61 6e 6e 6f 74 20 62 65 20 75  tion cannot be u
7ad0: 73 65 64 2c 20 30 20 69 73 20 72 65 74 75 72 6e  sed, 0 is return
7ae0: 65 64 2e 20 49 66 20 69 74 20 63 61 6e 20 62 65  ed. If it can be
7af0: 20 75 73 65 64 2c 0a 2a 2a 20 74 68 65 6e 20 74   used,.** then t
7b00: 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
7b10: 64 20 69 73 20 74 68 65 20 73 69 7a 65 20 6f 66  d is the size of
7b20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
7b30: 65 20 77 68 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e  e when it.** con
7b40: 74 61 69 6e 73 20 72 6f 6c 6c 62 61 63 6b 20 64  tains rollback d
7b50: 61 74 61 20 66 6f 72 20 65 78 61 63 74 6c 79 20  ata for exactly 
7b60: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2f 0a 23 69 66  one page..*/.#if
7b70: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7b80: 45 5f 41 54 4f 4d 49 43 5f 57 52 49 54 45 0a 73  E_ATOMIC_WRITE.s
7b90: 74 61 74 69 63 20 69 6e 74 20 6a 72 6e 6c 42 75  tatic int jrnlBu
7ba0: 66 66 65 72 53 69 7a 65 28 50 61 67 65 72 20 2a  fferSize(Pager *
7bb0: 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 64  pPager){.  int d
7bc0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  c;           /* 
7bd0: 44 65 76 69 63 65 20 63 68 61 72 61 63 74 65 72  Device character
7be0: 69 73 74 69 63 73 20 2a 2f 0a 20 20 69 6e 74 20  istics */.  int 
7bf0: 6e 53 65 63 74 6f 72 3b 20 20 20 20 20 20 2f 2a  nSector;      /*
7c00: 20 53 65 63 74 6f 72 20 73 69 7a 65 20 2a 2f 0a   Sector size */.
7c10: 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
7c20: 20 20 20 20 2f 2a 20 50 61 67 65 20 73 69 7a 65      /* Page size
7c30: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 69   */.  sqlite3_fi
7c40: 6c 65 20 2a 66 64 20 3d 20 70 50 61 67 65 72 2d  le *fd = pPager-
7c50: 3e 66 64 3b 0a 0a 20 20 69 66 28 20 66 64 2d 3e  >fd;..  if( fd->
7c60: 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
7c70: 64 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65  dc = sqlite3OsDe
7c80: 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74  viceCharacterist
7c90: 69 63 73 28 66 64 29 3b 0a 20 20 20 20 6e 53 65  ics(fd);.    nSe
7ca0: 63 74 6f 72 20 3d 20 73 71 6c 69 74 65 33 4f 73  ctor = sqlite3Os
7cb0: 53 65 63 74 6f 72 53 69 7a 65 28 66 64 29 3b 0a  SectorSize(fd);.
7cc0: 20 20 20 20 6e 50 61 67 65 20 3d 20 70 50 61 67      nPage = pPag
7cd0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
7ce0: 7d 0a 0a 20 20 61 73 73 65 72 74 28 53 51 4c 49  }..  assert(SQLI
7cf0: 54 45 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 35  TE_IOCAP_ATOMIC5
7d00: 31 32 3d 3d 28 35 31 32 3e 3e 38 29 29 3b 0a 20  12==(512>>8));. 
7d10: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7d20: 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d  OCAP_ATOMIC64K==
7d30: 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 0a 20 20  (65536>>8));..  
7d40: 69 66 28 20 21 66 64 2d 3e 70 4d 65 74 68 6f 64  if( !fd->pMethod
7d50: 73 20 7c 7c 20 28 64 63 26 28 53 51 4c 49 54 45  s || (dc&(SQLITE
7d60: 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 7c 28 6e  _IOCAP_ATOMIC|(n
7d70: 50 61 67 65 3e 3e 38 29 29 26 26 6e 53 65 63 74  Page>>8))&&nSect
7d80: 6f 72 3c 3d 6e 50 61 67 65 29 20 29 7b 0a 20 20  or<=nPage) ){.  
7d90: 20 20 72 65 74 75 72 6e 20 4a 4f 55 52 4e 41 4c    return JOURNAL
7da0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
7db0: 2b 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53 5a 28  + JOURNAL_PG_SZ(
7dc0: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
7dd0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
7de0: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  f../*.** This fu
7df0: 6e 63 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65  nction should be
7e00: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 61 6e 20   called when an 
7e10: 65 72 72 6f 72 20 6f 63 63 75 72 73 20 77 69 74  error occurs wit
7e20: 68 69 6e 20 74 68 65 20 70 61 67 65 72 0a 2a 2a  hin the pager.**
7e30: 20 63 6f 64 65 2e 20 54 68 65 20 66 69 72 73 74   code. The first
7e40: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 61 20 70   argument is a p
7e50: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
7e60: 67 65 72 20 73 74 72 75 63 74 75 72 65 2c 20 74  ger structure, t
7e70: 68 65 0a 2a 2a 20 73 65 63 6f 6e 64 20 74 68 65  he.** second the
7e80: 20 65 72 72 6f 72 2d 63 6f 64 65 20 61 62 6f 75   error-code abou
7e90: 74 20 74 6f 20 62 65 20 72 65 74 75 72 6e 65 64  t to be returned
7ea0: 20 62 79 20 61 20 70 61 67 65 72 20 41 50 49 20   by a pager API 
7eb0: 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68  function. .** Th
7ec0: 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64  e value returned
7ed0: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
7ee0: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7ef0: 74 20 74 6f 20 74 68 69 73 20 66 75 6e 63 74 69  t to this functi
7f00: 6f 6e 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  on. .**.** If th
7f10: 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e  e second argumen
7f20: 74 20 69 73 20 53 51 4c 49 54 45 5f 49 4f 45 52  t is SQLITE_IOER
7f30: 52 2c 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  R, SQLITE_CORRUP
7f40: 54 2c 20 6f 72 20 53 51 4c 49 54 45 5f 46 55 4c  T, or SQLITE_FUL
7f50: 4c 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 20 62  L.** the error b
7f60: 65 63 6f 6d 65 73 20 70 65 72 73 69 73 74 65 6e  ecomes persisten
7f70: 74 2e 20 55 6e 74 69 6c 20 74 68 65 20 70 65 72  t. Until the per
7f80: 73 69 73 74 65 6e 20 65 72 72 6f 72 20 69 73 20  sisten error is 
7f90: 63 6c 65 61 72 65 64 2c 0a 2a 2a 20 73 75 62 73  cleared,.** subs
7fa0: 65 71 75 65 6e 74 20 41 50 49 20 63 61 6c 6c 73  equent API calls
7fb0: 20 6f 6e 20 74 68 69 73 20 50 61 67 65 72 20 77   on this Pager w
7fc0: 69 6c 6c 20 69 6d 6d 65 64 69 61 74 65 6c 79 20  ill immediately 
7fd0: 72 65 74 75 72 6e 20 74 68 65 20 73 61 6d 65 20  return the same 
7fe0: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 2e 0a  .** error code..
7ff0: 2a 2a 0a 2a 2a 20 41 20 70 65 72 73 69 73 74 65  **.** A persiste
8000: 6e 74 20 65 72 72 6f 72 20 69 6e 64 69 63 61 74  nt error indicat
8010: 65 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  es that the cont
8020: 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67 65  ents of the page
8030: 72 2d 63 61 63 68 65 20 0a 2a 2a 20 63 61 6e 6e  r-cache .** cann
8040: 6f 74 20 62 65 20 74 72 75 73 74 65 64 2e 20 54  ot be trusted. T
8050: 68 69 73 20 73 74 61 74 65 20 63 61 6e 20 62 65  his state can be
8060: 20 63 6c 65 61 72 65 64 20 62 79 20 63 6f 6d 70   cleared by comp
8070: 6c 65 74 65 6c 79 20 64 69 73 63 61 72 64 69 6e  letely discardin
8080: 67 20 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e  g .** the conten
8090: 74 73 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d  ts of the pager-
80a0: 63 61 63 68 65 2e 20 49 66 20 61 20 74 72 61 6e  cache. If a tran
80b0: 73 61 63 74 69 6f 6e 20 77 61 73 20 61 63 74 69  saction was acti
80c0: 76 65 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 70  ve when.** the p
80d0: 65 72 73 69 73 74 65 6e 74 20 65 72 72 6f 72 20  ersistent error 
80e0: 6f 63 63 75 72 65 64 2c 20 74 68 65 6e 20 74 68  occured, then th
80f0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
8100: 61 6c 20 6d 61 79 20 6e 65 65 64 0a 2a 2a 20 74  al may need.** t
8110: 6f 20 62 65 20 72 65 70 6c 61 79 65 64 2e 0a 2a  o be replayed..*
8120: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8130: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8140: 20 2a 70 50 61 67 65 72 29 3b 0a 73 74 61 74 69   *pPager);.stati
8150: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 6f  c int pager_erro
8160: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
8170: 20 69 6e 74 20 72 63 29 7b 0a 20 20 69 6e 74 20   int rc){.  int 
8180: 72 63 32 20 3d 20 72 63 20 26 20 30 78 66 66 3b  rc2 = rc & 0xff;
8190: 0a 20 20 61 73 73 65 72 74 28 0a 20 20 20 20 20  .  assert(.     
81a0: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
81b0: 65 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  e==SQLITE_FULL |
81c0: 7c 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  |.       pPager-
81d0: 3e 65 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45  >errCode==SQLITE
81e0: 5f 4f 4b 20 7c 7c 0a 20 20 20 20 20 20 20 28 70  _OK ||.       (p
81f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
8200: 20 30 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49   0xff)==SQLITE_I
8210: 4f 45 52 52 0a 20 20 29 3b 0a 20 20 69 66 28 0a  OERR.  );.  if(.
8220: 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f      rc2==SQLITE_
8230: 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 72 63 32 3d  FULL ||.    rc2=
8240: 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
8250: 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54 45  .    rc2==SQLITE
8260: 5f 43 4f 52 52 55 50 54 0a 20 20 29 7b 0a 20 20  _CORRUPT.  ){.  
8270: 20 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64    pPager->errCod
8280: 65 20 3d 20 72 63 3b 0a 20 20 20 20 69 66 28 20  e = rc;.    if( 
8290: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
82a0: 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 26 26 20 70  AGER_UNLOCK && p
82b0: 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29  Pager->nRef==0 )
82c0: 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
82d0: 65 20 70 61 67 65 72 20 69 73 20 61 6c 72 65 61  e pager is alrea
82e0: 64 79 20 75 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c  dy unlocked, cal
82f0: 6c 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 29  l pager_unlock()
8300: 20 6e 6f 77 20 74 6f 0a 20 20 20 20 20 20 2a 2a   now to.      **
8310: 20 63 6c 65 61 72 20 74 68 65 20 65 72 72 6f 72   clear the error
8320: 20 73 74 61 74 65 20 61 6e 64 20 65 6e 73 75 72   state and ensur
8330: 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  e that the pager
8340: 2d 63 61 63 68 65 20 69 73 20 0a 20 20 20 20 20  -cache is .     
8350: 20 2a 2a 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65   ** completely e
8360: 6d 70 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  mpty..      */. 
8370: 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
8380: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  k(pPager);.    }
8390: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
83a0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51  ;.}../*.** If SQ
83b0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
83c0: 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65 6e   is defined then
83d0: 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e 69   we do some sani
83e0: 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f  ty checking.** o
83f0: 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69 6e  n the cache usin
8400: 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69 6f  g a hash functio
8410: 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65 64  n.  This is used
8420: 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a 20   for testing.** 
8430: 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f 6e  and debugging on
8440: 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ly..*/.#ifdef SQ
8450: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8460: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
8470: 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20 74  32-bit hash of t
8480: 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f 72  he page data for
8490: 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74 69   pPage..*/.stati
84a0: 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74 61  c u32 pager_data
84b0: 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c 20  hash(int nByte, 
84c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
84d0: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61 73  Data){.  u32 has
84e0: 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a  h = 0;.  int i;.
84f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42 79    for(i=0; i<nBy
8500: 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68 61  te; i++){.    ha
8510: 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39 29  sh = (hash*1039)
8520: 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d   + pData[i];.  }
8530: 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a  .  return hash;.
8540: 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  }.static u32 pag
8550: 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48 64  er_pagehash(PgHd
8560: 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65 74  r *pPage){.  ret
8570: 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68 61  urn pager_dataha
8580: 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65 72  sh(pPage->pPager
8590: 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20 20  ->pageSize, .   
85a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85b0: 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20 63       (unsigned c
85c0: 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f 44  har *)PGHDR_TO_D
85d0: 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a 0a  ATA(pPage));.}..
85e0: 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f  /*.** The CHECK_
85f0: 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73  PAGE macro takes
8600: 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20   a PgHdr* as an 
8610: 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c  argument. If SQL
8620: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
8630: 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61  ** is defined, a
8640: 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74  nd NDEBUG is not
8650: 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73   defined, an ass
8660: 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20  ert() statement 
8670: 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74  checks.** that t
8680: 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65  he page is eithe
8690: 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c  r dirty or still
86a0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c   matches the cal
86b0: 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73  culated page-has
86c0: 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48  h..*/.#define CH
86d0: 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63  ECK_PAGE(x) chec
86e0: 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20  kPage(x).static 
86f0: 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50  void checkPage(P
8700: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
8710: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
8720: 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73  g->pPager;.  ass
8730: 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48  ert( !pPg->pageH
8740: 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  ash || pPager->e
8750: 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42 20  rrCode || MEMDB 
8760: 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c  || pPg->dirty ||
8770: 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67   .      pPg->pag
8780: 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67  eHash==pager_pag
8790: 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a  ehash(pPg) );.}.
87a0: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 70  .#else.#define p
87b0: 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58 2c  ager_datahash(X,
87c0: 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70 61  Y)  0.#define pa
87d0: 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29 20  ger_pagehash(X) 
87e0: 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b   0.#define CHECK
87f0: 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66 0a  _PAGE(x).#endif.
8800: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  ./*.** When this
8810: 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20 6a   is called the j
8820: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
8830: 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75 73  pager pPager mus
8840: 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68  t be open..** Th
8850: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
8860: 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72 65   file name is re
8870: 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64 20  ad from the end 
8880: 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20  of the file and 
8890: 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74 6f  .** written into
88a0: 20 6d 65 6d 6f 72 79 20 73 75 70 70 6c 69 65 64   memory supplied
88b0: 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 2e 20   by the caller. 
88c0: 0a 2a 2a 0a 2a 2a 20 7a 4d 61 73 74 65 72 20 6d  .**.** zMaster m
88d0: 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20 62  ust point to a b
88e0: 75 66 66 65 72 20 6f 66 20 61 74 20 6c 65 61 73  uffer of at leas
88f0: 74 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73 20  t nMaster bytes 
8900: 61 6c 6c 6f 63 61 74 65 64 20 62 79 0a 2a 2a 20  allocated by.** 
8910: 74 68 65 20 63 61 6c 6c 65 72 2e 20 54 68 69 73  the caller. This
8920: 20 73 68 6f 75 6c 64 20 62 65 20 73 71 6c 69 74   should be sqlit
8930: 65 33 5f 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d  e3_vfs.mxPathnam
8940: 65 2b 31 20 28 74 6f 20 65 6e 73 75 72 65 20 74  e+1 (to ensure t
8950: 68 65 72 65 20 69 73 0a 2a 2a 20 65 6e 6f 75 67  here is.** enoug
8960: 68 20 73 70 61 63 65 20 74 6f 20 77 72 69 74 65  h space to write
8970: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8980: 6e 61 6c 20 6e 61 6d 65 29 2e 20 49 66 20 74 68  nal name). If th
8990: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
89a0: 0a 2a 2a 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  .** name in the 
89b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 6f 6e 67 65  journal is longe
89c0: 72 20 74 68 61 6e 20 6e 4d 61 73 74 65 72 20 62  r than nMaster b
89d0: 79 74 65 73 20 28 69 6e 63 6c 75 64 69 6e 67 20  ytes (including 
89e0: 61 0a 2a 2a 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  a.** nul-termina
89f0: 74 6f 72 29 2c 20 74 68 65 6e 20 74 68 69 73 20  tor), then this 
8a00: 69 73 20 68 61 6e 64 6c 65 64 20 61 73 20 69 66  is handled as if
8a10: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8a20: 61 6c 20 6e 61 6d 65 0a 2a 2a 20 77 65 72 65 20  al name.** were 
8a30: 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 6a  present in the j
8a40: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66  ournal..**.** If
8a50: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
8a60: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
8a70: 70 72 65 73 65 6e 74 20 7a 4d 61 73 74 65 72 5b  present zMaster[
8a80: 30 5d 20 69 73 20 73 65 74 20 74 6f 20 30 20 61  0] is set to 0 a
8a90: 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  nd.** SQLITE_OK 
8aa0: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74  tic int readMast
8ac0: 65 72 4a 6f 75 72 6e 61 6c 28 73 71 6c 69 74 65  erJournal(sqlite
8ad0: 33 5f 66 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  3_file *pJrnl, c
8ae0: 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 69 6e  har *zMaster, in
8af0: 74 20 6e 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  t nMaster){.  in
8b00: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
8b10: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
8b20: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
8b30: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
8b40: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
8b50: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
8b60: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
8b70: 72 20 2a 2f 0a 0a 20 20 7a 4d 61 73 74 65 72 5b  r */..  zMaster[
8b80: 30 5d 20 3d 20 27 5c 30 27 3b 0a 0a 20 20 72 63  0] = '\0';..  rc
8b90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8ba0: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
8bb0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8bc0: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
8bd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
8be0: 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73   rc = read32bits
8bf0: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20  (pJrnl, szJ-16, 
8c00: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
8c10: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8c20: 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6c  urn rc;..  if( l
8c30: 65 6e 3e 3d 6e 4d 61 73 74 65 72 20 29 7b 0a 20  en>=nMaster ){. 
8c40: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8c50: 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  _OK;.  }..  rc =
8c60: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
8c70: 6c 2c 20 73 7a 4a 2d 31 32 2c 20 26 63 6b 73 75  l, szJ-12, &cksu
8c80: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
8c90: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
8ca0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
8cb0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
8cc0: 2c 20 61 4d 61 67 69 63 2c 20 38 2c 20 73 7a 4a  , aMagic, 8, szJ
8cd0: 2d 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  -8);.  if( rc!=S
8ce0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
8cf0: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
8d00: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
8d10: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8d20: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8d30: 70 4a 72 6e 6c 2c 20 7a 4d 61 73 74 65 72 2c 20  pJrnl, zMaster, 
8d40: 6c 65 6e 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29  len, szJ-16-len)
8d50: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8d60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
8d70: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d  urn rc;.  }.  zM
8d80: 61 73 74 65 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30  aster[len] = '\0
8d90: 27 3b 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20  ';..  /* See if 
8da0: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
8db0: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
8dc0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
8dd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
8de0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
8df0: 6d 20 2d 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m -= zMaster[i];
8e00: 0a 20 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  .   }.  if( cksu
8e10: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
8e20: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
8e30: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
8e40: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
8e50: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
8e60: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
8e70: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
8e80: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
8e90: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
8ea0: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
8eb0: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
8ec0: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
8ed0: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
8ee0: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
8ef0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
8f00: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
8f10: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
8f20: 74 65 72 5b 30 5d 20 3d 20 27 5c 30 27 3b 0a 20  ter[0] = '\0';. 
8f30: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
8f40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
8f50: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
8f60: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
8f70: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
8f80: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
8f90: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
8fa0: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
8fb0: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
8fc0: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
8fd0: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
8fe0: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
8ff0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
9000: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
9010: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
9020: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
9030: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
9040: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
9050: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
9060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
9070: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
90a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90b0: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
90c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90d0: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
90e0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
90f0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
9100: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
9110: 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61  eekJournalHdr(Pa
9120: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9130: 69 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a  i64 offset = 0;.
9140: 20 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72    i64 c = pPager
9150: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20  ->journalOff;.  
9160: 69 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66  if( c ){.    off
9170: 73 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55  set = ((c-1)/JOU
9180: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9190: 65 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e  er) + 1) * JOURN
91a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
91b0: 29 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  );.  }.  assert(
91c0: 20 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f   offset%JOURNAL_
91d0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d  HDR_SZ(pPager)==
91e0: 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f  0 );.  assert( o
91f0: 66 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73  ffset>=c );.  as
9200: 73 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29  sert( (offset-c)
9210: 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  <JOURNAL_HDR_SZ(
9220: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61  pPager) );.  pPa
9230: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
9240: 3d 20 6f 66 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a  = offset;.}../*.
9250: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
9260: 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e  ile must be open
9270: 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   when this routi
9280: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20  ne is called. A 
9290: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65  journal.** heade
92a0: 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  r (JOURNAL_HDR_S
92b0: 5a 20 62 79 74 65 73 29 20 69 73 20 77 72 69 74  Z bytes) is writ
92c0: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
92d0: 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65  rnal file at the
92e0: 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  .** current loca
92f0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tion..**.** The 
9300: 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a  format for the j
9310: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73  ournal header is
9320: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20   as follows:.** 
9330: 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63  - 8 bytes: Magic
9340: 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75   identifying jou
9350: 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20  rnal format..** 
9360: 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65  - 4 bytes: Numbe
9370: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20  r of records in 
9380: 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e  journal, or -1 n
9390: 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f  o-sync mode is o
93a0: 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  n..** - 4 bytes:
93b0: 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75   Random number u
93c0: 73 65 64 20 66 6f 72 20 70 61 67 65 20 68 61 73  sed for page has
93d0: 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  h..** - 4 bytes:
93e0: 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73   Initial databas
93f0: 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a  e page count..**
9400: 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65 63 74   - 4 bytes: Sect
9410: 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62 79 20  or size used by 
9420: 74 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74  the process that
9430: 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72   wrote this jour
9440: 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c  nal..** .** Foll
9450: 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c  owed by (JOURNAL
9460: 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79  _HDR_SZ - 24) by
9470: 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70  tes of unused sp
9480: 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ace..*/.static i
9490: 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48  nt writeJournalH
94a0: 64 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  dr(Pager *pPager
94b0: 29 7b 0a 20 20 63 68 61 72 20 7a 48 65 61 64 65  ){.  char zHeade
94c0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
94d0: 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a 20 20 69  lMagic)+16];.  i
94e0: 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50  nt rc;..  if( pP
94f0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
9500: 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ==0 ){.    pPage
9510: 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20  r->stmtHdrOff = 
9520: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9530: 66 66 3b 0a 20 20 7d 0a 0a 20 20 73 65 65 6b 4a  ff;.  }..  seekJ
9540: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
9550: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
9560: 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72  rnalHdr = pPager
9570: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20  ->journalOff;.. 
9580: 20 6d 65 6d 63 70 79 28 7a 48 65 61 64 65 72 2c   memcpy(zHeader,
9590: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
95a0: 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
95b0: 61 67 69 63 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20  agic));..  /* . 
95c0: 20 2a 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   ** Write the nR
95d0: 65 63 20 46 69 65 6c 64 20 2d 20 74 68 65 20 6e  ec Field - the n
95e0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72 65  umber of page re
95f0: 63 6f 72 64 73 20 74 68 61 74 20 66 6f 6c 6c 6f  cords that follo
9600: 77 20 74 68 69 73 0a 20 20 2a 2a 20 6a 6f 75 72  w this.  ** jour
9610: 6e 61 6c 20 68 65 61 64 65 72 2e 20 4e 6f 72 6d  nal header. Norm
9620: 61 6c 6c 79 2c 20 7a 65 72 6f 20 69 73 20 77 72  ally, zero is wr
9630: 69 74 74 65 6e 20 74 6f 20 74 68 69 73 20 76 61  itten to this va
9640: 6c 75 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  lue at this time
9650: 2e 0a 20 20 2a 2a 20 41 66 74 65 72 20 74 68 65  ..  ** After the
9660: 20 72 65 63 6f 72 64 73 20 61 72 65 20 61 64 64   records are add
9670: 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ed to the journa
9680: 6c 20 28 61 6e 64 20 74 68 65 20 6a 6f 75 72 6e  l (and the journ
9690: 61 6c 20 73 79 6e 63 65 64 2c 20 0a 20 20 2a 2a  al synced, .  **
96a0: 20 69 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   if in full-sync
96b0: 20 6d 6f 64 65 29 2c 20 74 68 65 20 7a 65 72 6f   mode), the zero
96c0: 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 20   is overwritten 
96d0: 77 69 74 68 20 74 68 65 20 74 72 75 65 20 6e 75  with the true nu
96e0: 6d 62 65 72 0a 20 20 2a 2a 20 6f 66 20 72 65 63  mber.  ** of rec
96f0: 6f 72 64 73 20 28 73 65 65 20 73 79 6e 63 4a 6f  ords (see syncJo
9700: 75 72 6e 61 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20  urnal())..  **. 
9710: 20 2a 2a 20 41 20 66 61 73 74 65 72 20 61 6c 74   ** A faster alt
9720: 65 72 6e 61 74 69 76 65 20 69 73 20 74 6f 20 77  ernative is to w
9730: 72 69 74 65 20 30 78 46 46 46 46 46 46 46 46 20  rite 0xFFFFFFFF 
9740: 74 6f 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  to the nRec fiel
9750: 64 2e 20 57 68 65 6e 0a 20 20 2a 2a 20 72 65 61  d. When.  ** rea
9760: 64 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ding the journal
9770: 20 74 68 69 73 20 76 61 6c 75 65 20 74 65 6c 6c   this value tell
9780: 73 20 53 51 4c 69 74 65 20 74 6f 20 61 73 73 75  s SQLite to assu
9790: 6d 65 20 74 68 61 74 20 74 68 65 0a 20 20 2a 2a  me that the.  **
97a0: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
97b0: 72 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69  rnal file contai
97c0: 6e 73 20 76 61 6c 69 64 20 70 61 67 65 20 72 65  ns valid page re
97d0: 63 6f 72 64 73 2e 20 54 68 69 73 20 61 73 73 75  cords. This assu
97e0: 6d 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73 20 64  mption.  ** is d
97f0: 61 6e 67 65 72 6f 75 73 2c 20 61 73 20 69 66 20  angerous, as if 
9800: 61 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 65  a failure occure
9810: 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e 67  d whilst writing
9820: 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   to the journal.
9830: 20 20 2a 2a 20 66 69 6c 65 20 69 74 20 6d 61 79    ** file it may
9840: 20 63 6f 6e 74 61 69 6e 20 73 6f 6d 65 20 67 61   contain some ga
9850: 72 62 61 67 65 20 64 61 74 61 2e 20 54 68 65 72  rbage data. Ther
9860: 65 20 61 72 65 20 74 77 6f 20 73 63 65 6e 61 72  e are two scenar
9870: 69 6f 73 0a 20 20 2a 2a 20 77 68 65 72 65 20 74  ios.  ** where t
9880: 68 69 73 20 72 69 73 6b 20 63 61 6e 20 62 65 20  his risk can be 
9890: 69 67 6e 6f 72 65 64 3a 0a 20 20 2a 2a 0a 20 20  ignored:.  **.  
98a0: 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20  **   * When the 
98b0: 70 61 67 65 72 20 69 73 20 69 6e 20 6e 6f 2d 73  pager is in no-s
98c0: 79 6e 63 20 6d 6f 64 65 2e 20 43 6f 72 72 75 70  ync mode. Corrup
98d0: 74 69 6f 6e 20 63 61 6e 20 66 6f 6c 6c 6f 77 20  tion can follow 
98e0: 61 0a 20 20 2a 2a 20 20 20 20 20 70 6f 77 65 72  a.  **     power
98f0: 20 66 61 69 6c 75 72 65 20 69 6e 20 74 68 69 73   failure in this
9900: 20 63 61 73 65 20 61 6e 79 77 61 79 2e 0a 20 20   case anyway..  
9910: 2a 2a 0a 20 20 2a 2a 20 20 20 2a 20 57 68 65 6e  **.  **   * When
9920: 20 74 68 65 20 53 51 4c 49 54 45 5f 49 4f 43 41   the SQLITE_IOCA
9930: 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 20 66 6c  P_SAFE_APPEND fl
9940: 61 67 20 69 73 20 73 65 74 2e 20 54 68 69 73 20  ag is set. This 
9950: 67 75 61 72 61 6e 74 65 65 73 0a 20 20 2a 2a 20  guarantees.  ** 
9960: 20 20 20 20 74 68 61 74 20 67 61 72 62 61 67 65      that garbage
9970: 20 64 61 74 61 20 69 73 20 6e 65 76 65 72 20 61   data is never a
9980: 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 6a  ppended to the j
9990: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 2a  ournal file..  *
99a0: 2f 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65  /.  assert(pPage
99b0: 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c  r->fd->pMethods|
99c0: 7c 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 29  |pPager->noSync)
99d0: 3b 0a 20 20 69 66 28 20 28 70 50 61 67 65 72 2d  ;.  if( (pPager-
99e0: 3e 6e 6f 53 79 6e 63 29 20 0a 20 20 20 7c 7c 20  >noSync) .   || 
99f0: 28 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65  (sqlite3OsDevice
9a00: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
9a10: 70 50 61 67 65 72 2d 3e 66 64 29 26 53 51 4c 49  pPager->fd)&SQLI
9a20: 54 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50  TE_IOCAP_SAFE_AP
9a30: 50 45 4e 44 29 20 0a 20 20 29 7b 0a 20 20 20 20  PEND) .  ){.    
9a40: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9a50: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9a60: 61 6c 4d 61 67 69 63 29 5d 2c 20 30 78 66 66 66  alMagic)], 0xfff
9a70: 66 66 66 66 66 29 3b 0a 20 20 7d 65 6c 73 65 7b  fffff);.  }else{
9a80: 0a 20 20 20 20 70 75 74 33 32 62 69 74 73 28 26  .    put32bits(&
9a90: 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28 61  zHeader[sizeof(a
9aa0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 5d 2c 20  JournalMagic)], 
9ab0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68  0);.  }..  /* Th
9ac0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
9ad0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
9ae0: 2a 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e  */ .  sqlite3Ran
9af0: 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70  domness(sizeof(p
9b00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
9b10: 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75  ), &pPager->cksu
9b20: 6d 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62  mInit);.  put32b
9b30: 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a  its(&zHeader[siz
9b40: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
9b50: 63 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63  c)+4], pPager->c
9b60: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20  ksumInit);.  /* 
9b70: 54 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61  The initial data
9b80: 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70  base size */.  p
9b90: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
9ba0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
9bb0: 6c 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67  lMagic)+8], pPag
9bc0: 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f  er->dbSize);.  /
9bd0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
9be0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
9bf0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
9c00: 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64  put32bits(&zHead
9c10: 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e  er[sizeof(aJourn
9c20: 61 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50  alMagic)+12], pP
9c30: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
9c40: 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a  );.  IOTRACE(("J
9c50: 48 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e  HDR %p %lld %d\n
9c60: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65  ", pPager, pPage
9c70: 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73  r->journalHdr, s
9c80: 69 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29  izeof(zHeader)))
9c90: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
9ca0: 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a  sWrite(pPager->j
9cb0: 66 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a  fd, zHeader, siz
9cc0: 65 6f 66 28 7a 48 65 61 64 65 72 29 2c 70 50 61  eof(zHeader),pPa
9cd0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
9ce0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
9cf0: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
9d00: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
9d10: 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72  ;..  /* The jour
9d20: 6e 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62  nal header has b
9d30: 65 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63  een written succ
9d40: 65 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74  essfully. Seek t
9d50: 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20  he journal.  ** 
9d60: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
9d70: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
9d80: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
9d90: 20 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20   sector..  */.  
9da0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
9db0: 4b 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45  K ){.    IOTRACE
9dc0: 28 28 22 4a 54 41 49 4c 20 25 70 20 25 6c 6c 64  (("JTAIL %p %lld
9dd0: 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 61  \n", pPager, pPa
9de0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
9df0: 31 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1)).    rc = sql
9e00: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
9e10: 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c  er->jfd, "\000",
9e20: 20 31 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   1, pPager->jour
9e30: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 7d 0a 20  nalOff-1);.  }. 
9e40: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
9e50: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
9e60: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
9e70: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
9e80: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
9e90: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
9ea0: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
9eb0: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
9ec0: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
9ed0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
9ee0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
9ef0: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
9f00: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
9f10: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
9f20: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
9f30: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
9f40: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
9f50: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
9f60: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
9f70: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
9f80: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
9f90: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
9fa0: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
9fb0: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
9fc0: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
9fd0: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
9fe0: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
9ff0: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
a000: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
a010: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
a020: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
a030: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
a040: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
a050: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a060: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
a070: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
a080: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
a090: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
a0a0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
a0b0: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
a0c0: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
a0d0: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
a0e0: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
a0f0: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
a100: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
a110: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
a120: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
a130: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
a140: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
a150: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
a160: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
a170: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
a180: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
a190: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
a1a0: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
a1b0: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
a1c0: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
a1d0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
a1e0: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
a1f0: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
a200: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
a210: 20 2a 2f 0a 20 20 69 36 34 20 6a 72 6e 6c 4f 66   */.  i64 jrnlOf
a220: 66 3b 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e 61  f;..  seekJourna
a230: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
a240: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
a250: 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48  nalOff+JOURNAL_H
a260: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20  DR_SZ(pPager) > 
a270: 6a 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20  journalSize ){. 
a280: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a290: 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e  _DONE;.  }.  jrn
a2a0: 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lOff = pPager->j
a2b0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 72 63  ournalOff;..  rc
a2c0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
a2d0: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  (pPager->jfd, aM
a2e0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
a2f0: 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a  gic), jrnlOff);.
a300: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
a310: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
a320: 2b 3d 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  += sizeof(aMagic
a330: 29 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70  );..  if( memcmp
a340: 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61  (aMagic, aJourna
a350: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
a360: 4d 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20  Magic))!=0 ){.  
a370: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
a380: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
a390: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 50 61  = read32bits(pPa
a3a0: 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66  ger->jfd, jrnlOf
a3b0: 66 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  f, pNRec);.  if(
a3c0: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
a3d0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
a3e0: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
a3f0: 20 6a 72 6e 6c 4f 66 66 2b 34 2c 20 26 70 50 61   jrnlOff+4, &pPa
a400: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
a410: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a420: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72  rn rc;..  rc = r
a430: 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72  ead32bits(pPager
a440: 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38  ->jfd, jrnlOff+8
a450: 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66  , pDbSize);.  if
a460: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a470: 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  ;..  /* Update t
a480: 68 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f  he assumed secto
a490: 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20  r-size to match 
a4a0: 74 68 65 20 76 61 6c 75 65 20 75 73 65 64 20 62  the value used b
a4b0: 79 20 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63  y .  ** the proc
a4c0: 65 73 73 20 74 68 61 74 20 63 72 65 61 74 65 64  ess that created
a4d0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49   this journal. I
a4e0: 66 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77  f this journal w
a4f0: 61 73 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20  as.  ** created 
a500: 62 79 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68  by a process oth
a510: 65 72 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65  er than this one
a520: 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
a530: 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e  ine.  ** is bein
a540: 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69  g called from wi
a550: 74 68 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62  thin pager_playb
a560: 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c  ack(). The local
a570: 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50   value.  ** of P
a580: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
a590: 69 73 20 72 65 73 74 6f 72 65 64 20 61 74 20 74  is restored at t
a5a0: 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72  he end of that r
a5b0: 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72  outine..  */.  r
a5c0: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
a5d0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c  Pager->jfd, jrnl
a5e0: 4f 66 66 2b 31 32 2c 20 28 75 33 32 20 2a 29 26  Off+12, (u32 *)&
a5f0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
a600: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
a610: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
a620: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
a630: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
a640: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  SZ(pPager);.  re
a650: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
a660: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  }.../*.** Write 
a670: 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73  the supplied mas
a680: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a690: 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61   into the journa
a6a0: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
a6b0: 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74 68  .** pPager at th
a6c0: 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  e current locati
a6d0: 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a  on. The master j
a6e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74  ournal name must
a6f0: 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20   be the last.** 
a700: 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f  thing written to
a710: 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e   a journal file.
a720: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
a730: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
a740: 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e  de, the.** journ
a750: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
a760: 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20 74  or is advanced t
a770: 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f  o the next secto
a780: 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72  r boundary befor
a790: 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73  e.** anything is
a7a0: 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f   written. The fo
a7b0: 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b  rmat is:.**.** +
a7c0: 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f   4 bytes: PAGER_
a7d0: 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20  MJ_PGNO..** + N 
a7e0: 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66  bytes: length of
a7f0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
a800: 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74  name..** + 4 byt
a810: 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74  es: N.** + 4 byt
a820: 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e  es: Master journ
a830: 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d  al name checksum
a840: 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20  ..** + 8 bytes: 
a850: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e  aJournalMagic[].
a860: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65  .**.** The maste
a870: 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63  r journal page c
a880: 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73  hecksum is the s
a890: 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73 20  um of the bytes 
a8a0: 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a  in the master.**
a8b0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
a8c0: 2a 0a 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20  *.** If zMaster 
a8d0: 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  is a NULL pointe
a8e0: 72 20 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20  r (occurs for a 
a8f0: 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
a900: 74 72 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a  transaction), .*
a910: 2a 20 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61  * this call is a
a920: 20 6e 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69   no-op..*/.stati
a930: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
a940: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
a950: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
a960: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
a970: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
a980: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
a990: 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75  i64 jrnlOff;.  u
a9a0: 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20  32 cksum = 0;.  
a9b0: 63 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66  char zBuf[sizeof
a9c0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b  (aJournalMagic)+
a9d0: 32 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d  2*4];..  if( !zM
a9e0: 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d  aster || pPager-
a9f0: 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75  >setMaster) retu
aa00: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
aa10: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
aa20: 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20  r = 1;..  len = 
aa30: 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b  strlen(zMaster);
aa40: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65  .  for(i=0; i<le
aa50: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73  n; i++){.    cks
aa60: 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d  um += zMaster[i]
aa70: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69  ;.  }..  /* If i
aa80: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
aa90: 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65  , advance to the
aaa0: 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f   next disk secto
aab0: 72 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67  r before writing
aac0: 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72  .  ** the master
aad0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54   journal name. T
aae0: 68 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74  his is in case t
aaf0: 68 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65  he previous page
ab00: 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a   written to.  **
ab10: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
ab20: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79   already been sy
ab30: 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  nced..  */.  if(
ab40: 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e   pPager->fullSyn
ab50: 63 20 29 7b 0a 20 20 20 20 73 65 65 6b 4a 6f 75  c ){.    seekJou
ab60: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b  rnalHdr(pPager);
ab70: 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d  .  }.  jrnlOff =
ab80: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
ab90: 4f 66 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  Off;.  pPager->j
aba0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65  ournalOff += (le
abb0: 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77  n+20);..  rc = w
abc0: 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65  rite32bits(pPage
abd0: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c  r->jfd, jrnlOff,
abe0: 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70   PAGER_MJ_PGNO(p
abf0: 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72  Pager));.  if( r
ac00: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
ac10: 65 74 75 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c  eturn rc;.  jrnl
ac20: 4f 66 66 20 2b 3d 20 34 3b 0a 0a 20 20 72 63 20  Off += 4;..  rc 
ac30: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
ac40: 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d  (pPager->jfd, zM
ac50: 61 73 74 65 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c  aster, len, jrnl
ac60: 4f 66 66 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  Off);.  if( rc!=
ac70: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
ac80: 72 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66  rn rc;.  jrnlOff
ac90: 20 2b 3d 20 6c 65 6e 3b 0a 0a 20 20 70 75 74 33   += len;..  put3
aca0: 32 62 69 74 73 28 7a 42 75 66 2c 20 6c 65 6e 29  2bits(zBuf, len)
acb0: 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28 26 7a  ;.  put32bits(&z
acc0: 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a  Buf[4], cksum);.
acd0: 20 20 6d 65 6d 63 70 79 28 26 7a 42 75 66 5b 38    memcpy(&zBuf[8
ace0: 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  ], aJournalMagic
acf0: 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  , sizeof(aJourna
ad00: 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72 63 20 3d  lMagic));.  rc =
ad10: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
ad20: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 42 75  pPager->jfd, zBu
ad30: 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61 4a 6f 75  f, 8+sizeof(aJou
ad40: 72 6e 61 6c 4d 61 67 69 63 29 2c 20 6a 72 6e 6c  rnalMagic), jrnl
ad50: 4f 66 66 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Off);.  pPager->
ad60: 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67  needSync = !pPag
ad70: 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 72 65  er->noSync;.  re
ad80: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ad90: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
ada0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
adb0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
adc0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
add0: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
ade0: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
adf0: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
ae00: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
ae10: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
ae20: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
ae30: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
ae40: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
ae50: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  ps the sqlite3Pa
ae60: 67 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 29 0a  gerStmtCommit().
ae70: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
ae80: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
ae90: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
aea0: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
aeb0: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
aec0: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
aed0: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
aee0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
aef0: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
af00: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
af10: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
af20: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
af30: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
af40: 67 65 72 3b 0a 20 20 50 67 48 69 73 74 6f 72 79  ger;.  PgHistory
af50: 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
af60: 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
af70: 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ger);.  assert( 
af80: 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28 20 21  MEMDB );.  if( !
af90: 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 7b  pHist->inStmt ){
afa0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69  .    assert( pHi
afb0: 73 74 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30  st->pPrevStmt==0
afc0: 20 26 26 20 70 48 69 73 74 2d 3e 70 4e 65 78 74   && pHist->pNext
afd0: 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 69  Stmt==0 );.    i
afe0: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
aff0: 20 29 7b 0a 20 20 20 20 20 20 50 47 48 44 52 5f   ){.      PGHDR_
b000: 54 4f 5f 48 49 53 54 28 70 50 61 67 65 72 2d 3e  TO_HIST(pPager->
b010: 70 53 74 6d 74 2c 20 70 50 61 67 65 72 29 2d 3e  pStmt, pPager)->
b020: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
b030: 0a 20 20 20 20 7d 0a 20 20 20 20 70 48 69 73 74  .    }.    pHist
b040: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
b050: 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 20  ager->pStmt;.   
b060: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
b070: 20 70 50 67 3b 0a 20 20 20 20 70 48 69 73 74 2d   pPg;.    pHist-
b080: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 20 20 7d  >inStmt = 1;.  }
b090: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
b0a0: 20 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73   page in the has
b0b0: 68 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74  h table given it
b0c0: 73 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20  s page number.  
b0d0: 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e  Return.** a poin
b0e0: 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20  ter to the page 
b0f0: 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66  or NULL if not f
b100: 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ound..*/.static 
b110: 50 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f  PgHdr *pager_loo
b120: 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
b130: 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
b140: 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 69 66 28   PgHdr *p;.  if(
b150: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 3d 3d   pPager->aHash==
b160: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
b170: 70 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  p = pPager->aHas
b180: 68 5b 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  h[pgno & (pPager
b190: 2d 3e 6e 48 61 73 68 2d 31 29 5d 3b 0a 20 20 77  ->nHash-1)];.  w
b1a0: 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67  hile( p && p->pg
b1b0: 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20  no!=pgno ){.    
b1c0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68  p = p->pNextHash
b1d0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
b1e0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  ;.}../*.** Clear
b1f0: 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63   the in-memory c
b200: 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
b210: 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20  ine.** sets the 
b220: 73 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67  state of the pag
b230: 65 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20  er back to what 
b240: 69 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77  it was when it w
b250: 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e  as first.** open
b260: 65 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e  ed.  Any outstan
b270: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
b280: 6e 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73  nvalidated and s
b290: 75 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70  ubsequent attemp
b2a0: 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20  ts.** to access 
b2b0: 74 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c  those pages will
b2c0: 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69   likely result i
b2d0: 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f  n a coredump..*/
b2e0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
b2f0: 65 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a  er_reset(Pager *
b300: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
b310: 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20   *pPg, *pNext;. 
b320: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b330: 43 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  Code ) return;. 
b340: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
b350: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
b360: 70 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52  pNext){.    IOTR
b370: 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
b380: 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
b390: 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
b3a0: 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
b3b0: 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f  e3_pager_pgfree_
b3c0: 63 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78  count);.    pNex
b3d0: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
b3e0: 6c 3b 0a 20 20 20 20 6c 72 75 4c 69 73 74 52 65  l;.    lruListRe
b3f0: 6d 6f 76 65 28 70 50 67 29 3b 0a 20 20 20 20 73  move(pPg);.    s
b400: 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 67 29  qlite3_free(pPg)
b410: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 70  ;.  }.  assert(p
b420: 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73  Pager->lru.pFirs
b430: 74 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74 28  t==0);.  assert(
b440: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
b450: 73 74 53 79 6e 63 65 64 3d 3d 30 29 3b 0a 20 20  stSynced==0);.  
b460: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
b470: 72 75 2e 70 4c 61 73 74 3d 3d 30 29 3b 0a 20 20  ru.pLast==0);.  
b480: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
b490: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c  0;.  pPager->pAl
b4a0: 6c 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  l = 0;.  pPager-
b4b0: 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 70  >pDirty = 0;.  p
b4c0: 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30  Pager->nHash = 0
b4d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
b4e0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b  (pPager->aHash);
b4f0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
b500: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
b510: 61 48 61 73 68 20 3d 20 30 3b 0a 20 20 70 50 61  aHash = 0;.  pPa
b520: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d  ger->nRef = 0;.}
b530: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74  ../*.** Unlock t
b540: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
b550: 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
b560: 70 61 67 65 72 20 69 73 20 63 75 72 72 65 6e 74  pager is current
b570: 6c 79 20 69 6e 20 65 72 72 6f 72 20 73 74 61 74  ly in error stat
b580: 65 2c 20 64 69 73 63 61 72 64 20 74 68 65 20 63  e, discard the c
b590: 6f 6e 74 65 6e 74 73 20 6f 66 20 0a 2a 2a 20 74  ontents of .** t
b5a0: 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65 73  he cache and res
b5b0: 65 74 20 74 68 65 20 50 61 67 65 72 20 73 74 72  et the Pager str
b5c0: 75 63 74 75 72 65 20 69 6e 74 65 72 6e 61 6c 20  ucture internal 
b5d0: 73 74 61 74 65 2e 20 49 66 20 74 68 65 72 65 20  state. If there 
b5e0: 69 73 0a 2a 2a 20 61 6e 20 6f 70 65 6e 20 6a 6f  is.** an open jo
b5f0: 75 72 6e 61 6c 2d 66 69 6c 65 2c 20 74 68 65 6e  urnal-file, then
b600: 20 74 68 65 20 6e 65 78 74 20 74 69 6d 65 20 61   the next time a
b610: 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 69 73 20   shared-lock is 
b620: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 6f 6e 20 74  obtained.** on t
b630: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 28 62  he pager file (b
b640: 79 20 74 68 69 73 20 6f 72 20 61 6e 79 20 6f 74  y this or any ot
b650: 68 65 72 20 70 72 6f 63 65 73 73 29 2c 20 69 74  her process), it
b660: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 74 72 65 61   will be.** trea
b670: 74 65 64 20 61 73 20 61 20 68 6f 74 2d 6a 6f 75  ted as a hot-jou
b680: 72 6e 61 6c 20 61 6e 64 20 72 6f 6c 6c 65 64 20  rnal and rolled 
b690: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
b6a0: 76 6f 69 64 20 70 61 67 65 72 5f 75 6e 6c 6f 63  void pager_unloc
b6b0: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  k(Pager *pPager)
b6c0: 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
b6d0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
b6e0: 7b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  {.    if( !MEMDB
b6f0: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
b700: 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
b710: 64 73 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 73  ds ){.        os
b720: 55 6e 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  Unlock(pPager->f
b730: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20  d, NO_LOCK);.   
b740: 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
b750: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
b760: 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
b770: 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22 2c 20 70 50  UNLOCK %p\n", pP
b780: 61 67 65 72 29 29 0a 0a 20 20 20 20 20 20 2f 2a  ager))..      /*
b790: 20 49 66 20 50 61 67 65 72 2e 65 72 72 43 6f 64   If Pager.errCod
b7a0: 65 20 69 73 20 73 65 74 2c 20 74 68 65 20 63 6f  e is set, the co
b7b0: 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61  ntents of the pa
b7c0: 67 65 72 20 63 61 63 68 65 20 63 61 6e 6e 6f 74  ger cache cannot
b7d0: 20 62 65 0a 20 20 20 20 20 20 2a 2a 20 74 72 75   be.      ** tru
b7e0: 73 74 65 64 2e 20 4e 6f 77 20 74 68 61 74 20 74  sted. Now that t
b7f0: 68 65 20 70 61 67 65 72 20 66 69 6c 65 20 69 73  he pager file is
b800: 20 75 6e 6c 6f 63 6b 65 64 2c 20 74 68 65 20 63   unlocked, the c
b810: 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68 65 0a 20  ontents of the. 
b820: 20 20 20 20 20 2a 2a 20 63 61 63 68 65 20 63 61       ** cache ca
b830: 6e 20 62 65 20 64 69 73 63 61 72 64 65 64 20 61  n be discarded a
b840: 6e 64 20 74 68 65 20 65 72 72 6f 72 20 63 6f 64  nd the error cod
b850: 65 20 73 61 66 65 6c 79 20 63 6c 65 61 72 65 64  e safely cleared
b860: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b870: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
b880: 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Code ){.        
b890: 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
b8a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
b8b0: 20 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74       pager_reset
b8c0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
b8d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
b8e0: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  mtOpen ){.      
b8f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
b900: 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
b910: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b920: 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
b930: 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 20  >aInStmt);.     
b940: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
b950: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
b960: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
b970: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
b980: 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pen ){.         
b990: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
b9a0: 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
b9b0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
b9c0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
b9d0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
b9e0: 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d 3e  e3_free(pPager->
b9f0: 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  aInJournal);.   
ba00: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
ba10: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
ba20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ba30: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
ba40: 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  n = 0;.        p
ba50: 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
ba60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
ba70: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
ba80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
ba90: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
baa0: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
bab0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
bac0: 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20  toopen = 0;.    
bad0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67      pPager->orig
bae0: 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20 20 20  DbSize = 0;.    
baf0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69    }.    }..    i
bb00: 66 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 50 61  f( !MEMDB || pPa
bb10: 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53 51  ger->errCode==SQ
bb20: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
bb30: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
bb40: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20   PAGER_UNLOCK;. 
bb50: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61       pPager->cha
bb60: 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 30  ngeCountDone = 0
bb70: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
bb80: 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61 20 72  *.** Execute a r
bb90: 6f 6c 6c 62 61 63 6b 20 69 66 20 61 20 74 72 61  ollback if a tra
bba0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
bbb0: 76 65 20 61 6e 64 20 75 6e 6c 6f 63 6b 20 74 68  ve and unlock th
bbc0: 65 20 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  e .** database f
bbd0: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
bbe0: 72 20 68 61 73 20 61 6c 72 65 61 64 79 20 65 6e  r has already en
bbf0: 74 65 72 65 64 20 74 68 65 20 65 72 72 6f 72 20  tered the error 
bc00: 73 74 61 74 65 2c 20 0a 2a 2a 20 64 6f 20 6e 6f  state, .** do no
bc10: 74 20 61 74 74 65 6d 70 74 20 74 68 65 20 72 6f  t attempt the ro
bc20: 6c 6c 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  llback..*/.stati
bc30: 63 20 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f  c void pagerUnlo
bc40: 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61  ckAndRollback(Pa
bc50: 67 65 72 20 2a 70 29 7b 0a 20 20 61 73 73 65 72  ger *p){.  asser
bc60: 74 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  t( p->state>=PAG
bc70: 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70  ER_RESERVED || p
bc80: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
bc90: 20 29 3b 0a 20 20 69 66 28 20 70 2d 3e 65 72 72   );.  if( p->err
bca0: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
bcb0: 26 26 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  && p->state>=PAG
bcc0: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
bcd0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
bce0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
bcf0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
bd00: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
bd10: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
bd20: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
bd30: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
bd40: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
bd50: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
bd60: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
bd70: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
bd80: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
bd90: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
bda0: 75 74 69 6e 65 20 65 6e 64 73 20 61 20 74 72 61  utine ends a tra
bdb0: 6e 73 61 63 74 69 6f 6e 2e 20 20 41 20 74 72 61  nsaction.  A tra
bdc0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
bdd0: 64 20 62 79 20 65 69 74 68 65 72 0a 2a 2a 20 61  d by either.** a
bde0: 20 43 4f 4d 4d 49 54 20 6f 72 20 61 20 52 4f 4c   COMMIT or a ROL
bdf0: 4c 42 41 43 4b 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LBACK..**.** Whe
be00: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
be10: 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61  s called, the pa
be20: 67 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72  ger has the jour
be30: 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e  nal file open an
be40: 64 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20  d.** a RESERVED 
be50: 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
be60: 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
be70: 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
be80: 20 77 69 6c 6c 20 72 65 6c 65 61 73 65 0a 2a 2a   will release.**
be90: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
bea0: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
beb0: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
bec0: 20 69 74 73 20 70 6c 61 63 65 20 69 66 20 74 68   its place if th
bed0: 61 74 20 69 73 0a 2a 2a 20 74 68 65 20 61 70 70  at is.** the app
bee0: 72 6f 70 72 69 61 74 65 20 74 68 69 6e 67 20 74  ropriate thing t
bef0: 6f 20 64 6f 2e 20 20 52 65 6c 65 61 73 65 20 6c  o do.  Release l
bf00: 6f 63 6b 73 20 75 73 75 61 6c 6c 79 20 69 73 20  ocks usually is 
bf10: 61 70 70 72 6f 70 72 69 61 74 65 2c 0a 2a 2a 20  appropriate,.** 
bf20: 75 6e 6c 65 73 73 20 77 65 20 61 72 65 20 69 6e  unless we are in
bf30: 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
bf40: 73 20 6d 6f 64 65 20 6f 72 20 75 6e 6c 65 73 73  s mode or unless
bf50: 20 74 68 69 73 20 69 73 20 61 20 0a 2a 2a 20 43   this is a .** C
bf60: 4f 4d 4d 49 54 20 41 4e 44 20 42 45 47 49 4e 20  OMMIT AND BEGIN 
bf70: 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 41 4e 44 20  or ROLLBACK AND 
bf80: 42 45 47 49 4e 20 6f 70 65 72 61 74 69 6f 6e 2e  BEGIN operation.
bf90: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  .**.** The journ
bfa0: 61 6c 20 66 69 6c 65 20 69 73 20 65 69 74 68 65  al file is eithe
bfb0: 72 20 64 65 6c 65 74 65 64 20 6f 72 20 74 72 75  r deleted or tru
bfc0: 6e 63 61 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  ncated..**.** TO
bfd0: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
bfe0: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
bff0: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
c000: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
c010: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
c020: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
c030: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
c040: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
c050: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
c060: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
c070: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
c080: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
c090: 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
c0a0: 6f 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  on(Pager *pPager
c0b0: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
c0c0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
c0d0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 72 63 32  TE_OK;.  int rc2
c0e0: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
c0f0: 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
c100: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
c110: 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
c120: 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
c130: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
c140: 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
c150: 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61 67 65  StmtCommit(pPage
c160: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
c170: 2d 3e 73 74 6d 74 4f 70 65 6e 20 26 26 20 21 70  ->stmtOpen && !p
c180: 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65  Pager->exclusive
c190: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 73 71 6c 69  Mode ){.    sqli
c1a0: 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65  te3OsClose(pPage
c1b0: 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 70 50  r->stfd);.    pP
c1c0: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
c1d0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50   0;.  }.  if( pP
c1e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
c1f0: 6e 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  n ){.    if( pPa
c200: 67 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f  ger->exclusiveMo
c210: 64 65 20 0a 20 20 20 20 20 20 20 20 20 20 26 26  de .          &&
c220: 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   (rc = sqlite3Os
c230: 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d  Truncate(pPager-
c240: 3e 6a 66 64 2c 20 30 29 29 3d 3d 53 51 4c 49 54  >jfd, 0))==SQLIT
c250: 45 5f 4f 4b 20 29 7b 3b 0a 20 20 20 20 20 20 70  E_OK ){;.      p
c260: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
c270: 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 61  f = 0;.      pPa
c280: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
c290: 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ted = 0;.    }el
c2a0: 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  se{.      sqlite
c2b0: 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d  3OsClose(pPager-
c2c0: 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70 50 61  >jfd);.      pPa
c2d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
c2e0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
c2f0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
c300: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
c310: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
c320: 61 67 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67  ager->pVfs, pPag
c330: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 30 29  er->zJournal, 0)
c340: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c350: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
c360: 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
c370: 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67  rnal );.    pPag
c380: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
c390: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
c3a0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
c3b0: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
c3c0: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
c3d0: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
c3e0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
c3f0: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
c400: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c410: 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79        pPg->alway
c420: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23  sRollback = 0;.#
c430: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c440: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
c450: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
c460: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c470: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
c480: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
c490: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
c4a0: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
c4b0: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c4c0: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nRec = 0;.  }el
c4d0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
c4e0: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
c4f0: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
c500: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
c510: 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
c520: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
c530: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
c540: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c550: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
c560: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
c570: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
c580: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
c590: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c5a0: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
c5b0: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
c5c0: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
c5d0: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
c5e0: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
c5f0: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
c600: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c610: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
c620: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
c630: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
c640: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c  Sync = 0;.  lruL
c650: 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
c660: 64 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  d(pPager);.  pPa
c670: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
c680: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
c690: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
c6a0: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
c6b0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
c6c0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
c6d0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
c6e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
c6f0: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
c700: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
c710: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
c720: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
c730: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
c740: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
c750: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
c760: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
c770: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
c780: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
c790: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
c7a0: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
c7b0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
c7c0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
c7d0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
c7e0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
c7f0: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
c800: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
c810: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
c820: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
c830: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
c840: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
c850: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
c860: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
c870: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
c880: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
c890: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
c8a0: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
c8b0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
c8c0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
c8d0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
c8e0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
c8f0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
c900: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
c910: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
c920: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
c930: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
c940: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
c950: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
c960: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
c970: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
c980: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
c990: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
c9a0: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
c9b0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
c9c0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
c9d0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
c9e0: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
c9f0: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
ca00: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
ca10: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
ca20: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
ca30: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
ca40: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
ca50: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
ca60: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
ca70: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
ca80: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
ca90: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
caa0: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
cab0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
cac0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
cad0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
cae0: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
caf0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
cb00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
cb10: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
cb20: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
cb30: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
cb40: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
cb50: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
cb60: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
cb70: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
cb80: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
cb90: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
cba0: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
cbb0: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
cbc0: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
cbd0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
cbe0: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
cbf0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
cc00: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
cc10: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
cc20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
cc30: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
cc40: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
cc50: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
cc60: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
cc70: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
cc80: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
cc90: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
cca0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
ccb0: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
ccc0: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
ccd0: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
cce0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
ccf0: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cd00: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
cd10: 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  r, .  sqlite3_fi
cd20: 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f  le *jfd,.  i64 o
cd30: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65  ffset,.  int use
cd40: 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
cd50: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
cd60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd70: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
cd80: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
cd90: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
cda0: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
cdb0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
cdc0: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
cdd0: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
cde0: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
ce10: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
ce20: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
ce30: 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50  aData = (u8 *)pP
ce40: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
ce50: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
ce60: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
ce70: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
ce80: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
ce90: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
cea0: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
ceb0: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
cec0: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
ced0: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
cee0: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
cef0: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
cf00: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
cf10: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
cf20: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
cf30: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
cf40: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   );..  rc = read
cf50: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
cf60: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
cf70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
cf80: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
cf90: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
cfa0: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
cfb0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
cfc0: 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28  offset+4);.  if(
cfd0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
cfe0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
cff0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d000: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
d010: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
d020: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
d030: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
d040: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
d050: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
d060: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
d070: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
d080: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
d090: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
d0a0: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
d0b0: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
d0c0: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
d0d0: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
d0e0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
d0f0: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
d100: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
d110: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
d120: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
d130: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
d140: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
d150: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
d160: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
d170: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
d180: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
d190: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
d1a0: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
d1b0: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
d1c0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d1d0: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
d1e0: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
d1f0: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
d200: 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72  d, offset+pPager
d210: 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63  ->pageSize+4, &c
d220: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
d230: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d240: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d250: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
d260: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
d270: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
d280: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
d290: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
d2a0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
d2b0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d2c0: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
d2d0: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
d2e0: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
d2f0: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
d300: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d310: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
d320: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
d330: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
d340: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
d350: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
d360: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
d370: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
d380: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
d390: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
d3a0: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
d3b0: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
d3c0: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
d3d0: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
d3e0: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
d3f0: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
d400: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d410: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
d420: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
d430: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
d440: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
d450: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
d460: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
d470: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
d480: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
d490: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
d4a0: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
d4b0: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
d4c0: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
d4d0: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
d4e0: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
d4f0: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
d500: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
d510: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
d520: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
d530: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
d540: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
d550: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
d560: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
d570: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
d580: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d590: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
d5a0: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
d5b0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
d5c0: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
d5d0: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
d5e0: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
d5f0: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
d600: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
d610: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
d620: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
d630: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
d640: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
d650: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d660: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d670: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
d680: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
d690: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
d6a0: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
d6b0: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d6c0: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
d6d0: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
d6e0: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
d6f0: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
d700: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
d710: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
d720: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
d730: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
d740: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
d750: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
d760: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
d770: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
d780: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
d790: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
d7a0: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
d7b0: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
d7c0: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
d7d0: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
d7e0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d7f0: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
d800: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
d810: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
d820: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
d830: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
d840: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
d850: 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
d860: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
d870: 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
d880: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
d890: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
d8a0: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
d8b0: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
d8c0: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
d8d0: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
d8e0: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
d8f0: 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
d900: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
d910: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
d920: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
d930: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
d940: 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
d950: 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
d960: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
d970: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
d980: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
d990: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
d9a0: 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42 41  ERTRACE4("PLAYBA
d9b0: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
d9c0: 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
d9d0: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
d9e0: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
d9f0: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
da00: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
da10: 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69  ze, aData));.  i
da20: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
da30: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
da40: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
da50: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
da60: 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ) ){.    i64 off
da70: 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
da80: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
da90: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
daa0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
dab0: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
dac0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
dad0: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
dae0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
daf0: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
db00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
db10: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
db20: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
db30: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
db40: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
db50: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
db60: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
db70: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
db80: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
db90: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
dba0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
dbb0: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
dbc0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
dbd0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
dbe0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
dbf0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
dc00: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
dc10: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
dc20: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
dc30: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
dc40: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
dc50: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
dc60: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
dc70: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
dc80: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
dc90: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
dca0: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
dcb0: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
dcc0: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
dcd0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
dce0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
dcf0: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
dd00: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
dd10: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
dd20: 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
dd30: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
dd40: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
dd50: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
dd60: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
dd70: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
dd80: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
dd90: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
dda0: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
ddb0: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
ddc0: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
ddd0: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
dde0: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
ddf0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
de00: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
de10: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
de20: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
de30: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
de40: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
de50: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
de60: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
de70: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
de80: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
de90: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
dea0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
deb0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
dec0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
ded0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
dee0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
def0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
df00: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
df10: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
df20: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
df30: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
df40: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
df50: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
df60: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
df70: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
df80: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
df90: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
dfa0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
dfb0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
dfc0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
dfd0: 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
dfe0: 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
dff0: 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
e000: 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
e010: 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
e020: 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
e030: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
e040: 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ..**.**.** The m
e050: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e060: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
e070: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
e080: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
e090: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
e0a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
e0b0: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
e0c0: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
e0d0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
e0e0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
e0f0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
e100: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
e110: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
e120: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
e130: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
e140: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
e150: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
e160: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
e170: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
e180: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
e190: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
e1a0: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
e1b0: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
e1c0: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
e1d0: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
e1e0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
e1f0: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
e200: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
e210: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
e220: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
e230: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
e240: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
e250: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
e260: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
e270: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e280: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e290: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
e2a0: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
e2b0: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
e2c0: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
e2d0: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
e2e0: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
e2f0: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
e300: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
e310: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
e320: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
e330: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
e340: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
e350: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
e360: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
e370: 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
e380: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
e390: 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
e3a0: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
e3b0: 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
e3c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
e3d0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
e3e0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  se{.    int flag
e3f0: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
e400: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
e410: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
e420: 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
e430: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
e440: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
e450: 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
e460: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e470: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e480: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
e490: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
e4a0: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
e4b0: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
e4c0: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
e4d0: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
e4e0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e4f0: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
e500: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
e510: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
e520: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
e530: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e540: 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  rPtr = 0;.    in
e550: 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70  t nMasterPtr = p
e560: 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
e570: 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20  athname+1;..    
e580: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
e590: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
e5a0: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
e5b0: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
e5c0: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d      ** sqlite3_m
e5d0: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
e5e0: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
e5f0: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
e600: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
e610: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
e620: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d  qlite3_malloc(nM
e630: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
e640: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
e650: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
e660: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
e670: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
e680: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
e690: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
e6a0: 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d      zMasterPtr =
e6b0: 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
e6c0: 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
e6d0: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e6e0: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
e6f0: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
e700: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
e710: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
e720: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e730: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e740: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
e750: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
e760: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
e770: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
e780: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
e790: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
e7a0: 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
e7b0: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
e7c0: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
e7d0: 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
e7e0: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
e7f0: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
e800: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
e810: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
e820: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
e830: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
e840: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
e850: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e860: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
e870: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
e880: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
e890: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e8a0: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
e8b0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
e8c0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
e8d0: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
e8e0: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
e8f0: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
e900: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
e910: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e920: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
e930: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
e940: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
e950: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
e970: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e980: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
e990: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
e9a0: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
e9b0: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
e9c0: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
e9d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
e9e0: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
e9f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
ea00: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
ea10: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
ea20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
ea30: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
ea40: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
ea50: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
ea60: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
ea70: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
ea80: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
ea90: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
eaa0: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
eab0: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
eac0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
ead0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
eae0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
eaf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eb00: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
eb10: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
eb20: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
eb30: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
eb40: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
eb50: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
eb60: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
eb70: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
eb80: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
eb90: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
eba0: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
ebb0: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
ebc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
ebd0: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
ebe0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
ebf0: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
ec00: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
ec10: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
ec20: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
ec30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
ec40: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
ec50: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
ec60: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
ec70: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
ec80: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
ec90: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
eca0: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
ecb0: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
ecc0: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
ecd0: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
ece0: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
ecf0: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
ed00: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
ed10: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
ed20: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
ed30: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
ed40: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
ed50: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
ed60: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
ed70: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
ed80: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
ed90: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
eda0: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
edb0: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
edc0: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
edd0: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
ede0: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
edf0: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
ee00: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
ee10: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
ee20: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
ee30: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
ee40: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
ee50: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
ee60: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
ee70: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
ee80: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
ee90: 6e 64 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  nd do not do the
eea0: 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   truncation..*/.
eeb0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
eec0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
eed0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
eee0: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
eef0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
ef00: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
ef10: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
ef20: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
ef30: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
ef40: 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
ef50: 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  newSize;.    rc 
ef60: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
ef70: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
ef80: 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
ef90: 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61     newSize = pPa
efa0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
efb0: 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
efc0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
efd0: 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  && currentSize>n
efe0: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
eff0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
f000: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
f010: 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
f020: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
f030: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f040: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
f050: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
f060: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
f070: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
f080: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f090: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
f0a0: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
f0b0: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
f0c0: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
f0d0: 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65  ize is the large
f0e0: 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  r of the sector 
f0f0: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
f100: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
f110: 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68  torSize() and th
f120: 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73  e pageSize..*/.s
f130: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
f140: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
f150: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
f160: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
f170: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
f180: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
f190: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
f1a0: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
f1b0: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
f1c0: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
f1d0: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
f1e0: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
f1f0: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
f200: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
f210: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
f220: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
f230: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
f240: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
f250: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
f260: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
f270: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
f280: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
f290: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
f2a0: 73 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65  sectorSize<pPage
f2b0: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
f2c0: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
f2d0: 72 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  rSize = pPager->
f2e0: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a  pageSize;.  }.}.
f2f0: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
f300: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
f310: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
f320: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
f330: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
f340: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
f350: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
f360: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
f370: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
f380: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
f390: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
f3a0: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
f3b0: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
f3c0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
f3d0: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
f3e0: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
f3f0: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f400: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
f410: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
f420: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
f430: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
f440: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
f450: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
f460: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
f470: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
f480: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
f490: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
f4a0: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
f4b0: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
f4c0: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
f4d0: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
f4e0: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
f4f0: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
f500: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
f510: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f520: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
f530: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
f540: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
f550: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
f560: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
f570: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
f580: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
f590: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
f5a0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
f5b0: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
f5c0: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
f5d0: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
f5e0: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
f5f0: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
f600: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
f610: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
f620: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
f630: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
f640: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
f650: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
f660: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
f670: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
f680: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
f690: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
f6a0: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
f6b0: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
f6c0: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
f6d0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
f6e0: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
f6f0: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
f700: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
f710: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
f720: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
f730: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
f740: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
f750: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
f760: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
f770: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
f780: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
f790: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
f7a0: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
f7b0: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
f7c0: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
f7d0: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
f7e0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
f7f0: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
f800: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
f810: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
f820: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
f830: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
f840: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
f850: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
f860: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
f870: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
f880: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
f890: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
f8a0: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
f8b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
f8c0: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
f8d0: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
f8e0: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
f8f0: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
f900: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
f910: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
f920: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
f930: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
f940: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
f950: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
f960: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
f970: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
f980: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
f990: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
f9a0: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
f9b0: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
f9c0: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
f9d0: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
f9e0: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
f9f0: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
fa00: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
fa10: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
fa20: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
fa30: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
fa40: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
fa50: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
fa60: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
fa70: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
fa80: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
fa90: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
faa0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
fab0: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
fac0: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
fad0: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
fae0: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
faf0: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
fb00: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
fb10: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
fb20: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
fb30: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
fb40: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
fb50: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
fb60: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
fb70: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
fb80: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
fb90: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
fba0: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
fbb0: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
fbc0: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
fbd0: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
fbe0: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
fbf0: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
fc00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fc10: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
fc20: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
fc30: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
fc40: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
fc50: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
fc60: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
fc70: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
fc80: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
fc90: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
fca0: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
fcb0: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
fcc0: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
fcd0: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
fce0: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
fcf0: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
fd00: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
fd10: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
fd20: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
fd30: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
fd40: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
fd50: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
fd60: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
fd70: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
fd80: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
fd90: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
fda0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fdb0: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
fdc0: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
fdd0: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
fde0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
fdf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fe00: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
fe10: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
fe20: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
fe30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fe40: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
fe50: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
fe60: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
fe70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fe80: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
fe90: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
fea0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
feb0: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
fec0: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
fed0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
fee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fef0: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
ff00: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
ff10: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
ff20: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
ff30: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
ff40: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
ff50: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
ff60: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
ff70: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
ff80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
ff90: 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
ffa0: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
ffb0: 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
ffc0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ffd0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
ffe0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
fff0: 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10000 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
10010 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
10020 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
10030 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
10040 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
10050 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
10060 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
10070 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
10080 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
10090 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
100a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
100b0 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
100c0 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
100d0 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
100e0 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
100f0 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
10100 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
10110 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
10120 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
10130 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
10140 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
10150 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
10160 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
10170 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10180 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
10190 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
101a0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
101b0 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
101c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
101d0 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72   .   || (zMaster
101e0 5b 30 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f  [0] && !sqlite3O
101f0 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
10200 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
10210 43 45 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20  CESS_EXISTS)) . 
10220 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
10230 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
10240 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
10250 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
10260 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10270 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
10280 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10290 20 30 3b 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   0;.  zMaster = 
102a0 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
102b0 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
102c0 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
102d0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
102e0 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
102f0 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
10300 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
10310 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
10320 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
10330 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
10340 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
10350 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
10360 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
10370 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
10380 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
10390 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
103a0 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
103b0 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
103c0 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
103d0 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
103e0 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
103f0 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
10400 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
10410 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
10420 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
10430 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
10440 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
10450 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
10460 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
10470 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
10480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10490 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
104a0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
104b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
104c0 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
104d0 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
104e0 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
104f0 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
10500 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
10510 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
10520 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
10530 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
10540 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
10550 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
10560 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
10570 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10580 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
10590 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
105a0 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
105b0 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
105c0 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
105d0 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
105e0 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
105f0 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
10600 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
10610 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
10620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
10630 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
10640 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
10650 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
10660 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
10670 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10680 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
10690 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
106a0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
106b0 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
106c0 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
106d0 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
106e0 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
106f0 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
10700 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
10710 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
10720 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
10730 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
10740 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
10750 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
10760 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
10770 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
10780 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
10790 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
107a0 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
107b0 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
107c0 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
107d0 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
107e0 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
107f0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
10800 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
10810 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
10820 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
10830 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  565..    */.    
10840 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
10850 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
10860 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10870 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
10880 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
10890 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
108a0 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
108b0 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
108c0 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
108d0 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
108e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
108f0 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
10900 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
10910 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
10920 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
10930 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
10940 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
10950 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
10960 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10970 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10980 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
10990 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
109a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
109b0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
109c0 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
109d0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
109e0 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
109f0 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
10a00 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10a10 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
10a20 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
10a30 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
10a40 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
10a50 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
10a60 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
10a70 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
10a80 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
10a90 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
10aa0 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
10ab0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10ac0 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
10ad0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10ae0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10af0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
10b00 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
10b10 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10b20 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
10b30 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10b40 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
10b50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
10b60 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
10b70 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10b80 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10b90 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10ba0 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
10bb0 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
10bc0 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
10bd0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10be0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
10bf0 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
10c00 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
10c10 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
10c20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
10c30 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
10c40 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10c50 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10c70 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
10c80 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
10c90 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
10ca0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10cb0 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
10cc0 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
10cd0 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
10ce0 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
10cf0 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
10d00 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
10d10 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
10d20 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
10d30 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10d40 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
10d50 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
10d60 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
10d70 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
10d80 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
10d90 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
10da0 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
10db0 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
10dc0 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
10dd0 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
10de0 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
10df0 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
10e00 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
10e10 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
10e20 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
10e30 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
10e40 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
10e50 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
10e60 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10e70 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
10e80 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
10e90 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
10ea0 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
10eb0 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
10ec0 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
10ed0 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
10ee0 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
10ef0 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
10f00 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
10f10 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
10f20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
10f30 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
10f40 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
10f50 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
10f60 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
10f70 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
10f80 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
10f90 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
10fa0 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
10fb0 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
10fc0 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
10fd0 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
10fe0 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
10ff0 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
11000 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
11010 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
11020 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
11030 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
11040 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
11050 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
11060 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
11070 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
11080 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
11090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
110a0 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
110b0 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
110c0 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
110d0 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
110e0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
110f0 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
11100 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
11110 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
11120 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
11130 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
11140 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
11150 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
11160 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
11170 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
11180 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11190 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
111a0 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
111b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
111c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
111d0 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
111e0 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
111f0 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
11200 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
11210 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
11220 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
11230 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
11240 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
11250 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
11260 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
11270 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
11280 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
11290 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
112a0 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
112b0 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
112c0 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
112d0 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
112e0 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
112f0 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
11300 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
11310 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
11320 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
11330 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
11340 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
11350 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
11360 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
11370 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
11380 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
11390 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
113a0 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
113b0 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
113c0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
113d0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
113e0 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
113f0 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
11400 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
11410 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
11420 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
11430 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11440 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
11450 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11460 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61   );.  nRec = pPa
11470 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
11480 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
11490 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
114a0 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
114b0 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
114c0 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
114d0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
114e0 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
114f0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
11500 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
11510 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
11520 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
11530 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
11540 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
11550 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
11560 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
11570 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11580 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
11590 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a   i64 offset = i*
115a0 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
115b0 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ize);.    rc = p
115c0 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
115d0 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
115e0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
115f0 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  set, 0);.    ass
11600 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11610 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
11620 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11630 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
11640 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
11650 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
11660 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
11670 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11680 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
11690 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
116a0 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
116b0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
116c0 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
116d0 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
116e0 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
116f0 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
11700 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
11710 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
11720 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
11730 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
11740 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
11750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
11760 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
11770 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
11780 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
11790 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
117a0 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
117b0 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
117c0 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
117d0 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
117e0 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
117f0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11800 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  lOff = pPager->s
11810 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67  tmtJSize;.  pPag
11820 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20  er->cksumInit = 
11830 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
11840 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  m;.  while( pPag
11850 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
11860 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72   hdrOff ){.    r
11870 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
11880 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
11890 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
118a0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
118b0 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  Off, 1);.    ass
118c0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
118d0 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
118e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
118f0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
11900 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
11910 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
11920 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
11930 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
11940 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
11950 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
11960 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
11970 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
11980 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
11990 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
119a0 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
119b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
119c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
119d0 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
119e0 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
119f0 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
11a00 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
11a10 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
11a20 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
11a30 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
11a40 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
11a50 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
11a60 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11a70 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  =nJRec-1; i>=0 &
11a80 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
11a90 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
11aa0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
11ab0 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
11ac0 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
11ad0 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11ae0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
11af0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11b00 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
11b10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11b20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11b30 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11b40 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
11b50 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11b60 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
11b70 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
11b80 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
11b90 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
11ba0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11bb0 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
11bc0 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
11bd0 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
11be0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11bf0 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11c00 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11c10 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
11c20 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
11c30 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
11c40 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
11c50 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
11c60 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
11c70 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
11c80 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
11c90 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
11ca0 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
11cb0 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
11cc0 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
11cd0 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
11ce0 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
11cf0 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
11d00 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
11d10 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
11d20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
11d30 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
11d40 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
11d50 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
11d60 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11d70 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
11d80 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
11d90 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
11da0 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
11db0 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
11dc0 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
11dd0 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
11de0 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
11df0 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
11e00 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
11e10 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
11e20 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
11e30 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
11e40 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
11e50 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11e60 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
11e70 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
11e80 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
11e90 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
11ea0 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
11eb0 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
11ec0 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
11ed0 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
11ee0 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
11ef0 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
11f00 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
11f10 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
11f20 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
11f30 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
11f40 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
11f50 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
11f60 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
11f70 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
11f80 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
11f90 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
11fa0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
11fb0 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
11fc0 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
11fd0 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
11fe0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
11ff0 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
12000 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
12010 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
12020 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
12030 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
12040 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
12050 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
12060 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
12070 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
12080 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
12090 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
120a0 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
120b0 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
120c0 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
120d0 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
120e0 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
120f0 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
12100 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
12110 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
12120 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
12130 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
12140 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
12150 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
12160 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
12170 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
12180 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
12190 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
121a0 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
121b0 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
121c0 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
121d0 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
121e0 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
121f0 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
12200 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
12210 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
12220 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
12230 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
12240 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
12250 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
12260 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12270 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
12280 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
12290 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
122a0 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
122b0 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75  sync_flags = (fu
122c0 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f  ll_fsync?SQLITE_
122d0 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45  SYNC_FULL:SQLITE
122e0 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
122f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
12300 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
12310 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
12320 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
12330 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
12340 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
12350 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
12360 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
12370 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
12380 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
12390 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
123a0 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
123b0 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
123c0 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
123d0 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
123e0 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
123f0 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
12400 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
12410 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
12420 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
12430 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
12440 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
12450 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
12460 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
12470 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
12480 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
12490 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
124a0 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
124b0 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
124c0 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  e temporary.** f
124d0 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
124e0 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
124f0 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
12500 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c  rOpentemp(.  sql
12510 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
12520 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
12530 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61  l file system la
12540 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  yer */.  sqlite3
12550 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
12560 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
12570 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
12580 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
12590 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
125a0 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ame of the file.
125b0 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
125c0 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
125d0 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
125e0 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
125f0 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
12600 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
12610 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
12620 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  e!=0 );..#ifdef 
12630 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
12640 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
12650 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
12660 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
12670 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
12680 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
12690 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
126a0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
126b0 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
126c0 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
126d0 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
126e0 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
126f0 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
12700 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
12710 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
12720 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65  zFilename, pFile
12730 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
12740 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
12750 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65  LITE_OK || pFile
12760 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
12770 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12780 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
12790 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
127a0 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
127b0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
127c0 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
127d0 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
127e0 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
127f0 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
12800 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
12810 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
12820 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
12830 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69  PagerGet() and i
12840 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
12850 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
12860 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
12870 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
12880 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
12890 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
128a0 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
128b0 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
128c0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
128d0 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
128e0 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
128f0 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
12900 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
12910 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
12920 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
12930 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
12940 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
12950 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
12960 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  hen all informat
12970 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
12980 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  ache..** It is n
12990 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
129a0 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20  disk.  This can 
129b0 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
129c0 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65  ment an.** in-me
129d0 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
129e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
129f0 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
12a00 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12a10 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
12a20 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
12a30 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
12a40 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
12a50 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12a60 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
12a70 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
12a80 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12a90 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
12aa0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12ab0 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
12ac0 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
12ad0 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
12ae0 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
12af0 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
12b00 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
12b10 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
12b20 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
12b30 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
12b40 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
12b50 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
12b60 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
12b70 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
12b80 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12b90 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
12ba0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
12bb0 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
12bc0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12bd0 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
12be0 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65  le = 0;.  int me
12bf0 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  mDb = 0;.  int r
12c00 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69  eadOnly = 0;.  i
12c10 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
12c20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
12c30 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
12c40 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
12c50 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
12c60 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
12c70 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61  =0;.  int journa
12c80 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
12c90 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
12ca0 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66  Vfs);.  int nDef
12cb0 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
12cc0 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
12cd0 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  IZE;.  char *zPa
12ce0 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50  thname;.  int nP
12cf0 61 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54  athname;..  /* T
12d00 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
12d10 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
12d20 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
12d30 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
12d40 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61  pute the full pa
12d50 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74  thname */.  nPat
12d60 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12d70 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50  Pathname+1;.  zP
12d80 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12d90 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  3_malloc(nPathna
12da0 6d 65 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  me);.  if( zPath
12db0 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
12dc0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12dd0 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
12de0 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
12df0 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
12e00 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12e10 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
12e20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
12e30 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
12e40 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
12e50 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
12e60 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
12e70 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
12e80 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
12e90 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12ea0 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12eb0 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
12ec0 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
12ed0 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
12ee0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74  c = sqlite3OsGet
12ef0 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e  Tempname(pVfs, n
12f00 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
12f10 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
12f20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12f30 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12f40 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
12f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12f60 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73  .  nPathname = s
12f70 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29  trlen(zPathname)
12f80 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
12f90 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
12fa0 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
12fb0 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
12fc0 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
12fd0 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
12fe0 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
12ff0 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
13000 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ure */.    journ
13010 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20  alFileSize +    
13020 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
13030 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63  urnal file struc
13040 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66  ture */ .    pVf
13050 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 20  s->szOsFile * 2 
13060 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  +        /* The 
13070 64 62 20 61 6e 64 20 73 74 6d 74 20 6a 6f 75 72  db and stmt jour
13080 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 20 0a 20 20  nal files */ .  
13090 20 20 34 2a 6e 50 61 74 68 6e 61 6d 65 20 2b 20    4*nPathname + 
130a0 34 30 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  40            /*
130b0 20 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 44 69 72   zFilename, zDir
130c0 65 63 74 6f 72 79 2c 20 7a 4a 6f 75 72 6e 61 6c  ectory, zJournal
130d0 2c 20 7a 53 74 6d 74 4a 72 6e 6c 20 2a 2f 0a 20  , zStmtJrnl */. 
130e0 20 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65   );.  if( !pPage
130f0 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  r ){.    sqlite3
13100 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d 65 29  _free(zPathname)
13110 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
13120 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
13130 20 70 50 74 72 20 3d 20 28 75 38 20 2a 29 26 70   pPtr = (u8 *)&p
13140 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70 50 61 67  Pager[1];.  pPag
13150 65 72 2d 3e 76 66 73 46 6c 61 67 73 20 3d 20 76  er->vfsFlags = v
13160 66 73 46 6c 61 67 73 3b 0a 20 20 70 50 61 67 65  fsFlags;.  pPage
13170 72 2d 3e 66 64 20 3d 20 28 73 71 6c 69 74 65 33  r->fd = (sqlite3
13180 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56 66  _file*)&pPtr[pVf
13190 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 30 5d 3b 0a  s->szOsFile*0];.
131a0 20 20 70 50 61 67 65 72 2d 3e 73 74 66 64 20 3d    pPager->stfd =
131b0 20 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 2a 29   (sqlite3_file*)
131c0 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73  &pPtr[pVfs->szOs
131d0 46 69 6c 65 2a 31 5d 3b 0a 20 20 70 50 61 67 65  File*1];.  pPage
131e0 72 2d 3e 6a 66 64 20 3d 20 28 73 71 6c 69 74 65  r->jfd = (sqlite
131f0 33 5f 66 69 6c 65 2a 29 26 70 50 74 72 5b 70 56  3_file*)&pPtr[pV
13200 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a 32 5d 3b  fs->szOsFile*2];
13210 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  .  pPager->zFile
13220 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70  name = (char*)&p
13230 50 74 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69  Ptr[pVfs->szOsFi
13240 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c 46 69 6c 65  le*2+journalFile
13250 53 69 7a 65 5d 3b 0a 20 20 70 50 61 67 65 72 2d  Size];.  pPager-
13260 3e 7a 44 69 72 65 63 74 6f 72 79 20 3d 20 26 70  >zDirectory = &p
13270 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
13280 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 5d 3b 0a 20  [nPathname+1];. 
13290 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
132a0 6c 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 44 69  l = &pPager->zDi
132b0 72 65 63 74 6f 72 79 5b 6e 50 61 74 68 6e 61 6d  rectory[nPathnam
132c0 65 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  e+1];.  pPager->
132d0 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20 26 70 50 61  zStmtJrnl = &pPa
132e0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 50  ger->zJournal[nP
132f0 61 74 68 6e 61 6d 65 2b 31 30 5d 3b 0a 20 20 70  athname+10];.  p
13300 50 61 67 65 72 2d 3e 70 56 66 73 20 3d 20 70 56  Pager->pVfs = pV
13310 66 73 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61  fs;.  memcpy(pPa
13320 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20  ger->zFilename, 
13330 7a 50 61 74 68 6e 61 6d 65 2c 20 6e 50 61 74 68  zPathname, nPath
13340 6e 61 6d 65 2b 31 29 3b 0a 20 20 73 71 6c 69 74  name+1);.  sqlit
13350 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e 61 6d  e3_free(zPathnam
13360 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74  e);..  /* Open t
13370 68 65 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 20  he pager file.. 
13380 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e   */.  if( zFilen
13390 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65  ame && zFilename
133a0 5b 30 5d 20 26 26 20 21 6d 65 6d 44 62 20 29 7b  [0] && !memDb ){
133b0 0a 20 20 20 20 69 66 28 20 6e 50 61 74 68 6e 61  .    if( nPathna
133c0 6d 65 3e 28 70 56 66 73 2d 3e 6d 78 50 61 74 68  me>(pVfs->mxPath
133d0 6e 61 6d 65 20 2d 20 73 69 7a 65 6f 66 28 22 2d  name - sizeof("-
133e0 6a 6f 75 72 6e 61 6c 22 29 29 20 29 7b 0a 20 20  journal")) ){.  
133f0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
13400 43 41 4e 54 4f 50 45 4e 3b 0a 20 20 20 20 7d 65  CANTOPEN;.    }e
13410 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 66  lse{.      int f
13420 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  out = 0;.      r
13430 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
13440 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  n(pVfs, pPager->
13450 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 50 61 67 65  zFilename, pPage
13460 72 2d 3e 66 64 2c 0a 20 20 20 20 20 20 20 20 20  r->fd,.         
13470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13480 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
13490 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20 20 20 20  , &fout);.      
134a0 72 65 61 64 4f 6e 6c 79 20 3d 20 28 66 6f 75 74  readOnly = (fout
134b0 26 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41  &SQLITE_OPEN_REA
134c0 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20 20 20 20 2f  DONLY);..      /
134d0 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20 77 61  * If the file wa
134e0 73 20 73 75 63 63 65 73 73 66 75 6c 6c 79 20 6f  s successfully o
134f0 70 65 6e 65 64 20 66 6f 72 20 72 65 61 64 2f 77  pened for read/w
13500 72 69 74 65 20 61 63 63 65 73 73 2c 0a 20 20 20  rite access,.   
13510 20 20 20 2a 2a 20 63 68 6f 6f 73 65 20 61 20 64     ** choose a d
13520 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13530 20 69 6e 20 63 61 73 65 20 77 65 20 68 61 76 65   in case we have
13540 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 0a 20   to create the. 
13550 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
13560 20 66 69 6c 65 2e 20 54 68 65 20 64 65 66 61 75   file. The defau
13570 6c 74 20 70 61 67 65 20 73 69 7a 65 20 69 73 20  lt page size is 
13580 74 68 65 20 6d 61 78 69 6d 75 6d 20 6f 66 3a 0a  the maximum of:.
13590 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
135a0 2a 20 20 20 20 2b 20 53 51 4c 49 54 45 5f 44 45  *    + SQLITE_DE
135b0 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 2c  FAULT_PAGE_SIZE,
135c0 0a 20 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  .      **    + T
135d0 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e 65  he value returne
135e0 64 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65  d by sqlite3OsSe
135f0 63 74 6f 72 53 69 7a 65 28 29 0a 20 20 20 20 20  ctorSize().     
13600 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 6c 61 72   **    + The lar
13610 67 65 73 74 20 70 61 67 65 20 73 69 7a 65 20 74  gest page size t
13620 68 61 74 20 63 61 6e 20 62 65 20 77 72 69 74 74  hat can be writt
13630 65 6e 20 61 74 6f 6d 69 63 61 6c 6c 79 2e 0a 20  en atomically.. 
13640 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
13650 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
13660 26 26 20 21 72 65 61 64 4f 6e 6c 79 20 29 7b 0a  && !readOnly ){.
13670 20 20 20 20 20 20 20 20 69 6e 74 20 69 53 65 63          int iSec
13680 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c 69 74 65  torSize = sqlite
13690 33 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 70 50  3OsSectorSize(pP
136a0 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 20  ager->fd);.     
136b0 20 20 20 69 66 28 20 6e 44 65 66 61 75 6c 74 50     if( nDefaultP
136c0 61 67 65 3c 69 53 65 63 74 6f 72 53 69 7a 65 20  age<iSectorSize 
136d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 44 65  ){.          nDe
136e0 66 61 75 6c 74 50 61 67 65 20 3d 20 69 53 65 63  faultPage = iSec
136f0 74 6f 72 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  torSize;.       
13700 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
13710 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
13720 52 49 54 45 0a 20 20 20 20 20 20 20 20 7b 0a 20  RITE.        {. 
13730 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 44 63           int iDc
13740 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69   = sqlite3OsDevi
13750 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
13760 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  s(pPager->fd);. 
13770 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 69 3b           int ii;
13780 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13790 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  t(SQLITE_IOCAP_A
137a0 54 4f 4d 49 43 35 31 32 3d 3d 28 35 31 32 3e 3e  TOMIC512==(512>>
137b0 38 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  8));.          a
137c0 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
137d0 41 50 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36  AP_ATOMIC64K==(6
137e0 35 35 33 36 3e 3e 38 29 29 3b 0a 20 20 20 20 20  5536>>8));.     
137f0 20 20 20 20 20 61 73 73 65 72 74 28 53 51 4c 49       assert(SQLI
13800 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50  TE_MAX_DEFAULT_P
13810 41 47 45 5f 53 49 5a 45 3c 3d 36 35 35 33 36 29  AGE_SIZE<=65536)
13820 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  ;.          for(
13830 69 69 3d 6e 44 65 66 61 75 6c 74 50 61 67 65 3b  ii=nDefaultPage;
13840 20 69 69 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f   ii<=SQLITE_MAX_
13850 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
13860 45 3b 20 69 69 3d 69 69 2a 32 29 7b 0a 20 20 20  E; ii=ii*2){.   
13870 20 20 20 20 20 20 20 20 20 69 66 28 20 69 44 63           if( iDc
13880 26 28 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 41  &(SQLITE_IOCAP_A
13890 54 4f 4d 49 43 7c 28 69 69 3e 3e 38 29 29 20 29  TOMIC|(ii>>8)) )
138a0 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
138b0 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ii;.          }.
138c0 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66          }.#endif
138d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e 44 65  .        if( nDe
138e0 66 61 75 6c 74 50 61 67 65 3e 53 51 4c 49 54 45  faultPage>SQLITE
138f0 5f 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47  _MAX_DEFAULT_PAG
13900 45 5f 53 49 5a 45 20 29 7b 0a 20 20 20 20 20 20  E_SIZE ){.      
13910 20 20 20 20 6e 44 65 66 61 75 6c 74 50 61 67 65      nDefaultPage
13920 20 3d 20 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45   = SQLITE_MAX_DE
13930 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
13940 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
13950 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
13960 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
13970 20 20 20 2f 2a 20 49 66 20 61 20 74 65 6d 70 6f     /* If a tempo
13980 72 61 72 79 20 66 69 6c 65 20 69 73 20 72 65 71  rary file is req
13990 75 65 73 74 65 64 2c 20 69 74 20 69 73 20 6e 6f  uested, it is no
139a0 74 20 6f 70 65 6e 65 64 20 69 6d 6d 65 64 69 61  t opened immedia
139b0 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 49 6e 20  tely..    ** In 
139c0 74 68 69 73 20 63 61 73 65 20 77 65 20 61 63 63  this case we acc
139d0 65 70 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  ept the default 
139e0 70 61 67 65 20 73 69 7a 65 20 61 6e 64 20 64 65  page size and de
139f0 6c 61 79 20 61 63 74 75 61 6c 6c 79 0a 20 20 20  lay actually.   
13a00 20 2a 2a 20 6f 70 65 6e 69 6e 67 20 74 68 65 20   ** opening the 
13a10 66 69 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 66  file until the f
13a20 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 4f 73 57  irst call to OsW
13a30 72 69 74 65 28 29 2e 0a 20 20 20 20 2a 2f 20 0a  rite()..    */ .
13a40 20 20 20 20 74 65 6d 70 46 69 6c 65 20 3d 20 31      tempFile = 1
13a50 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
13a60 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
13a70 55 53 49 56 45 3b 0a 20 20 7d 0a 0a 20 20 69 66  USIVE;.  }..  if
13a80 28 20 70 50 61 67 65 72 20 26 26 20 72 63 3d 3d  ( pPager && rc==
13a90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13aa0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
13ab0 63 65 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  ce = (char *)sql
13ac0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 44 65 66  ite3_malloc(nDef
13ad0 61 75 6c 74 50 61 67 65 29 3b 0a 20 20 7d 0a 0a  aultPage);.  }..
13ae0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
13af0 20 6f 63 63 75 72 65 64 20 69 6e 20 65 69 74 68   occured in eith
13b00 65 72 20 6f 66 20 74 68 65 20 62 6c 6f 63 6b 73  er of the blocks
13b10 20 61 62 6f 76 65 2e 0a 20 20 2a 2a 20 46 72 65   above..  ** Fre
13b20 65 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75  e the Pager stru
13b30 63 74 75 72 65 20 61 6e 64 20 63 6c 6f 73 65 20  cture and close 
13b40 74 68 65 20 66 69 6c 65 2e 0a 20 20 2a 2a 20 53  the file..  ** S
13b50 69 6e 63 65 20 74 68 65 20 70 61 67 65 72 20 69  ince the pager i
13b60 73 20 6e 6f 74 20 61 6c 6c 6f 63 61 74 65 64 20  s not allocated 
13b70 74 68 65 72 65 20 69 73 20 6e 6f 20 6e 65 65 64  there is no need
13b80 20 74 6f 20 73 65 74 20 0a 20 20 2a 2a 20 61 6e   to set .  ** an
13b90 79 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 20  y Pager.errMask 
13ba0 76 61 72 69 61 62 6c 65 73 2e 0a 20 20 2a 2f 0a  variables..  */.
13bb0 20 20 69 66 28 20 21 70 50 61 67 65 72 20 7c 7c    if( !pPager ||
13bc0 20 21 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70   !pPager->pTmpSp
13bd0 61 63 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ace ){.    sqlit
13be0 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67 65 72  e3OsClose(pPager
13bf0 2d 3e 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74  ->fd);.    sqlit
13c00 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 29 3b  e3_free(pPager);
13c10 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63  .    return ((rc
13c20 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51 4c  ==SQLITE_OK)?SQL
13c30 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a 20  ITE_NOMEM:rc);. 
13c40 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45   }..  PAGERTRACE
13c50 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
13c60 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 70  , FILEHANDLEID(p
13c70 50 61 67 65 72 2d 3e 66 64 29 2c 20 70 50 61 67  Pager->fd), pPag
13c80 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
13c90 20 20 49 4f 54 52 41 43 45 28 28 22 4f 50 45 4e    IOTRACE(("OPEN
13ca0 20 25 70 20 25 73 5c 6e 22 2c 20 70 50 61 67 65   %p %s\n", pPage
13cb0 72 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  r, pPager->zFile
13cc0 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a 20 46 69 6c  name))..  /* Fil
13cd0 6c 20 69 6e 20 50 61 67 65 72 2e 7a 44 69 72 65  l in Pager.zDire
13ce0 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20 20 6d 65 6d  ctory[] */.  mem
13cf0 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
13d00 65 63 74 6f 72 79 2c 20 70 50 61 67 65 72 2d 3e  ectory, pPager->
13d10 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68  zFilename, nPath
13d20 6e 61 6d 65 2b 31 29 3b 0a 20 20 66 6f 72 28 69  name+1);.  for(i
13d30 3d 73 74 72 6c 65 6e 28 70 50 61 67 65 72 2d 3e  =strlen(pPager->
13d40 7a 44 69 72 65 63 74 6f 72 79 29 3b 20 69 3e 30  zDirectory); i>0
13d50 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
13d60 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
13d70 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
13d80 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
13d90 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
13da0 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20  ;..  /* Fill in 
13db0 50 61 67 65 72 2e 7a 4a 6f 75 72 6e 61 6c 5b 5d  Pager.zJournal[]
13dc0 20 61 6e 64 20 50 61 67 65 72 2e 7a 53 74 6d 74   and Pager.zStmt
13dd0 4a 72 6e 6c 5b 5d 20 2a 2f 0a 20 20 6d 65 6d 63  Jrnl[] */.  memc
13de0 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
13df0 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69  nal, pPager->zFi
13e00 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d  lename, nPathnam
13e10 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50  e);.  memcpy(&pP
13e20 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e  ager->zJournal[n
13e30 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d 6a 6f 75  Pathname], "-jou
13e40 72 6e 61 6c 22 2c 20 39 29 3b 0a 20 20 6d 65 6d  rnal", 9);.  mem
13e50 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 53 74 6d  cpy(pPager->zStm
13e60 74 4a 72 6e 6c 2c 20 70 50 61 67 65 72 2d 3e 7a  tJrnl, pPager->z
13e70 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74 68 6e  Filename, nPathn
13e80 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26  ame);.  memcpy(&
13e90 70 50 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e  pPager->zStmtJrn
13ea0 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22 2d  l[nPathname], "-
13eb0 73 74 6d 74 6a 72 6e 6c 22 2c 20 31 30 29 3b 0a  stmtjrnl", 10);.
13ec0 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6a 6f  .  /* pPager->jo
13ed0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 20 2a  urnalOpen = 0; *
13ee0 2f 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  /.  pPager->useJ
13ef0 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72  ournal = useJour
13f00 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20  nal && !memDb;. 
13f10 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c   pPager->noReadl
13f20 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63 6b  ock = noReadlock
13f30 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20   && readOnly;.  
13f40 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  /* pPager->stmtO
13f50 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a  pen = 0; */.  /*
13f60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
13f70 73 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  se = 0; */.  /* 
13f80 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
13f90 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 64  ; */.  pPager->d
13fa0 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b  bSize = memDb-1;
13fb0 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  .  pPager->pageS
13fc0 69 7a 65 20 3d 20 6e 44 65 66 61 75 6c 74 50 61  ize = nDefaultPa
13fd0 67 65 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d  ge;.  /* pPager-
13fe0 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 20 2a  >stmtSize = 0; *
13ff0 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  /.  /* pPager->s
14000 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 20 2a 2f  tmtJSize = 0; */
14010 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 50  .  /* pPager->nP
14020 61 67 65 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  age = 0; */.  pP
14030 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
14040 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78  00;.  pPager->mx
14050 50 67 6e 6f 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Pgno = SQLITE_MA
14060 58 5f 50 41 47 45 5f 43 4f 55 4e 54 3b 0a 20 20  X_PAGE_COUNT;.  
14070 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  /* pPager->state
14080 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
14090 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
140a0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 3d 20 28  ager->state == (
140b0 74 65 6d 70 46 69 6c 65 20 3f 20 50 41 47 45 52  tempFile ? PAGER
140c0 5f 45 58 43 4c 55 53 49 56 45 20 3a 20 50 41 47  _EXCLUSIVE : PAG
140d0 45 52 5f 55 4e 4c 4f 43 4b 29 20 29 3b 0a 20 20  ER_UNLOCK) );.  
140e0 2f 2a 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  /* pPager->errMa
140f0 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  sk = 0; */.  pPa
14100 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
14110 74 65 6d 70 46 69 6c 65 3b 0a 20 20 61 73 73 65  tempFile;.  asse
14120 72 74 28 20 74 65 6d 70 46 69 6c 65 3d 3d 50 41  rt( tempFile==PA
14130 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
14140 4e 4f 52 4d 41 4c 20 0a 20 20 20 20 20 20 20 20  NORMAL .        
14150 20 20 7c 7c 20 74 65 6d 70 46 69 6c 65 3d 3d 50    || tempFile==P
14160 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
14170 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
14180 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
14190 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
141a0 49 56 45 3d 3d 31 20 29 3b 0a 20 20 70 50 61 67  IVE==1 );.  pPag
141b0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
141c0 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 20 0a 20  e = tempFile; . 
141d0 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d   pPager->memDb =
141e0 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72   memDb;.  pPager
141f0 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61  ->readOnly = rea
14200 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
14210 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
14220 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
14230 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e  oSync = pPager->
14240 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21 75 73 65  tempFile || !use
14250 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50 61 67 65  Journal;.  pPage
14260 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 28 70  r->fullSync = (p
14270 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a  Pager->noSync?0:
14280 31 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 79  1);.  pPager->sy
14290 6e 63 5f 66 6c 61 67 73 20 3d 20 53 51 4c 49 54  nc_flags = SQLIT
142a0 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 3b 0a 20  E_SYNC_NORMAL;. 
142b0 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
142c0 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20  st = 0; */.  /* 
142d0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
142e0 6e 63 65 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f  nced = 0; */.  /
142f0 2a 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20  * pPager->pLast 
14300 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  = 0; */.  pPager
14310 2d 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45  ->nExtra = FORCE
14320 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72  _ALIGNMENT(nExtr
14330 61 29 3b 0a 20 20 61 73 73 65 72 74 28 70 50 61  a);.  assert(pPa
14340 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
14350 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65 6d 70 46 69  s||memDb||tempFi
14360 6c 65 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d 44  le);.  if( !memD
14370 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63 74  b ){.    setSect
14380 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b 0a  orSize(pPager);.
14390 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d    }.  /* pPager-
143a0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
143b0 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73 65  0; */.  /* memse
143c0 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
143d0 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
143e0 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a 20  r->aHash)); */. 
143f0 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61 67   *ppPager = pPag
14400 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  er;.#ifdef SQLIT
14410 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
14420 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50 61  MANAGEMENT.  pPa
14430 67 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20  ger->iInUseMM = 
14440 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 69 49 6e  0;.  pPager->iIn
14450 55 73 65 44 42 20 3d 20 30 3b 0a 20 20 69 66 28  UseDB = 0;.  if(
14460 20 21 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73   !memDb ){.    s
14470 71 6c 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75  qlite3_mutex *mu
14480 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75  tex = sqlite3_mu
14490 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
144a0 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45  _MUTEX_STATIC_ME
144b0 4d 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  M2);.    sqlite3
144c0 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
144d0 65 78 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ex);.    pPager-
144e0 3e 70 4e 65 78 74 20 3d 20 73 71 6c 69 74 65 33  >pNext = sqlite3
144f0 50 61 67 65 72 4c 69 73 74 3b 0a 20 20 20 20 69  PagerList;.    i
14500 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  f( sqlite3PagerL
14510 69 73 74 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ist ){.      ass
14520 65 72 74 28 20 73 71 6c 69 74 65 33 50 61 67 65  ert( sqlite3Page
14530 72 4c 69 73 74 2d 3e 70 50 72 65 76 3d 3d 30 20  rList->pPrev==0 
14540 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
14550 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
14560 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 7d   = pPager;.    }
14570 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 50 72  .    pPager->pPr
14580 65 76 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  ev = 0;.    sqli
14590 74 65 33 50 61 67 65 72 4c 69 73 74 20 3d 20 70  te3PagerList = p
145a0 50 61 67 65 72 3b 0a 20 20 20 20 73 71 6c 69 74  Pager;.    sqlit
145b0 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d  e3_mutex_leave(m
145c0 75 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  utex);.  }.#endi
145d0 66 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  f.  return SQLIT
145e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
145f0 65 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64  et the busy hand
14600 6c 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f  ler function..*/
14610 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67  .void sqlite3Pag
14620 65 72 53 65 74 42 75 73 79 68 61 6e 64 6c 65 72  erSetBusyhandler
14630 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
14640 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
14650 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
14660 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
14670 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
14680 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
14690 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
146a0 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
146b0 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
146c0 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
146d0 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
146e0 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
146f0 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
14700 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
14710 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
14720 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
14730 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
14740 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
14750 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
14760 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
14770 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
14780 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
14790 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
147a0 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73 65  qlite3PagerClose
147b0 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63  ().  .** Destruc
147c0 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61  tors are only ca
147d0 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 50  lled by sqlite3P
147e0 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a 2f 0a  agerUnref()..*/.
147f0 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
14800 72 53 65 74 44 65 73 74 72 75 63 74 6f 72 28 50  rSetDestructor(P
14810 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
14820 69 64 20 28 2a 78 44 65 73 63 29 28 44 62 50 61  id (*xDesc)(DbPa
14830 67 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  ge*,int)){.  pPa
14840 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
14850 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
14860 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
14870 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
14880 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
14890 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
148a0 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
148b0 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
148c0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
148d0 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
148e0 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
148f0 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
14900 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
14910 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
14920 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
14930 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
14940 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
14950 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
14960 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
14970 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
14980 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
14990 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
149a0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 52  sqlite3PagerSetR
149b0 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
149c0 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
149d0 65 69 6e 69 74 29 28 44 62 50 61 67 65 2a 2c 69  einit)(DbPage*,i
149e0 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
149f0 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
14a00 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
14a10 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 20  t the page size 
14a20 74 6f 20 2a 70 50 61 67 65 53 69 7a 65 2e 20 49  to *pPageSize. I
14a30 66 20 74 68 65 20 73 75 67 67 65 73 74 20 6e 65  f the suggest ne
14a40 77 20 70 61 67 65 20 73 69 7a 65 20 69 73 0a 2a  w page size is.*
14a50 2a 20 69 6e 61 70 70 72 6f 70 72 69 61 74 65 2c  * inappropriate,
14a60 20 74 68 65 6e 20 61 6e 20 61 6c 74 65 72 6e 61   then an alterna
14a70 74 69 76 65 20 70 61 67 65 20 73 69 7a 65 20 69  tive page size i
14a80 73 20 73 65 74 20 74 6f 20 74 68 61 74 0a 2a 2a  s set to that.**
14a90 20 76 61 6c 75 65 20 62 65 66 6f 72 65 20 72 65   value before re
14aa0 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a 69 6e 74 20  turning..*/.int 
14ab0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 50  sqlite3PagerSetP
14ac0 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
14ad0 50 61 67 65 72 2c 20 75 31 36 20 2a 70 50 61 67  Pager, u16 *pPag
14ae0 65 53 69 7a 65 29 7b 0a 20 20 69 6e 74 20 72 63  eSize){.  int rc
14af0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
14b00 75 31 36 20 70 61 67 65 53 69 7a 65 20 3d 20 2a  u16 pageSize = *
14b10 70 50 61 67 65 53 69 7a 65 3b 0a 20 20 61 73 73  pPageSize;.  ass
14b20 65 72 74 28 20 70 61 67 65 53 69 7a 65 3d 3d 30  ert( pageSize==0
14b30 20 7c 7c 20 28 70 61 67 65 53 69 7a 65 3e 3d 35   || (pageSize>=5
14b40 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c 3d  12 && pageSize<=
14b50 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
14b60 53 49 5a 45 29 20 29 3b 0a 20 20 69 66 28 20 70  SIZE) );.  if( p
14b70 61 67 65 53 69 7a 65 20 26 26 20 70 61 67 65 53  ageSize && pageS
14b80 69 7a 65 21 3d 70 50 61 67 65 72 2d 3e 70 61 67  ize!=pPager->pag
14b90 65 53 69 7a 65 20 0a 20 20 20 26 26 20 21 70 50  eSize .   && !pP
14ba0 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26 20 70  ager->memDb && p
14bb0 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 0a  Pager->nRef==0 .
14bc0 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 70    ){.    char *p
14bd0 4e 65 77 20 3d 20 28 63 68 61 72 20 2a 29 73 71  New = (char *)sq
14be0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 61 67  lite3_malloc(pag
14bf0 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28 20  eSize);.    if( 
14c00 21 70 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 72  !pNew ){.      r
14c10 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
14c20 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14c30 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
14c40 61 67 65 72 29 3b 0a 20 20 20 20 20 20 70 61 67  ager);.      pag
14c50 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
14c60 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
14c70 70 61 67 65 53 69 7a 65 20 3d 20 70 61 67 65 53  pageSize = pageS
14c80 69 7a 65 3b 0a 20 20 20 20 20 20 73 65 74 53 65  ize;.      setSe
14c90 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29  ctorSize(pPager)
14ca0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
14cb0 66 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d  free(pPager->pTm
14cc0 70 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 70  pSpace);.      p
14cd0 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
14ce0 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20 70   = pNew;.      p
14cf0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
14d00 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a  );.    }.  }.  *
14d10 70 50 61 67 65 53 69 7a 65 20 3d 20 70 50 61 67  pPageSize = pPag
14d20 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
14d30 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14d40 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
14d50 6e 74 65 72 20 74 6f 20 74 68 65 20 22 74 65 6d  nter to the "tem
14d60 70 6f 72 61 72 79 20 70 61 67 65 22 20 62 75 66  porary page" buf
14d70 66 65 72 20 68 65 6c 64 20 69 6e 74 65 72 6e 61  fer held interna
14d80 6c 6c 79 0a 2a 2a 20 62 79 20 74 68 65 20 70 61  lly.** by the pa
14d90 67 65 72 2e 20 20 54 68 69 73 20 69 73 20 61 20  ger.  This is a 
14da0 62 75 66 66 65 72 20 74 68 61 74 20 69 73 20 62  buffer that is b
14db0 69 67 20 65 6e 6f 75 67 68 20 74 6f 20 68 6f 6c  ig enough to hol
14dc0 64 20 74 68 65 0a 2a 2a 20 65 6e 74 69 72 65 20  d the.** entire 
14dd0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 64 61 74  content of a dat
14de0 61 62 61 73 65 20 70 61 67 65 2e 20 20 54 68 69  abase page.  Thi
14df0 73 20 62 75 66 66 65 72 20 69 73 20 75 73 65 64  s buffer is used
14e00 20 69 6e 74 65 72 6e 61 6c 6c 79 0a 2a 2a 20 64   internally.** d
14e10 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 20 61  uring rollback a
14e20 6e 64 20 77 69 6c 6c 20 62 65 20 6f 76 65 72 77  nd will be overw
14e30 72 69 74 74 65 6e 20 77 68 65 6e 65 76 65 72 20  ritten whenever 
14e40 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6f 63  a rollback.** oc
14e50 63 75 72 73 2e 20 20 42 75 74 20 6f 74 68 65 72  curs.  But other
14e60 20 6d 6f 64 75 6c 65 73 20 61 72 65 20 66 72 65   modules are fre
14e70 65 20 74 6f 20 75 73 65 20 69 74 20 74 6f 6f 2c  e to use it too,
14e80 20 61 73 20 6c 6f 6e 67 20 61 73 0a 2a 2a 20 6e   as long as.** n
14e90 6f 20 72 6f 6c 6c 62 61 63 6b 73 20 61 72 65 20  o rollbacks are 
14ea0 68 61 70 70 65 6e 69 6e 67 2e 0a 2a 2f 0a 76 6f  happening..*/.vo
14eb0 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
14ec0 54 65 6d 70 53 70 61 63 65 28 50 61 67 65 72 20  TempSpace(Pager 
14ed0 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75  *pPager){.  retu
14ee0 72 6e 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53  rn pPager->pTmpS
14ef0 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  pace;.}../*.** A
14f00 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20 74 68  ttempt to set th
14f10 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61 62 61  e maximum databa
14f20 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20 69 66  se page count if
14f30 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73 69 74   mxPage is posit
14f40 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20 6e 6f  ive. .** Make no
14f50 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78 50 61   changes if mxPa
14f60 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20 6e 65  ge is zero or ne
14f70 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e 65 76  gative.  And nev
14f80 65 72 20 72 65 64 75 63 65 20 74 68 65 0a 2a 2a  er reduce the.**
14f90 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f   maximum page co
14fa0 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20 63 75  unt below the cu
14fb0 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20 74 68  rrent size of th
14fc0 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  e database..**.*
14fd0 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f 66 20  * Regardless of 
14fe0 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e 20 74  mxPage, return t
14ff0 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78 69 6d  he current maxim
15000 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a  um page count..*
15010 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
15020 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74 28 50  erMaxPageCount(P
15030 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
15040 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28  t mxPage){.  if(
15050 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20 20 20   mxPage>0 ){.   
15060 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20   pPager->mxPgno 
15070 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20  = mxPage;.  }.  
15080 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
15090 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20  count(pPager);. 
150a0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
150b0 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mxPgno;.}../*.**
150c0 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   The following s
150d0 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 61  et of routines a
150e0 72 65 20 75 73 65 64 20 74 6f 20 64 69 73 61 62  re used to disab
150f0 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74 65 64  le the simulated
15100 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20 6d 65  .** I/O error me
15110 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73 65 20  chanism.  These 
15120 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75 73 65  routines are use
15130 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d 75 6c  d to avoid simul
15140 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73 20 69  ated.** errors i
15150 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65 20 77  n places where w
15160 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 61 62  e do not care ab
15170 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a  out errors..**.*
15180 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c 49 54  * Unless -DSQLIT
15190 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73 65 64  E_TEST=1 is used
151a0 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e 65 73  , these routines
151b0 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70 73 0a   are all no-ops.
151c0 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74 65 20  ** and generate 
151d0 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 64  no code..*/.#ifd
151e0 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 65  ef SQLITE_TEST.e
151f0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
15200 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69  3_io_error_pendi
15210 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  ng;.extern int s
15220 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
15230 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  hit;.static int 
15240 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69 64 20  saved_cnt;.void 
15250 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
15260 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f 69 64  d_io_errors(void
15270 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74 20 3d  ){.  saved_cnt =
15280 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15290 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73 71 6c  r_pending;.  sql
152a0 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65  ite3_io_error_pe
152b0 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a 76 6f  nding = -1;.}.vo
152c0 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61  id enable_simula
152d0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
152e0 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  id){.  sqlite3_i
152f0 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
15300 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d 0a 23  = saved_cnt;.}.#
15310 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 64 69  else.# define di
15320 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
15330 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20 64 65  io_errors().# de
15340 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69 6d 75  fine enable_simu
15350 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
15360 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
15370 52 65 61 64 20 74 68 65 20 66 69 72 73 74 20 4e  Read the first N
15380 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68 65 20   bytes from the 
15390 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65  beginning of the
153a0 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d 6f 72   file into memor
153b0 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73 74 20  y.** that pDest 
153c0 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a 0a 2a  points to. .**.*
153d0 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b  * No error check
153e0 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54 68 65  ing is done. The
153f0 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20 74 68   rational for th
15400 69 73 20 69 73 20 74 68 61 74 20 74 68 69 73 20  is is that this 
15410 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d 61 79  function .** may
15420 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65 6e 20   be called even 
15430 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73  if the file does
15440 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 63 6f   not exist or co
15450 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72 2e 20  ntain a header. 
15460 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63 61 73  In .** these cas
15470 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64  es sqlite3OsRead
15480 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61  () will return a
15490 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68 69 63  n error, to whic
154a0 68 20 74 68 65 20 63 6f 72 72 65 63 74 20 0a 2a  h the correct .*
154b0 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20 74 6f  * response is to
154c0 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f 72 79   zero the memory
154d0 20 61 74 20 70 44 65 73 74 20 61 6e 64 20 63 6f   at pDest and co
154e0 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61 6c 20  ntinue.  A real 
154f0 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77 69 6c  IO error .** wil
15500 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72 65 63  l presumably rec
15510 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b 65 64  ur and be picked
15520 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64 6f 3a   up later (Todo:
15530 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69   Think about thi
15540 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  s)..*/.int sqlit
15550 65 33 50 61 67 65 72 52 65 61 64 46 69 6c 65 68  e3PagerReadFileh
15560 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61  eader(Pager *pPa
15570 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69  ger, int N, unsi
15580 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74  gned char *pDest
15590 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
155a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d 73 65  LITE_OK;.  memse
155b0 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29 3b 0a  t(pDest, 0, N);.
155c0 20 20 61 73 73 65 72 74 28 4d 45 4d 44 42 7c 7c    assert(MEMDB||
155d0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74  pPager->fd->pMet
155e0 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65  hods||pPager->te
155f0 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 70  mpFile);.  if( p
15600 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15610 6f 64 73 20 29 7b 0a 20 20 20 20 49 4f 54 52 41  ods ){.    IOTRA
15620 43 45 28 28 22 44 42 48 44 52 20 25 70 20 30 20  CE(("DBHDR %p 0 
15630 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 4e  %d\n", pPager, N
15640 29 29 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  )).    rc = sqli
15650 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
15660 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 2c 20  ->fd, pDest, N, 
15670 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  0);.    if( rc==
15680 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f  SQLITE_IOERR_SHO
15690 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20  RT_READ ){.     
156a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
156b0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
156c0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
156d0 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
156e0 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
156f0 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
15700 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
15710 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a 2a  th.** pPager. .*
15720 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e 44  *.** If the PEND
15730 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f 6e  ING_BYTE lies on
15740 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63 74   the page direct
15750 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e 64  ly after the end
15760 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65 2c   of the.** file,
15770 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20 74   then consider t
15780 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f 66  his page part of
15790 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20 46   the file too. F
157a0 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a 2a  or example, if.*
157b0 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 69  * PENDING_BYTE i
157c0 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68 65  s byte 4096 (the
157d0 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20 70   first byte of p
157e0 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20 73  age 5) and the s
157f0 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69  ize of the.** fi
15800 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65 73  le is 4096 bytes
15810 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64 20  , 5 is returned 
15820 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a 2f  instead of 4..*/
15830 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
15840 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72  rPagecount(Pager
15850 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
15860 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63   n = 0;.  int rc
15870 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
15880 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  er!=0 );.  if( p
15890 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
158a0 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
158b0 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
158c0 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20  ->dbSize>=0 ){. 
158d0 20 20 20 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64     n = pPager->d
158e0 62 53 69 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20  bSize;.  } else 
158f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 70 50 61  {.    assert(pPa
15900 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
15910 73 7c 7c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  s||pPager->tempF
15920 69 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ile);.    if( (p
15930 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68  Pager->fd->pMeth
15940 6f 64 73 29 0a 20 20 20 20 20 26 26 20 28 72 63  ods).     && (rc
15950 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
15960 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c  Size(pPager->fd,
15970 20 26 6e 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b   &n))!=SQLITE_OK
15980 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
15990 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
159a0 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
159b0 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 70  er, rc);.      p
159c0 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20  Pager->nRef--;. 
159d0 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
159e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30     }.    if( n>0
159f0 20 26 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61   && n<pPager->pa
15a00 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
15a10 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 1;.    }else
15a20 7b 0a 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61  {.      n /= pPa
15a30 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
15a40 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
15a50 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
15a60 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
15a70 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
15a80 20 3d 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = n;.    }.  }.
15a90 20 20 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e    if( n==(PENDIN
15aa0 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70  G_BYTE/pPager->p
15ab0 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
15ac0 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e  n++;.  }.  if( n
15ad0 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20  >pPager->mxPgno 
15ae0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  ){.    pPager->m
15af0 78 50 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20  xPgno = n;.  }. 
15b00 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23   return n;.}...#
15b10 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
15b20 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a  IT_MEMORYDB./*.*
15b30 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73 74  * Clear a PgHist
15b40 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61  ory block.*/.sta
15b50 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69  tic void clearHi
15b60 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20  story(PgHistory 
15b70 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74  *pHist){.  sqlit
15b80 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70  e3_free(pHist->p
15b90 4f 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 33  Orig);.  sqlite3
15ba0 5f 66 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74  _free(pHist->pSt
15bb0 6d 74 29 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f  mt);.  pHist->pO
15bc0 72 69 67 20 3d 20 30 3b 0a 20 20 70 48 69 73 74  rig = 0;.  pHist
15bd0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 23  ->pStmt = 0;.}.#
15be0 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 63 6c 65  else.#define cle
15bf0 61 72 48 69 73 74 6f 72 79 28 78 29 0a 23 65 6e  arHistory(x).#en
15c00 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61  dif../*.** Forwa
15c10 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a  rd declaration.*
15c20 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e  /.static int syn
15c30 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29  cJournal(Pager*)
15c40 3b 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  ;../*.** Unlink 
15c50 70 50 67 20 66 72 6f 6d 20 69 74 73 20 68 61 73  pPg from its has
15c60 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65  h chain. Also se
15c70 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
15c80 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61  r to 0 to indica
15c90 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  te.** that the p
15ca0 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20  age is not part 
15cb0 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69  of any hash chai
15cc0 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69  n. This is requi
15cd0 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a  red because the.
15ce0 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 4d  ** sqlite3PagerM
15cf0 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
15d00 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
15d10 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
15d20 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
15d30 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
15d40 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
15d50 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
15d60 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
15d70 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
15d80 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
15d90 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
15da0 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
15db0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
15dc0 4e 65 78 74 48 61 73 68 3d 3d 30 20 26 26 20 70  NextHash==0 && p
15dd0 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  Pg->pPrevHash==0
15de0 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   );.    return;.
15df0 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
15e00 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
15e10 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
15e20 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d  pPrevHash = pPg-
15e30 3e 70 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a  >pPrevHash;.  }.
15e40 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
15e50 48 61 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65  Hash ){.    asse
15e60 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
15e70 68 5b 70 50 67 2d 3e 70 67 6e 6f 20 26 20 28 70  h[pPg->pgno & (p
15e80 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 5d  Pager->nHash-1)]
15e90 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  !=pPg );.    pPg
15ea0 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65  ->pPrevHash->pNe
15eb0 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e  xtHash = pPg->pN
15ec0 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65  extHash;.  }else
15ed0 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 50  {.    int h = pP
15ee0 67 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65  g->pgno & (pPage
15ef0 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 20  r->nHash-1);.   
15f00 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
15f10 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
15f20 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45  sh;.  }.  if( ME
15f30 4d 44 42 20 29 7b 0a 20 20 20 20 63 6c 65 61 72  MDB ){.    clear
15f40 48 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f  History(PGHDR_TO
15f50 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
15f60 72 29 29 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  r));.  }.  pPg->
15f70 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
15f80 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
15f90 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
15fa0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
15fb0 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
15fc0 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
15fd0 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
15fe0 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
15ff0 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
16000 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
16010 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
16020 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
16030 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
16040 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16050 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
16060 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 66  /* Unlink from f
16070 72 65 65 20 70 61 67 65 20 6c 69 73 74 20 2a 2f  ree page list */
16080 0a 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65  .  lruListRemove
16090 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  (pPg);..  /* Unl
160a0 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
160b0 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
160c0 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
160d0 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
160e0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
160f0 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
16100 20 74 72 75 6e 63 61 74 65 20 74 68 65 20 63 61   truncate the ca
16110 63 68 65 20 77 68 65 6e 20 61 20 64 61 74 61 62  che when a datab
16120 61 73 65 0a 2a 2a 20 69 73 20 74 72 75 6e 63 61  ase.** is trunca
16130 74 65 64 2e 20 20 44 72 6f 70 20 66 72 6f 6d 20  ted.  Drop from 
16140 74 68 65 20 63 61 63 68 65 20 61 6c 6c 20 70 61  the cache all pa
16150 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20 69  ges whose pgno i
16160 73 0a 2a 2a 20 6c 61 72 67 65 72 20 74 68 61 6e  s.** larger than
16170 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16180 61 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e  and is unreferen
16190 63 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 66 65 72  ced..**.** Refer
161a0 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
161b0 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
161c0 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
161d0 64 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c 6c  d..**.** Actuall
161e0 79 2c 20 61 74 20 74 68 65 20 70 6f 69 6e 74 20  y, at the point 
161f0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16200 63 61 6c 6c 65 64 2c 20 69 74 20 77 6f 75 6c 64  called, it would
16210 20 62 65 0a 2a 2a 20 61 6e 20 65 72 72 6f 72 20   be.** an error 
16220 74 6f 20 68 61 76 65 20 61 20 72 65 66 65 72 65  to have a refere
16230 6e 63 65 64 20 70 61 67 65 2e 20 20 42 75 74 20  nced page.  But 
16240 72 61 74 68 65 72 20 74 68 61 6e 20 64 65 6c 65  rather than dele
16250 74 65 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  te.** that page 
16260 61 6e 64 20 67 75 61 72 61 6e 74 65 65 20 61 20  and guarantee a 
16270 73 75 62 73 65 71 75 65 6e 74 20 73 65 67 66 61  subsequent segfa
16280 75 6c 74 2c 20 69 74 20 73 65 65 6d 73 20 62 65  ult, it seems be
16290 74 74 65 72 0a 2a 2a 20 74 6f 20 7a 65 72 6f 20  tter.** to zero 
162a0 69 74 20 61 6e 64 20 68 6f 70 65 20 74 68 61 74  it and hope that
162b0 20 77 65 20 65 72 72 6f 72 20 6f 75 74 20 73 61   we error out sa
162c0 6e 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nely..*/.static 
162d0 76 6f 69 64 20 70 61 67 65 72 5f 74 72 75 6e 63  void pager_trunc
162e0 61 74 65 5f 63 61 63 68 65 28 50 61 67 65 72 20  ate_cache(Pager 
162f0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
16300 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64 72 20  r *pPg;.  PgHdr 
16310 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20 64 62  **ppPg;.  int db
16320 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
16330 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d  bSize;..  ppPg =
16340 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a   &pPager->pAll;.
16350 20 20 77 68 69 6c 65 28 20 28 70 50 67 20 3d 20    while( (pPg = 
16360 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20 20 20  *ppPg)!=0 ){.   
16370 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d   if( pPg->pgno<=
16380 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  dbSize ){.      
16390 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65  ppPg = &pPg->pNe
163a0 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65  xtAll;.    }else
163b0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30   if( pPg->nRef>0
163c0 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
163d0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
163e0 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
163f0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
16400 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e   ppPg = &pPg->pN
16410 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73  extAll;.    }els
16420 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67 20 3d  e{.      *ppPg =
16430 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a   pPg->pNextAll;.
16440 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
16450 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e 22 2c  PGFREE %p %d\n",
16460 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67   pPager, pPg->pg
16470 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50 41 47 45  no));.      PAGE
16480 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
16490 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
164a0 74 29 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b  t);.      unlink
164b0 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
164c0 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
164d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
164e0 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
164f0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
16500 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
16510 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74 61 69  .** Try to obtai
16520 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20 66 69  n a lock on a fi
16530 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68 65 20  le.  Invoke the 
16540 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 69 66  busy callback if
16550 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20   the lock.** is 
16560 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20 61 76  currently not av
16570 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65 61 74  ailable.  Repeat
16580 20 75 6e 74 69 6c 20 74 68 65 20 62 75 73 79 20   until the busy 
16590 63 61 6c 6c 62 61 63 6b 20 72 65 74 75 72 6e 73  callback returns
165a0 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20 75 6e 74  .** false or unt
165b0 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73 75 63 63  il the lock succ
165c0 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  eeds..**.** Retu
165d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20  rn SQLITE_OK on 
165e0 73 75 63 63 65 73 73 20 61 6e 64 20 61 6e 20 65  success and an e
165f0 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
16600 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a  cannot obtain.**
16610 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74   the lock..*/.st
16620 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77  atic int pager_w
16630 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65  ait_on_lock(Page
16640 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
16650 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69 6e 74 20  ocktype){.  int 
16660 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 4f 53  rc;..  /* The OS
16670 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 6d 75 73   lock values mus
16680 74 20 62 65 20 74 68 65 20 73 61 6d 65 20 61 73  t be the same as
16690 20 74 68 65 20 50 61 67 65 72 20 6c 6f 63 6b 20   the Pager lock 
166a0 76 61 6c 75 65 73 20 2a 2f 0a 20 20 61 73 73 65  values */.  asse
166b0 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
166c0 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
166d0 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
166e0 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
166f0 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
16700 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
16710 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
16720 5f 4c 4f 43 4b 20 29 3b 0a 0a 20 20 2f 2a 20 49  _LOCK );..  /* I
16730 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 75  f the file is cu
16740 72 72 65 6e 74 6c 79 20 75 6e 6c 6f 63 6b 65 64  rrently unlocked
16750 20 74 68 65 6e 20 74 68 65 20 73 69 7a 65 20 6d   then the size m
16760 75 73 74 20 62 65 20 75 6e 6b 6e 6f 77 6e 20 2a  ust be unknown *
16770 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  /.  assert( pPag
16780 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
16790 5f 53 48 41 52 45 44 20 7c 7c 20 70 50 61 67 65  _SHARED || pPage
167a0 72 2d 3e 64 62 53 69 7a 65 3c 30 20 7c 7c 20 4d  r->dbSize<0 || M
167b0 45 4d 44 42 20 29 3b 0a 0a 20 20 69 66 28 20 70  EMDB );..  if( p
167c0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
167d0 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
167e0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
167f0 7d 65 6c 73 65 7b 0a 20 20 20 20 64 6f 20 7b 0a  }else{.    do {.
16800 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
16810 65 33 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d  e3OsLock(pPager-
16820 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b 0a  >fd, locktype);.
16830 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d 3d      }while( rc==
16840 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20 73  SQLITE_BUSY && s
16850 71 6c 69 74 65 33 49 6e 76 6f 6b 65 42 75 73 79  qlite3InvokeBusy
16860 48 61 6e 64 6c 65 72 28 70 50 61 67 65 72 2d 3e  Handler(pPager->
16870 70 42 75 73 79 48 61 6e 64 6c 65 72 29 20 29 3b  pBusyHandler) );
16880 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
16890 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
168a0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
168b0 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 20 20  locktype;.      
168c0 49 4f 54 52 41 43 45 28 28 22 4c 4f 43 4b 20 25  IOTRACE(("LOCK %
168d0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
168e0 20 6c 6f 63 6b 74 79 70 65 29 29 0a 20 20 20 20   locktype)).    
168f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
16900 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
16910 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
16920 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
16930 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
16940 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
16950 67 65 72 54 72 75 6e 63 61 74 65 28 50 61 67 65  gerTruncate(Page
16960 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
16970 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
16980 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
16990 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
169a0 5f 53 48 41 52 45 44 20 7c 7c 20 4d 45 4d 44 42  _SHARED || MEMDB
169b0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
169c0 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
169d0 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
169e0 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20  r->errCode ){.  
169f0 20 20 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65    rc = pPager->e
16a00 72 72 43 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  rrCode;.    retu
16a10 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28  rn rc;.  }.  if(
16a20 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65   nPage>=(unsigne
16a30 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  d)pPager->dbSize
16a40 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
16a50 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20  QLITE_OK;.  }.  
16a60 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16a70 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
16a80 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61 67  = nPage;.    pag
16a90 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
16aa0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
16ab0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
16ac0 0a 20 20 7d 0a 20 20 70 61 67 65 72 45 6e 74 65  .  }.  pagerEnte
16ad0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20  r(pPager);.  rc 
16ae0 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
16af0 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65  ager);.  pagerLe
16b00 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ave(pPager);.  i
16b10 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16b20 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
16b30 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
16b40 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
16b50 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
16b60 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
16b70 74 69 6e 67 2e 20 2a 2f 0a 20 20 70 61 67 65 72  ting. */.  pager
16b80 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
16b90 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
16ba0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
16bb0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
16bc0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
16bd0 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63  Pager);.  if( rc
16be0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
16bf0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16c00 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
16c10 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
16c20 20 6e 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72   nPage);.  retur
16c30 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
16c40 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
16c50 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
16c60 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
16c70 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
16c80 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
16c90 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
16ca0 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
16cb0 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
16cc0 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
16cd0 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
16ce0 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
16cf0 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
16d00 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
16d10 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
16d20 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
16d30 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
16d40 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
16d50 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
16d60 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
16d70 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
16d80 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
16d90 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
16da0 63 6f 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20  coredump..**.** 
16db0 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c  This function al
16dc0 77 61 79 73 20 73 75 63 63 65 65 64 73 2e 20 49  ways succeeds. I
16dd0 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
16de0 69 73 20 61 63 74 69 76 65 20 61 6e 20 61 74 74  is active an att
16df0 65 6d 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20  empt.** is made 
16e00 74 6f 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e  to roll it back.
16e10 20 49 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63   If an error occ
16e20 75 72 73 20 64 75 72 69 6e 67 20 74 68 65 20 72  urs during the r
16e30 6f 6c 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f  ollback .** a ho
16e40 74 20 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65  t journal may be
16e50 20 6c 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c   left in the fil
16e60 65 73 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65  esystem but no e
16e70 72 72 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64  rror is returned
16e80 0a 2a 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65  .** to the calle
16e90 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  r..*/.int sqlite
16ea0 33 50 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65  3PagerClose(Page
16eb0 72 20 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64  r *pPager){.#ifd
16ec0 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
16ed0 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
16ee0 4e 54 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  NT.  if( !MEMDB 
16ef0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  ){.    sqlite3_m
16f00 75 74 65 78 20 2a 6d 75 74 65 78 20 3d 20 73 71  utex *mutex = sq
16f10 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
16f20 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
16f30 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a 20 20 20  TATIC_MEM2);.   
16f40 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 65   sqlite3_mutex_e
16f50 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 20 20 20  nter(mutex);.   
16f60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70 50 72   if( pPager->pPr
16f70 65 76 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  ev ){.      pPag
16f80 65 72 2d 3e 70 50 72 65 76 2d 3e 70 4e 65 78 74  er->pPrev->pNext
16f90 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74   = pPager->pNext
16fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
16fb0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c     sqlite3PagerL
16fc0 69 73 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 4e  ist = pPager->pN
16fd0 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ext;.    }.    i
16fe0 66 28 20 70 50 61 67 65 72 2d 3e 70 4e 65 78 74  f( pPager->pNext
16ff0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
17000 2d 3e 70 4e 65 78 74 2d 3e 70 50 72 65 76 20 3d  ->pNext->pPrev =
17010 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 3b 0a   pPager->pPrev;.
17020 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
17030 33 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 6d 75  3_mutex_leave(mu
17040 74 65 78 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  tex);.  }.#endif
17050 0a 0a 20 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  ..  disable_simu
17060 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
17070 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72  );.  pPager->err
17080 43 6f 64 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Code = 0;.  pPag
17090 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
170a0 65 20 3d 20 30 3b 0a 20 20 70 61 67 65 72 5f 72  e = 0;.  pager_r
170b0 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20  eset(pPager);.  
170c0 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
170d0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
170e0 20 20 65 6e 61 62 6c 65 5f 73 69 6d 75 6c 61 74    enable_simulat
170f0 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a  ed_io_errors();.
17100 20 20 50 41 47 45 52 54 52 41 43 45 32 28 22 43    PAGERTRACE2("C
17110 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
17120 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
17130 49 4f 54 52 41 43 45 28 28 22 43 4c 4f 53 45 20  IOTRACE(("CLOSE 
17140 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
17150 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
17160 2d 3e 65 72 72 43 6f 64 65 20 7c 7c 20 28 70 50  ->errCode || (pP
17170 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17180 6e 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  n==0 && pPager->
17190 73 74 6d 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a  stmtOpen==0) );.
171a0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
171b0 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
171c0 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
171d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
171e0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
171f0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
17200 6e 61 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67  nal);.  if( pPag
17210 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
17220 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
17230 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29  se(pPager->stfd)
17240 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f  ;.  }.  sqlite3O
17250 73 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66  sClose(pPager->f
17260 64 29 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69  d);.  /* Temp fi
17270 6c 65 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69  les are automati
17280 63 61 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79  cally deleted by
17290 20 74 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28   the OS.  ** if(
172a0 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
172b0 65 20 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69  e ){.  **   sqli
172c0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
172d0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  er->zFilename);.
172e0 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73    ** }.  */..  s
172f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
17300 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71  er->aHash);.  sq
17310 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
17320 72 2d 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20  r->pTmpSpace);. 
17330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
17340 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
17350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69  SQLITE_OK;.}..#i
17360 66 20 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55  f !defined(NDEBU
17370 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
17380 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
17390 20 52 65 74 75 72 6e 20 74 68 65 20 70 61 67 65   Return the page
173a0 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
173b0 67 69 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e  given page data.
173c0 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33  .*/.Pgno sqlite3
173d0 50 61 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28  PagerPagenumber(
173e0 44 62 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65  DbPage *p){.  re
173f0 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a  turn p->pgno;.}.
17400 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
17410 65 20 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e  e page_ref() fun
17420 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73  ction increments
17430 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
17440 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e  ount for a page.
17450 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 20  .** If the page 
17460 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
17470 74 68 65 20 66 72 65 65 6c 69 73 74 20 28 74 68  the freelist (th
17480 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
17490 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a  t is zero) then.
174a0 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f  ** remove it fro
174b0 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a  m the freelist..
174c0 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65  **.** For non-te
174d0 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65  st systems, page
174e0 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61 63 72  _ref() is a macr
174f0 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61  o that calls _pa
17500 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69  ge_ref().** onli
17510 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ne of the refere
17520 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
17530 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73 79 73  o.  For test sys
17540 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
17550 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75  .** is a real fu
17560 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77  nction so that w
17570 65 20 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70  e can set breakp
17580 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20  oints and trace 
17590 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  it..*/.static vo
175a0 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48  id _page_ref(PgH
175b0 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
175c0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
175d0 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20      /* The page 
175e0 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20  is currently on 
175f0 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52  the freelist.  R
17600 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20  emove it. */.   
17610 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70   lruListRemove(p
17620 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  Pg);.    pPg->pP
17630 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  ager->nRef++;.  
17640 7d 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b  }.  pPg->nRef++;
17650 0a 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  .}.#ifdef SQLITE
17660 5f 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20  _DEBUG.  static 
17670 76 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67  void page_ref(Pg
17680 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69  Hdr *pPg){.    i
17690 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
176a0 29 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72  ){.      _page_r
176b0 65 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c  ef(pPg);.    }el
176c0 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  se{.      pPg->n
176d0 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d  Ref++;.    }.  }
176e0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
176f0 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
17700 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
17710 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
17720 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
17730 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
17740 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
17750 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
17760 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
17770 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
17780 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
17790 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
177a0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65  t sqlite3PagerRe
177b0 66 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  f(DbPage *pPg){.
177c0 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 67    pagerEnter(pPg
177d0 2d 3e 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67  ->pPager);.  pag
177e0 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 70 61  e_ref(pPg);.  pa
177f0 67 65 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50  gerLeave(pPg->pP
17800 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
17810 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
17820 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
17830 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
17840 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
17850 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
17860 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
17870 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
17880 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
17890 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
178a0 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
178b0 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
178c0 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
178d0 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
178e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
178f0 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
17900 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
17910 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
17920 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
17930 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
17940 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
17950 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
17960 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
17970 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
17980 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
17990 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
179a0 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
179b0 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
179c0 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
179d0 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
179e0 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
179f0 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
17a00 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
17a10 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
17a20 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
17a30 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
17a40 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
17a50 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
17a60 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
17a70 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
17a80 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
17a90 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
17aa0 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
17ab0 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
17ac0 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
17ad0 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
17ae0 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
17af0 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
17b00 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
17b10 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
17b20 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
17b30 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
17b40 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
17b50 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
17b60 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
17b70 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
17b80 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
17b90 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
17ba0 75 72 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20  ure, so no sync 
17bb0 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  occurs..**.** If
17bc0 20 74 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45   the IOCAP_SEQUE
17bd0 4e 54 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65  NTIAL flag is se
17be0 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73  t for the persis
17bf0 74 65 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68  tent media on wh
17c00 69 63 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62  ich.** the datab
17c10 61 73 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74  ase is stored, t
17c20 68 65 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20  hen OsSync() is 
17c30 6e 65 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20  never called on 
17c40 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
17c50 69 6c 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ile. In this cas
17c60 65 20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65  e all that is re
17c70 71 75 69 72 65 64 20 69 73 20 74 6f 20 75 70 64  quired is to upd
17c80 61 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65  ate the nRec fie
17c90 6c 64 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75  ld in.** the jou
17ca0 72 6e 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a  rnal header..**.
17cb0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
17cc0 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64 53  clears the needS
17cd0 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65  ync field of eve
17ce0 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74 20  ry page current 
17cf0 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72  held in.** memor
17d00 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
17d10 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67   syncJournal(Pag
17d20 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
17d30 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
17d40 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
17d50 0a 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ...  /* Sync the
17d60 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
17d70 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
17d80 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
17d90 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
17da0 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
17db0 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
17dc0 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
17dd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
17de0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
17df0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
17e00 6c 65 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  le ){.      int 
17e10 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44  iDc = sqlite3OsD
17e20 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69 73  eviceCharacteris
17e30 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29  tics(pPager->fd)
17e40 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
17e50 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
17e60 70 65 6e 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pen );..      /*
17e70 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
17e80 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e  ->noSync ); // n
17e90 6f 53 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73  oSync might be s
17ea0 65 74 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75  et if synchronou
17eb0 73 0a 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74  s.      ** was t
17ec0 75 72 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20  urned off after 
17ed0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
17ee0 77 61 73 20 73 74 61 72 74 65 64 2e 20 20 54 69  was started.  Ti
17ef0 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66  cket #615 */.#if
17f00 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
17f10 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d    {.        /* M
17f20 61 6b 65 20 73 75 72 65 20 74 68 65 20 70 50 61  ake sure the pPa
17f30 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65  ger->nRec counte
17f40 72 20 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67  r we are keeping
17f50 20 61 67 72 65 65 73 0a 20 20 20 20 20 20 20 20   agrees.        
17f60 2a 2a 20 77 69 74 68 20 74 68 65 20 6e 52 65 63  ** with the nRec
17f70 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74   computed from t
17f80 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
17f90 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
17fa0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
17fb0 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20  i64 jSz;.       
17fc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
17fd0 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
17fe0 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20  jfd, &jSz);.    
17ff0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
18000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
18010 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
18020 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a  r->journalOff==j
18030 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65  Sz );.      }.#e
18040 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 30  ndif.      if( 0
18050 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
18060 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29  CAP_SAFE_APPEND)
18070 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57   ){.        /* W
18080 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
18090 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
180a0 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
180b0 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
180c0 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
180d0 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
180e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
180f0 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
18100 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
18110 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
18120 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
18130 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
18140 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
18150 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
18160 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
18170 72 6f 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20  rollback..      
18180 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
18190 54 68 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75  This is not requ
181a0 69 72 65 64 20 69 66 20 74 68 65 20 70 65 72 73  ired if the pers
181b0 69 73 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70  istent media sup
181c0 70 6f 72 74 73 20 74 68 65 0a 20 20 20 20 20 20  ports the.      
181d0 20 20 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44    ** SAFE_APPEND
181e0 20 70 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75   property. Becau
181f0 73 65 20 69 6e 20 74 68 69 73 20 63 61 73 65 20  se in this case 
18200 69 74 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  it is not possib
18210 6c 65 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66  le .        ** f
18220 6f 72 20 67 61 72 62 61 67 65 20 64 61 74 61 20  or garbage data 
18230 74 6f 20 62 65 20 61 70 70 65 6e 64 65 64 20 74  to be appended t
18240 6f 20 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20  o the file, the 
18250 6e 52 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20  nRec field.     
18260 20 20 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74     ** is populat
18270 65 64 20 77 69 74 68 20 30 78 46 46 46 46 46 46  ed with 0xFFFFFF
18280 46 46 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72  FF when the jour
18290 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 77 72  nal header is wr
182a0 69 74 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a  itten.        **
182b0 20 61 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73   and never needs
182c0 20 74 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a   to be updated..
182d0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
182e0 20 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a     i64 jrnlOff;.
182f0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
18300 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20  er->fullSync && 
18310 30 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49  0==(iDc&SQLITE_I
18320 4f 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29  OCAP_SEQUENTIAL)
18330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41   ){.          PA
18340 47 45 52 54 52 41 43 45 32 28 22 53 59 4e 43 20  GERTRACE2("SYNC 
18350 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
18360 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18370 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f  ));.          IO
18380 54 52 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70  TRACE(("JSYNC %p
18390 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20  \n", pPager)).  
183a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
183b0 69 74 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65  ite3OsSync(pPage
183c0 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
183d0 73 79 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20  sync_flags);.   
183e0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
183f0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
18400 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
18410 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65   jrnlOff = pPage
18420 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20  r->journalHdr + 
18430 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d  sizeof(aJournalM
18440 61 67 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49  agic);.        I
18450 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20 25 70  OTRACE(("JHDR %p
18460 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61   %lld %d\n", pPa
18470 67 65 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29  ger, jrnlOff, 4)
18480 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
18490 77 72 69 74 65 33 32 62 69 74 73 28 70 50 61 67  write32bits(pPag
184a0 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66  er->jfd, jrnlOff
184b0 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b  , pPager->nRec);
184c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20  .        if( rc 
184d0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
184e0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30     }.      if( 0
184f0 3d 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f  ==(iDc&SQLITE_IO
18500 43 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20  CAP_SEQUENTIAL) 
18510 29 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52  ){.        PAGER
18520 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
18530 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
18540 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
18550 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
18560 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20  (("JSYNC %p\n", 
18570 70 50 61 67 65 72 29 29 0a 20 20 20 20 20 20 20  pPager)).       
18580 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
18590 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ync(pPager->jfd,
185a0 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
185b0 61 67 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20  ags| .          
185c0 28 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c  (pPager->sync_fl
185d0 61 67 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43  ags==SQLITE_SYNC
185e0 5f 46 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e  _FULL?SQLITE_SYN
185f0 43 5f 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20  C_DATAONLY:0).  
18600 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
18610 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
18620 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
18630 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
18640 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
18650 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
18660 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
18670 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
18680 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
18690 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
186a0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
186b0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
186c0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
186d0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
186e0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
186f0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
18700 6c 72 75 4c 69 73 74 53 65 74 46 69 72 73 74 53  lruListSetFirstS
18710 79 6e 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20  ynced(pPager);. 
18720 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42   }..#ifndef NDEB
18730 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50  UG.  /* If the P
18740 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
18750 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e  ag is clear then
18760 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
18770 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75  ync.  ** flag mu
18780 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72  st also be clear
18790 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20   for all pages. 
187a0 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69   Verify that thi
187b0 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74  s.  ** invariant
187c0 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20   is true..  */. 
187d0 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70   else{.    for(p
187e0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
187f0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
18800 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
18810 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
18820 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
18830 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
18840 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
18850 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e  Synced==pPager->
18860 6c 72 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20  lru.pFirst );.  
18870 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
18880 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18890 4d 65 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20  Merge two lists 
188a0 6f 66 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74  of pages connect
188b0 65 64 20 62 79 20 70 44 69 72 74 79 20 61 6e 64  ed by pDirty and
188c0 20 69 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a   in pgno order..
188d0 2a 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66  ** Do not both f
188e0 69 78 69 6e 67 20 74 68 65 20 70 50 72 65 76 44  ixing the pPrevD
188f0 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a  irty pointers..*
18900 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a  /.static PgHdr *
18910 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50  merge_pagelist(P
18920 67 48 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20  gHdr *pA, PgHdr 
18930 2a 70 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65  *pB){.  PgHdr re
18940 73 75 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20  sult, *pTail;.  
18950 70 54 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b  pTail = &result;
18960 0a 20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20  .  while( pA && 
18970 70 42 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41  pB ){.    if( pA
18980 2d 3e 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20  ->pgno<pB->pgno 
18990 29 7b 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e  ){.      pTail->
189a0 70 44 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20  pDirty = pA;.   
189b0 20 20 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20     pTail = pA;. 
189c0 20 20 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44       pA = pA->pD
189d0 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
189e0 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
189f0 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20  irty = pB;.     
18a00 20 70 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20   pTail = pB;.   
18a10 20 20 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72     pB = pB->pDir
18a20 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ty;.    }.  }.  
18a30 69 66 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54  if( pA ){.    pT
18a40 61 69 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41  ail->pDirty = pA
18a50 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42  ;.  }else if( pB
18a60 20 29 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70   ){.    pTail->p
18a70 44 69 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65  Dirty = pB;.  }e
18a80 6c 73 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e  lse{.    pTail->
18a90 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  pDirty = 0;.  }.
18aa0 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e    return result.
18ab0 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  pDirty;.}../*.**
18ac0 20 53 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f   Sort the list o
18ad0 66 20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e  f pages in accen
18ae0 64 69 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67  ding order by pg
18af0 6e 6f 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a  no.  Pages are.*
18b00 2a 20 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70  * connected by p
18b10 44 69 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20  Dirty pointers. 
18b20 20 54 68 65 20 70 50 72 65 76 44 69 72 74 79 20   The pPrevDirty 
18b30 70 6f 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20  pointers are.** 
18b40 63 6f 72 72 75 70 74 65 64 20 62 79 20 74 68 69  corrupted by thi
18b50 73 20 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69  s sort..*/.#defi
18b60 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  ne N_SORT_BUCKET
18b70 5f 41 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e  _ALLOC 25.#defin
18b80 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
18b90 20 20 20 20 20 20 32 35 0a 23 69 66 64 65 66 20        25.#ifdef 
18ba0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e  SQLITE_TEST.  in
18bb0 74 20 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t sqlite3_pager_
18bc0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20  n_sort_bucket = 
18bd0 30 3b 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f  0;.  #undef N_SO
18be0 52 54 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66  RT_BUCKET.  #def
18bf0 69 6e 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45  ine N_SORT_BUCKE
18c00 54 20 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f  T \.   (sqlite3_
18c10 70 61 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63  pager_n_sort_buc
18c20 6b 65 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65  ket?sqlite3_page
18c30 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a  r_n_sort_bucket:
18c40 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
18c50 4c 4f 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74  LOC).#endif.stat
18c60 69 63 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70  ic PgHdr *sort_p
18c70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
18c80 49 6e 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b  In){.  PgHdr *a[
18c90 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c  N_SORT_BUCKET_AL
18ca0 4c 4f 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20  LOC], *p;.  int 
18cb0 69 3b 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30  i;.  memset(a, 0
18cc0 2c 20 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20  , sizeof(a));.  
18cd0 77 68 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20  while( pIn ){.  
18ce0 20 20 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70    p = pIn;.    p
18cf0 49 6e 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a  In = p->pDirty;.
18d00 20 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20      p->pDirty = 
18d10 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
18d20 69 3c 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d  i<N_SORT_BUCKET-
18d30 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  1; i++){.      i
18d40 66 28 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20  f( a[i]==0 ){.  
18d50 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a        a[i] = p;.
18d60 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
18d70 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
18d80 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61      p = merge_pa
18d90 67 65 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b  gelist(a[i], p);
18da0 0a 20 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  .        a[i] = 
18db0 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
18dc0 0a 20 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f  .    if( i==N_SO
18dd0 52 54 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20  RT_BUCKET-1 ){. 
18de0 20 20 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65       /* Coverage
18df0 3a 20 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74  : To get here, t
18e00 68 65 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20  here need to be 
18e10 32 5e 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54  2^(N_SORT_BUCKET
18e20 29 20 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d  ) .      ** elem
18e30 65 6e 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75  ents in the inpu
18e40 74 20 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20  t list. This is 
18e50 70 6f 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d  possible, but im
18e60 70 72 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20  practical..     
18e70 20 2a 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73   ** Testing this
18e80 20 6c 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69   line is the poi
18e90 6e 74 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72  nt of global var
18ea0 69 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73  iable.      ** s
18eb0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73  qlite3_pager_n_s
18ec0 6f 72 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20  ort_bucket..    
18ed0 20 20 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20    */.      a[i] 
18ee0 3d 20 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74  = merge_pagelist
18ef0 28 61 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d  (a[i], p);.    }
18f00 0a 20 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b  .  }.  p = a[0];
18f10 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f  .  for(i=1; i<N_
18f20 53 4f 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b  SORT_BUCKET; i++
18f30 29 7b 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65  ){.    p = merge
18f40 5f 70 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69  _pagelist(p, a[i
18f50 5d 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ]);.  }.  return
18f60 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76   p;.}../*.** Giv
18f70 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67  en a list of pag
18f80 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79  es (connected by
18f90 20 74 68 65 20 50 67 48 64 72 2e 70 44 69 72 74   the PgHdr.pDirt
18fa0 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65  y pointer) write
18fb0 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66  .** every one of
18fc0 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74   those pages out
18fd0 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
18fe0 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74   file and mark t
18ff0 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c  hem all.** as cl
19000 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ean..*/.static i
19010 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70  nt pager_write_p
19020 61 67 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70  agelist(PgHdr *p
19030 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a  List){.  Pager *
19040 70 50 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20  pPager;.  PgHdr 
19050 2a 70 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  *p;.  int rc;.. 
19060 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
19070 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19080 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
19090 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
190a0 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
190b0 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
190c0 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
190d0 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
190e0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
190f0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
19100 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
19110 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
19120 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
19130 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
19140 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
19150 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
19160 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
19170 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
19180 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
19190 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
191a0 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
191b0 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
191c0 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
191d0 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
191e0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
191f0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
19200 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
19210 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
19220 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
19230 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
19240 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
19250 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
19260 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
19270 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
19280 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
19290 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
192a0 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
192b0 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
192c0 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
192d0 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
192e0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
192f0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
19300 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
19310 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
19320 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
19330 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
19340 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
19350 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
19360 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
19370 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
19380 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
19390 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
193a0 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
193b0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
193c0 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
193d0 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
193e0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
193f0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
19400 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
19410 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
19420 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
19430 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
19440 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
19450 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
19460 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
19470 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67  pList = sort_pag
19480 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20  elist(pList);.  
19490 66 6f 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20  for(p=pList; p; 
194a0 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20  p=p->pDirty){.  
194b0 20 20 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72    assert( p->dir
194c0 74 79 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72  ty );.    p->dir
194d0 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68  ty = 0;.  }.  wh
194e0 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20  ile( pList ){.. 
194f0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
19500 65 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  e has not yet be
19510 65 6e 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20  en opened, open 
19520 69 74 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69  it now. */.    i
19530 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( !pPager->fd->
19540 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20  pMethods ){.    
19550 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
19560 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20  >tempFile);.    
19570 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61    rc = sqlite3Pa
19580 67 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67  gerOpentemp(pPag
19590 65 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72  er->pVfs, pPager
195a0 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46  ->fd, pPager->zF
195b0 69 6c 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20  ilename,.       
195c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
195d0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
195e0 3e 76 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20  >vfsFlags);.    
195f0 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
19600 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  n rc;.    }..   
19610 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65   /* If there are
19620 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20   dirty pages in 
19630 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77  the page cache w
19640 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73  ith page numbers
19650 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20   greater.    ** 
19660 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a  than Pager.dbSiz
19670 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71  e, this means sq
19680 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
19690 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
196a0 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
196b0 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
196c0 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
196d0 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
196e0 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
196f0 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
19700 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
19710 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
19720 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
19730 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
19740 20 20 20 20 20 20 69 36 34 20 6f 66 66 73 65 74        i64 offset
19750 20 3d 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d   = (pList->pgno-
19760 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e  1)*(i64)pPager->
19770 70 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  pageSize;.      
19780 63 68 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f  char *pData = CO
19790 44 45 43 32 28 70 50 61 67 65 72 2c 20 50 47 48  DEC2(pPager, PGH
197a0 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
197b0 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
197c0 36 29 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54  6);.      PAGERT
197d0 52 41 43 45 34 28 22 53 54 4f 52 45 20 25 64 20  RACE4("STORE %d 
197e0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
197f0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
19800 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
19810 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
19820 2d 3e 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61  ->pgno, pager_pa
19830 67 65 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a  gehash(pList));.
19840 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
19850 50 47 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20  PGOUT %p %d\n", 
19860 70 50 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70  pPager, pList->p
19870 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20  gno));.      rc 
19880 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
19890 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61  (pPager->fd, pDa
198a0 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
198b0 53 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20  Size, offset);. 
198c0 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28       PAGER_INCR(
198d0 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72  sqlite3_pager_wr
198e0 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20  itedb_count);.  
198f0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
19900 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a  Pager->nWrite);.
19910 20 20 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d        if( pList-
19920 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20  >pgno==1 ){.    
19930 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67      memcpy(&pPag
19940 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20  er->dbFileVers, 
19950 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65  &pData[24], size
19960 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
19970 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d  eVers));.      }
19980 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  .    }.#ifndef N
19990 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a  DEBUG.    else{.
199a0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
199b0 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
199c0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
199d0 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
199e0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
199f0 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
19a00 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69   ) return rc;.#i
19a10 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
19a20 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73  K_PAGES.    pLis
19a30 74 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  t->pageHash = pa
19a40 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69  ger_pagehash(pLi
19a50 73 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  st);.#endif.    
19a60 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70  pList = pList->p
19a70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74  Dirty;.  }.  ret
19a80 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
19a90 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20  ../*.** Collect 
19aa0 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67 65  every dirty page
19ab0 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69   into a dirty li
19ac0 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  st and.** return
19ad0 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
19ae0 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c  e head of that l
19af0 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20  ist.  All pages 
19b00 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64  are.** collected
19b10 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61 72   even if they ar
19b20 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a  e still in use..
19b30 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
19b40 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64  *pager_get_all_d
19b50 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65 72  irty_pages(Pager
19b60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
19b70 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 44 69 72  urn pPager->pDir
19b80 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
19b90 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 72  urn TRUE if ther
19ba0 65 20 69 73 20 61 20 68 6f 74 20 6a 6f 75 72 6e  e is a hot journ
19bb0 61 6c 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  al on the given 
19bc0 70 61 67 65 72 2e 0a 2a 2a 20 41 20 68 6f 74 20  pager..** A hot 
19bd0 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 6e 65 20 74  journal is one t
19be0 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
19bf0 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a  played back..**.
19c00 2a 2a 20 49 66 20 74 68 65 20 63 75 72 72 65 6e  ** If the curren
19c10 74 20 73 69 7a 65 20 6f 66 20 74 68 65 20 64 61  t size of the da
19c20 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20 30  tabase file is 0
19c30 20 62 75 74 20 61 20 6a 6f 75 72 6e 61 6c 20 66   but a journal f
19c40 69 6c 65 0a 2a 2a 20 65 78 69 73 74 73 2c 20 74  ile.** exists, t
19c50 68 61 74 20 69 73 20 70 72 6f 62 61 62 6c 79 20  hat is probably 
19c60 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 6c  an old journal l
19c70 65 66 74 20 6f 76 65 72 20 66 72 6f 6d 20 61 20  eft over from a 
19c80 70 72 69 6f 72 0a 2a 2a 20 64 61 74 61 62 61 73  prior.** databas
19c90 65 20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20  e with the same 
19ca0 6e 61 6d 65 2e 20 20 4a 75 73 74 20 64 65 6c 65  name.  Just dele
19cb0 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  te the journal..
19cc0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61  */.static int ha
19cd0 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 50 61 67 65  sHotJournal(Page
19ce0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71  r *pPager){.  sq
19cf0 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
19d00 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
19d10 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 75    if( !pPager->u
19d20 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65 74 75  seJournal ) retu
19d30 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 70 50 61  rn 0;.  if( !pPa
19d40 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64  ger->fd->pMethod
19d50 73 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  s ) return 0;.  
19d60 69 66 28 20 21 73 71 6c 69 74 65 33 4f 73 41 63  if( !sqlite3OsAc
19d70 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67 65  cess(pVfs, pPage
19d80 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51 4c  r->zJournal, SQL
19d90 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53 54  ITE_ACCESS_EXIST
19da0 53 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  S) ){.    return
19db0 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   0;.  }.  if( sq
19dc0 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
19dd0 72 76 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 2d  rvedLock(pPager-
19de0 3e 66 64 29 20 29 7b 0a 20 20 20 20 72 65 74 75  >fd) ){.    retu
19df0 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
19e00 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
19e10 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d 3d 30  count(pPager)==0
19e20 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
19e30 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70 50  sDelete(pVfs, pP
19e40 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
19e50 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  0);.    return 0
19e60 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
19e70 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 1;.  }.}..
19e80 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 66 69 6e  /*.** Try to fin
19e90 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
19ea0 63 61 63 68 65 20 74 68 61 74 20 63 61 6e 20 62  cache that can b
19eb0 65 20 72 65 63 79 63 6c 65 64 2e 20 0a 2a 2a 0a  e recycled. .**.
19ec0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19ed0 6d 61 79 20 72 65 74 75 72 6e 20 53 51 4c 49 54  may return SQLIT
19ee0 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f  E_IOERR, SQLITE_
19ef0 46 55 4c 4c 20 6f 72 20 53 51 4c 49 54 45 5f 4f  FULL or SQLITE_O
19f00 4b 2e 20 49 74 20 0a 2a 2a 20 64 6f 65 73 20 6e  K. It .** does n
19f10 6f 74 20 73 65 74 20 74 68 65 20 70 50 61 67 65  ot set the pPage
19f20 72 2d 3e 65 72 72 43 6f 64 65 20 76 61 72 69 61  r->errCode varia
19f30 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
19f40 6e 74 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  nt pager_recycle
19f50 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
19f60 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a 20  PgHdr **ppPg){. 
19f70 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 2a   PgHdr *pPg;.  *
19f80 70 70 50 67 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  ppPg = 0;..  /* 
19f90 49 74 20 69 73 20 69 6c 6c 65 67 61 6c 20 74 6f  It is illegal to
19fa0 20 63 61 6c 6c 20 74 68 69 73 20 66 75 6e 63 74   call this funct
19fb0 69 6f 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 70  ion unless the p
19fc0 61 67 65 72 20 6f 62 6a 65 63 74 0a 20 20 2a 2a  ager object.  **
19fd0 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70   pointed to by p
19fe0 50 61 67 65 72 20 68 61 73 20 61 74 20 6c 65 61  Pager has at lea
19ff0 73 74 20 6f 6e 65 20 66 72 65 65 20 70 61 67 65  st one free page
1a000 20 28 70 61 67 65 20 77 69 74 68 20 6e 52 65 66   (page with nRef
1a010 3d 3d 30 29 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  ==0)..  */ .  as
1a020 73 65 72 74 28 21 4d 45 4d 44 42 29 3b 0a 20 20  sert(!MEMDB);.  
1a030 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6c  assert(pPager->l
1a040 72 75 2e 70 46 69 72 73 74 29 3b 0a 0a 20 20 2f  ru.pFirst);..  /
1a050 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f  * Find a page to
1a060 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74   recycle.  Try t
1a070 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20  o locate a page 
1a080 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20  that does not.  
1a090 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20 74 6f  ** require us to
1a0a0 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29 20 6f   do an fsync() o
1a0b0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20  n the journal.. 
1a0c0 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 50 61 67   */.  pPg = pPag
1a0d0 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
1a0e0 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20 49 66 20 77  nced;..  /* If w
1a0f0 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64  e could not find
1a100 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
1a110 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e  s not require an
1a120 20 66 73 79 6e 63 28 29 0a 20 20 2a 2a 20 6f 6e   fsync().  ** on
1a130 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1a140 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65  e then fsync the
1a150 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
1a160 54 68 69 73 20 69 73 20 61 0a 20 20 2a 2a 20 76  This is a.  ** v
1a170 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61 74 69  ery slow operati
1a180 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b 20 68  on, so we work h
1a190 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69 74 2e  ard to avoid it.
1a1a0 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a    But sometimes.
1a1b0 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
1a1c0 20 68 65 6c 70 65 64 2e 0a 20 20 2a 2f 0a 20 20   helped..  */.  
1a1d0 69 66 28 20 70 50 67 3d 3d 30 20 26 26 20 70 50  if( pPg==0 && pP
1a1e0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1a1f0 29 7b 0a 20 20 20 20 69 6e 74 20 69 44 63 20 3d  ){.    int iDc =
1a200 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
1a210 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
1a220 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20  pPager->fd);.   
1a230 20 69 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f   int rc = syncJo
1a240 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
1a250 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
1a260 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1a270 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
1a280 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
1a290 26 26 20 30 3d 3d 28 69 44 63 26 53 51 4c 49 54  && 0==(iDc&SQLIT
1a2a0 45 5f 49 4f 43 41 50 5f 53 41 46 45 5f 41 50 50  E_IOCAP_SAFE_APP
1a2b0 45 4e 44 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a  END) ){.      /*
1a2c0 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
1a2d0 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
1a2e0 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
1a2f0 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 20 20 20  r into the.     
1a300 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1a310 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65 20 74  . This is done t
1a320 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d 6f 64  o avoid ever mod
1a330 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c  ifying a journal
1a340 0a 20 20 20 20 20 20 2a 2a 20 68 65 61 64 65 72  .      ** header
1a350 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
1a360 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1a370 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
1a380 68 61 76 65 0a 20 20 20 20 20 20 2a 2a 20 61 6c  have.      ** al
1a390 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1a3a0 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  en to the databa
1a3b0 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20  se (in case the 
1a3c0 68 65 61 64 65 72 20 69 73 0a 20 20 20 20 20 20  header is.      
1a3d0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
1a3e0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
1a3f0 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
1a400 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65    */.      pPage
1a410 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 20  r->nRec = 0;.   
1a420 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1a430 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
1a440 30 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  0 );.      asser
1a450 74 28 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f 74  t( pPager->doNot
1a460 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Sync==0 );.     
1a470 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1a480 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
1a490 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
1a4a0 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
1a4b0 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
1a4c0 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 70 50 61   }.    pPg = pPa
1a4d0 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3b  ger->lru.pFirst;
1a4e0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
1a4f0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
1a500 0a 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20  .  /* Write the 
1a510 70 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61  page to the data
1a520 62 61 73 65 20 66 69 6c 65 20 69 66 20 69 74 20  base file if it 
1a530 69 73 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  is dirty..  */. 
1a540 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
1a550 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  ){.    int rc;. 
1a560 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1a570 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20  needSync==0 );. 
1a580 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1a590 29 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74  );.    pPg->dirt
1a5a0 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e  y = 1;.    pPg->
1a5b0 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
1a5c0 72 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65  rc = pager_write
1a5d0 5f 70 61 67 65 6c 69 73 74 28 20 70 50 67 20 29  _pagelist( pPg )
1a5e0 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
1a5f0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
1a600 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1a610 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1a620 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
1a630 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
1a640 30 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  0 );..  /* If th
1a650 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65  e page we are re
1a660 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65  cycling is marke
1a670 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62  d as alwaysRollb
1a680 61 63 6b 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 73  ack, then.  ** s
1a690 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c  et the global al
1a6a0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61  waysRollback fla
1a6b0 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e  g, thus disablin
1a6c0 67 20 74 68 65 0a 20 20 2a 2a 20 73 71 6c 69 74  g the.  ** sqlit
1a6d0 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
1a6e0 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69  ack() optimizati
1a6f0 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20  on for the rest 
1a700 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  of this transact
1a710 69 6f 6e 2e 0a 20 20 2a 2a 20 49 74 20 69 73 20  ion..  ** It is 
1a720 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 6f 20  necessary to do 
1a730 74 68 69 73 20 62 65 63 61 75 73 65 20 74 68 65  this because the
1a740 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61 6c 77   page marked alw
1a750 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  aysRollback.  **
1a760 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
1a770 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
1a780 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
1a790 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
1a7a0 6d 65 6d 62 65 72 0a 20 20 2a 2a 20 74 68 61 74  member.  ** that
1a7b0 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61   is was marked a
1a7c0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20  lwaysRollback.  
1a7d0 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20  This means that 
1a7e0 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20  all pages must. 
1a7f0 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73   ** be marked as
1a800 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
1a810 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74  from here on out
1a820 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1a830 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
1a840 20 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28   ){.    IOTRACE(
1a850 28 22 41 4c 57 41 59 53 5f 52 4f 4c 4c 42 41 43  ("ALWAYS_ROLLBAC
1a860 4b 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29  K %p\n", pPager)
1a870 29 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c  ).    pPager->al
1a880 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
1a890 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
1a8a0 6e 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20  nk the old page 
1a8b0 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69  from the free li
1a8c0 73 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20  st and the hash 
1a8d0 74 61 62 6c 65 0a 20 20 2a 2f 0a 20 20 75 6e 6c  table.  */.  unl
1a8e0 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
1a8f0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67 6e  assert( pPg->pgn
1a900 6f 3d 3d 30 20 29 3b 0a 0a 20 20 2a 70 70 50 67  o==0 );..  *ppPg
1a910 20 3d 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e   = pPg;.  return
1a920 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23   SQLITE_OK;.}..#
1a930 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
1a940 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
1a950 45 4d 45 4e 54 0a 2f 2a 0a 2a 2a 20 54 68 69 73  EMENT./*.** This
1a960 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
1a970 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65  led to free supe
1a980 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61  rfluous dynamica
1a990 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  lly allocated me
1a9a0 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20  mory.** held by 
1a9b0 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d  the pager system
1a9c0 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  . Memory in use 
1a9d0 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61  by any SQLite pa
1a9e0 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ger allocated.**
1a9f0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
1aa00 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71  thread may be sq
1aa10 6c 69 74 65 33 5f 66 72 65 65 28 29 65 64 2e 0a  lite3_free()ed..
1aa20 2a 2a 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68  **.** nReq is th
1aa30 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
1aa40 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75  s of memory requ
1aa50 69 72 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20  ired. Once this 
1aa60 6d 75 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e  much has.** been
1aa70 20 72 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66   released, the f
1aa80 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e  unction returns.
1aa90 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
1aaa0 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c 20 6e  e is the total n
1aab0 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62 79 74  umber .** of byt
1aac0 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1aad0 65 61 73 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  eased..*/.int sq
1aae0 6c 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73  lite3PagerReleas
1aaf0 65 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71  eMemory(int nReq
1ab00 29 7b 0a 20 20 69 6e 74 20 6e 52 65 6c 65 61 73  ){.  int nReleas
1ab10 65 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ed = 0;         
1ab20 20 2f 2a 20 42 79 74 65 73 20 6f 66 20 6d 65 6d   /* Bytes of mem
1ab30 6f 72 79 20 72 65 6c 65 61 73 65 64 20 73 6f 20  ory released so 
1ab40 66 61 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  far */.  sqlite3
1ab50 5f 6d 75 74 65 78 20 2a 6d 75 74 65 78 3b 20 20  _mutex *mutex;  
1ab60 20 20 20 20 20 2f 2a 20 54 68 65 20 4d 45 4d 32       /* The MEM2
1ab70 20 6d 75 74 65 78 20 2a 2f 0a 20 20 50 61 67 65   mutex */.  Page
1ab80 72 20 2a 70 50 61 67 65 72 3b 20 20 20 20 20 20  r *pPager;      
1ab90 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 6c          /* For l
1aba0 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 61 67 65  ooping over page
1abb0 72 73 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64  rs */.  BusyHand
1abc0 6c 65 72 20 2a 73 61 76 65 64 42 75 73 79 3b 20  ler *savedBusy; 
1abd0 20 20 20 20 2f 2a 20 53 61 76 65 64 20 63 6f 70      /* Saved cop
1abe0 79 20 6f 66 20 74 68 65 20 62 75 73 79 20 68 61  y of the busy ha
1abf0 6e 64 6c 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  ndler */.  int r
1ac00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
1ac10 20 20 2f 2a 20 41 63 71 75 69 72 65 20 74 68 65    /* Acquire the
1ac20 20 6d 65 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65   memory-manageme
1ac30 6e 74 20 6d 75 74 65 78 0a 20 20 2a 2f 0a 20 20  nt mutex.  */.  
1ac40 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65 33 5f  mutex = sqlite3_
1ac50 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49  mutex_alloc(SQLI
1ac60 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f  TE_MUTEX_STATIC_
1ac70 4d 45 4d 32 29 3b 0a 20 20 73 71 6c 69 74 65 33  MEM2);.  sqlite3
1ac80 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74  _mutex_enter(mut
1ac90 65 78 29 3b 0a 0a 20 20 2f 2a 20 53 69 67 6e 61  ex);..  /* Signa
1aca0 6c 20 61 6c 6c 20 64 61 74 61 62 61 73 65 20 63  l all database c
1acb0 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 68 61 74 20  onnections that 
1acc0 6d 65 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e  memory managemen
1acd0 74 20 77 61 6e 74 73 0a 20 20 2a 2a 20 74 6f 20  t wants.  ** to 
1ace0 68 61 76 65 20 61 63 63 65 73 73 20 74 6f 20 74  have access to t
1acf0 68 65 20 70 61 67 65 72 73 2e 0a 20 20 2a 2f 0a  he pagers..  */.
1ad00 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71 6c    for(pPager=sql
1ad10 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20 70  ite3PagerList; p
1ad20 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70 50  Pager; pPager=pP
1ad30 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20 20  ager->pNext){.  
1ad40 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73     pPager->iInUs
1ad50 65 4d 4d 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  eMM = 1;.  }..  
1ad60 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
1ad70 45 5f 4f 4b 20 26 26 20 28 6e 52 65 71 3c 30 20  E_OK && (nReq<0 
1ad80 7c 7c 20 6e 52 65 6c 65 61 73 65 64 3c 6e 52 65  || nReleased<nRe
1ad90 71 29 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  q) ){.    PgHdr 
1ada0 2a 70 50 67 3b 0a 20 20 20 20 50 67 48 64 72 20  *pPg;.    PgHdr 
1adb0 2a 70 52 65 63 79 63 6c 65 64 3b 0a 20 0a 20 20  *pRecycled;. .  
1adc0 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 6e 64    /* Try to find
1add0 20 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63   a page to recyc
1ade0 6c 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  le that does not
1adf0 20 72 65 71 75 69 72 65 20 61 20 73 79 6e 63 28   require a sync(
1ae00 29 2e 20 49 66 0a 20 20 20 20 2a 2a 20 74 68 69  ). If.    ** thi
1ae10 73 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  s is not possibl
1ae20 65 2c 20 66 69 6e 64 20 6f 6e 65 20 74 68 61 74  e, find one that
1ae30 20 64 6f 65 73 20 72 65 71 75 69 72 65 20 61 20   does require a 
1ae40 73 79 6e 63 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  sync()..    */. 
1ae50 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
1ae60 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d  _enter(sqlite3_m
1ae70 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54  utex_alloc(SQLIT
1ae80 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c  E_MUTEX_STATIC_L
1ae90 52 55 29 29 3b 0a 20 20 20 20 70 50 67 20 3d 20  RU));.    pPg = 
1aea0 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69  sqlite3LruPageLi
1aeb0 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  st.pFirstSynced;
1aec0 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
1aed0 26 26 20 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e  && (pPg->needSyn
1aee0 63 20 7c 7c 20 70 50 67 2d 3e 70 50 61 67 65 72  c || pPg->pPager
1aef0 2d 3e 69 49 6e 55 73 65 44 42 29 20 29 7b 0a 20  ->iInUseDB) ){. 
1af00 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
1af10 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a 20 20 20  gfree.pNext;.   
1af20 20 7d 0a 20 20 20 20 69 66 28 20 21 70 50 67 20   }.    if( !pPg 
1af30 29 7b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  ){.      pPg = s
1af40 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
1af50 74 2e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  t.pFirst;.      
1af60 77 68 69 6c 65 28 20 70 50 67 20 26 26 20 70 50  while( pPg && pP
1af70 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  g->pPager->iInUs
1af80 65 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 70  eDB ){.        p
1af90 50 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e  Pg = pPg->gfree.
1afa0 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 7d 0a 20  pNext;.      }. 
1afb0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
1afc0 5f 6d 75 74 65 78 5f 6c 65 61 76 65 28 73 71 6c  _mutex_leave(sql
1afd0 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63  ite3_mutex_alloc
1afe0 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54  (SQLITE_MUTEX_ST
1aff0 41 54 49 43 5f 4c 52 55 29 29 3b 0a 0a 20 20 20  ATIC_LRU));..   
1b000 20 2f 2a 20 49 66 20 70 50 67 3d 3d 30 2c 20 74   /* If pPg==0, t
1b010 68 65 6e 20 74 68 65 20 62 6c 6f 63 6b 20 61 62  hen the block ab
1b020 6f 76 65 20 68 61 73 20 66 61 69 6c 65 64 20 74  ove has failed t
1b030 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 6f  o find a page to
1b040 0a 20 20 20 20 2a 2a 20 72 65 63 79 63 6c 65 2e  .    ** recycle.
1b050 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 72 65   In this case re
1b060 74 75 72 6e 20 65 61 72 6c 79 20 2d 20 6e 6f 20  turn early - no 
1b070 66 75 72 74 68 65 72 20 6d 65 6d 6f 72 79 20 77  further memory w
1b080 69 6c 6c 0a 20 20 20 20 2a 2a 20 62 65 20 72 65  ill.    ** be re
1b090 6c 65 61 73 65 64 2e 0a 20 20 20 20 2a 2f 0a 20  leased..    */. 
1b0a0 20 20 20 69 66 28 20 21 70 50 67 20 29 20 62 72     if( !pPg ) br
1b0b0 65 61 6b 3b 0a 0a 20 20 20 20 70 50 61 67 65 72  eak;..    pPager
1b0c0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
1b0d0 20 20 20 20 61 73 73 65 72 74 28 21 70 50 67 2d      assert(!pPg-
1b0e0 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67  >needSync || pPg
1b0f0 3d 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46  ==pPager->lru.pF
1b100 69 72 73 74 29 3b 0a 20 20 20 20 61 73 73 65 72  irst);.    asser
1b110 74 28 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  t(pPg->needSync 
1b120 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e  || pPg==pPager->
1b130 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63 65 64  lru.pFirstSynced
1b140 29 3b 0a 20 20 0a 20 20 20 20 73 61 76 65 64 42  );.  .    savedB
1b150 75 73 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 42  usy = pPager->pB
1b160 75 73 79 48 61 6e 64 6c 65 72 3b 0a 20 20 20 20  usyHandler;.    
1b170 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
1b180 64 6c 65 72 20 3d 20 30 3b 0a 20 20 20 20 72 63  dler = 0;.    rc
1b190 20 3d 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65   = pager_recycle
1b1a0 28 70 50 61 67 65 72 2c 20 26 70 52 65 63 79 63  (pPager, &pRecyc
1b1b0 6c 65 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  led);.    pPager
1b1c0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
1b1d0 20 73 61 76 65 64 42 75 73 79 3b 0a 20 20 20 20   savedBusy;.    
1b1e0 61 73 73 65 72 74 28 70 52 65 63 79 63 6c 65 64  assert(pRecycled
1b1f0 3d 3d 70 50 67 20 7c 7c 20 72 63 21 3d 53 51 4c  ==pPg || rc!=SQL
1b200 49 54 45 5f 4f 4b 29 3b 0a 20 20 20 20 69 66 28  ITE_OK);.    if(
1b210 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
1b220 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 27 76 65  {.      /* We've
1b230 20 66 6f 75 6e 64 20 61 20 70 61 67 65 20 74 6f   found a page to
1b240 20 66 72 65 65 2e 20 41 74 20 74 68 69 73 20 70   free. At this p
1b250 6f 69 6e 74 20 74 68 65 20 70 61 67 65 20 68 61  oint the page ha
1b260 73 20 62 65 65 6e 20 0a 20 20 20 20 20 20 2a 2a  s been .      **
1b270 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68   removed from th
1b280 65 20 70 61 67 65 20 68 61 73 68 2d 74 61 62 6c  e page hash-tabl
1b290 65 2c 20 66 72 65 65 2d 6c 69 73 74 20 61 6e 64  e, free-list and
1b2a0 20 73 79 6e 63 65 64 2d 6c 69 73 74 20 0a 20 20   synced-list .  
1b2b0 20 20 20 20 2a 2a 20 28 70 46 69 72 73 74 53 79      ** (pFirstSy
1b2c0 6e 63 65 64 29 2e 20 49 74 20 69 73 20 73 74 69  nced). It is sti
1b2d0 6c 6c 20 69 6e 20 74 68 65 20 61 6c 6c 20 70 61  ll in the all pa
1b2e0 67 65 73 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e  ges (pAll) list.
1b2f0 20 0a 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76   .      ** Remov
1b300 65 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c  e it from this l
1b310 69 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69  ist before freei
1b320 6e 67 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  ng..      **.   
1b330 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43 68 65 63     ** Todo: Chec
1b340 6b 20 74 68 65 20 50 61 67 65 72 2e 70 53 74 6d  k the Pager.pStm
1b350 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b 65 20 73  t list to make s
1b360 75 72 65 20 74 68 69 73 20 69 73 20 4f 6b 2e 20  ure this is Ok. 
1b370 49 74 20 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  It .      ** pro
1b380 62 61 62 6c 79 20 69 73 20 74 68 6f 75 67 68 2e  bably is though.
1b390 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b3a0 50 67 48 64 72 20 2a 70 54 6d 70 3b 0a 20 20 20  PgHdr *pTmp;.   
1b3b0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 20 29     assert( pPg )
1b3c0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
1b3d0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b  =pPager->pAll ){
1b3e0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
1b3f0 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e  ->pAll = pPg->pN
1b400 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 7d 65  extAll;.      }e
1b410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  lse{.        for
1b420 28 20 70 54 6d 70 3d 70 50 61 67 65 72 2d 3e 70  ( pTmp=pPager->p
1b430 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  All; pTmp->pNext
1b440 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d 70 3d 70  All!=pPg; pTmp=p
1b450 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 29 7b  Tmp->pNextAll ){
1b460 7d 0a 20 20 20 20 20 20 20 20 70 54 6d 70 2d 3e  }.        pTmp->
1b470 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 67 2d 3e  pNextAll = pPg->
1b480 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20  pNextAll;.      
1b490 7d 0a 20 20 20 20 20 20 6e 52 65 6c 65 61 73 65  }.      nRelease
1b4a0 64 20 2b 3d 20 28 0a 20 20 20 20 20 20 20 20 20  d += (.         
1b4b0 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20   sizeof(*pPg) + 
1b4c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1b4d0 0a 20 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a  .          + siz
1b4e0 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1b4f0 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1b500 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65      + MEMDB*size
1b510 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 0a 20  of(PgHistory) . 
1b520 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 49 4f       );.      IO
1b530 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
1b540 70 20 25 64 20 2a 5c 6e 22 2c 20 70 50 61 67 65  p %d *\n", pPage
1b550 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a  r, pPg->pgno));.
1b560 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
1b570 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70  (sqlite3_pager_p
1b580 67 66 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20  gfree_count);.  
1b590 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b5a0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
1b5b0 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
1b5c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
1b5d0 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  * An error occur
1b5e0 65 64 20 77 68 69 6c 73 74 20 77 72 69 74 69 6e  ed whilst writin
1b5f0 67 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  g to the databas
1b600 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20 20 20  e file or .     
1b610 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 20 70   ** journal in p
1b620 61 67 65 72 5f 72 65 63 79 63 6c 65 28 29 2e 20  ager_recycle(). 
1b630 54 68 65 20 65 72 72 6f 72 20 69 73 20 6e 6f 74  The error is not
1b640 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1b650 20 0a 20 20 20 20 20 20 2a 2a 20 63 61 6c 6c 65   .      ** calle
1b660 72 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  r of this functi
1b670 6f 6e 2e 20 49 6e 73 74 65 61 64 2c 20 73 65 74  on. Instead, set
1b680 20 74 68 65 20 50 61 67 65 72 2e 65 72 72 43 6f   the Pager.errCo
1b690 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 20 20 20  de variable..   
1b6a0 20 20 20 2a 2a 20 54 68 65 20 65 72 72 6f 72 20     ** The error 
1b6b0 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
1b6c0 20 74 6f 20 74 68 65 20 75 73 65 72 20 28 6f 72   to the user (or
1b6d0 20 75 73 65 72 73 2c 20 69 6e 20 74 68 65 20 63   users, in the c
1b6e0 61 73 65 20 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ase .      ** of
1b6f0 20 61 20 73 68 61 72 65 64 20 70 61 67 65 72 20   a shared pager 
1b700 63 61 63 68 65 29 20 6f 66 20 74 68 65 20 70 61  cache) of the pa
1b710 67 65 72 20 66 6f 72 20 77 68 69 63 68 20 74 68  ger for which th
1b720 65 20 65 72 72 6f 72 20 6f 63 63 75 72 65 64 2e  e error occured.
1b730 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
1b740 61 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 20  assert(.        
1b750 20 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c    (rc&0xff)==SQL
1b760 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
1b770 20 20 20 20 20 20 20 72 63 3d 3d 53 51 4c 49 54         rc==SQLIT
1b780 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20 20 20 20 20  E_FULL ||.      
1b790 20 20 20 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42      rc==SQLITE_B
1b7a0 55 53 59 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  USY.      );.   
1b7b0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b7c0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1b7d0 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20  RESERVED );.    
1b7e0 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50    pager_error(pP
1b7f0 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 7d  ager, rc);.    }
1b800 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 72  .  }..  /* Clear
1b810 20 74 68 65 20 6d 65 6d 6f 72 79 20 6d 61 6e 61   the memory mana
1b820 67 65 6d 65 6e 74 20 66 6c 61 67 73 20 61 6e 64  gement flags and
1b830 20 72 65 6c 65 61 73 65 20 74 68 65 20 6d 75 74   release the mut
1b840 65 78 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70 50  ex.  */.  for(pP
1b850 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67 65  ager=sqlite3Page
1b860 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20 70  rList; pPager; p
1b870 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
1b880 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67 65  ext){.     pPage
1b890 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 30 3b  r->iInUseMM = 0;
1b8a0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 6d  .  }.  sqlite3_m
1b8b0 75 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78  utex_leave(mutex
1b8c0 29 3b 0a 0a 20 20 2f 2a 20 52 65 74 75 72 6e 20  );..  /* Return 
1b8d0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
1b8e0 74 65 73 20 72 65 6c 65 61 73 65 64 0a 20 20 2a  tes released.  *
1b8f0 2f 0a 20 20 72 65 74 75 72 6e 20 6e 52 65 6c 65  /.  return nRele
1b900 61 73 65 64 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  ased;.}.#endif /
1b910 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  * SQLITE_ENABLE_
1b920 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e  MEMORY_MANAGEMEN
1b930 54 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  T */../*.** Read
1b940 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
1b950 70 61 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20  page pPg out of 
1b960 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b970 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1b980 20 72 65 61 64 44 62 50 61 67 65 28 50 61 67 65   readDbPage(Page
1b990 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
1b9a0 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f   *pPg, Pgno pgno
1b9b0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
1b9c0 36 34 20 6f 66 66 73 65 74 3b 0a 20 20 61 73 73  64 offset;.  ass
1b9d0 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
1b9e0 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
1b9f0 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c  ->fd->pMethods||
1ba00 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1ba10 29 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  );.  if( !pPager
1ba20 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  ->fd->pMethods )
1ba30 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
1ba40 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52 54 5f  ITE_IOERR_SHORT_
1ba50 52 45 41 44 3b 0a 20 20 7d 0a 20 20 6f 66 66 73  READ;.  }.  offs
1ba60 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28 69  et = (pgno-1)*(i
1ba70 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
1ba80 69 7a 65 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  ize;.  rc = sqli
1ba90 74 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72  te3OsRead(pPager
1baa0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
1bab0 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
1bac0 2d 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73  ->pageSize, offs
1bad0 65 74 29 3b 0a 20 20 50 41 47 45 52 5f 49 4e 43  et);.  PAGER_INC
1bae0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
1baf0 72 65 61 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20  readdb_count);. 
1bb00 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67   PAGER_INCR(pPag
1bb10 65 72 2d 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f  er->nRead);.  IO
1bb20 54 52 41 43 45 28 28 22 50 47 49 4e 20 25 70 20  TRACE(("PGIN %p 
1bb30 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
1bb40 67 6e 6f 29 29 3b 0a 20 20 69 66 28 20 70 67 6e  gno));.  if( pgn
1bb50 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63  o==1 ){.    memc
1bb60 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62 46 69  py(&pPager->dbFi
1bb70 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a 29 50  leVers, &((u8*)P
1bb80 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1bb90 29 29 5b 32 34 5d 2c 0a 20 20 20 20 20 20 20 20  ))[24],.        
1bba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 73 69 7a 65 6f 66 28 70 50 61        sizeof(pPa
1bbd0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29  ger->dbFileVers)
1bbe0 29 3b 0a 20 20 7d 0a 20 20 43 4f 44 45 43 31 28  );.  }.  CODEC1(
1bbf0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
1bc00 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d  _DATA(pPg), pPg-
1bc10 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47  >pgno, 3);.  PAG
1bc20 45 52 54 52 41 43 45 34 28 22 46 45 54 43 48 20  ERTRACE4("FETCH 
1bc30 25 64 20 70 61 67 65 20 25 64 20 68 61 73 68 28  %d page %d hash(
1bc40 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20  %08x)\n",.      
1bc50 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44           PAGERID
1bc60 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1bc70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65 68  gno, pager_pageh
1bc80 61 73 68 28 70 50 67 29 29 3b 0a 20 20 72 65 74  ash(pPg));.  ret
1bc90 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
1bca0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
1bcb0 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74  is called to obt
1bcc0 61 69 6e 20 74 68 65 20 73 68 61 72 65 64 20 6c  ain the shared l
1bcd0 6f 63 6b 20 72 65 71 75 69 72 65 64 20 62 65 66  ock required bef
1bce0 6f 72 65 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20  ore.** data may 
1bcf0 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65  be read from the
1bd00 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 66   pager cache. If
1bd10 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
1bd20 20 68 61 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20   has already.** 
1bd30 62 65 65 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74  been obtained, t
1bd40 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
1bd50 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49  a no-op..**.** I
1bd60 6d 6d 65 64 69 61 74 65 6c 79 20 61 66 74 65 72  mmediately after
1bd70 20 6f 62 74 61 69 6e 69 6e 67 20 74 68 65 20 73   obtaining the s
1bd80 68 61 72 65 64 20 6c 6f 63 6b 20 28 69 66 20 72  hared lock (if r
1bd90 65 71 75 69 72 65 64 29 2c 20 74 68 69 73 20 66  equired), this f
1bda0 75 6e 63 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b  unction.** check
1bdb0 73 20 66 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72  s for a hot-jour
1bdc0 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65  nal file. If one
1bdd0 20 69 73 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d   is found, an em
1bde0 65 72 67 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b  ergency rollback
1bdf0 0a 2a 2a 20 69 73 20 70 65 72 66 6f 72 6d 65 64  .** is performed
1be00 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f   immediately..*/
1be10 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1be20 72 53 68 61 72 65 64 4c 6f 63 6b 28 50 61 67 65  rSharedLock(Page
1be30 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
1be40 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
1be50 3b 0a 20 20 69 6e 74 20 69 73 48 6f 74 20 3d 20  ;.  int isHot = 
1be60 30 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  0;..  /* If this
1be70 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
1be80 6e 65 64 20 66 6f 72 20 65 78 63 6c 75 73 69 76  ned for exclusiv
1be90 65 20 61 63 63 65 73 73 2c 20 68 61 73 20 6e 6f  e access, has no
1bea0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 0a 20 20   outstanding .  
1beb0 2a 2a 20 70 61 67 65 20 72 65 66 65 72 65 6e 63  ** page referenc
1bec0 65 73 20 61 6e 64 20 69 73 20 69 6e 20 61 6e 20  es and is in an 
1bed0 65 72 72 6f 72 2d 73 74 61 74 65 2c 20 6e 6f 77  error-state, now
1bee0 20 69 73 20 74 68 65 20 63 68 61 6e 63 65 20 74   is the chance t
1bef0 6f 20 63 6c 65 61 72 0a 20 20 2a 2a 20 74 68 65  o clear.  ** the
1bf00 20 65 72 72 6f 72 2e 20 44 69 73 63 61 72 64 20   error. Discard 
1bf10 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
1bf20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68 65 20  the pager-cache 
1bf30 61 6e 64 20 74 72 65 61 74 20 61 6e 79 0a 20 20  and treat any.  
1bf40 2a 2a 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 20  ** open journal 
1bf50 66 69 6c 65 20 61 73 20 61 20 68 6f 74 2d 6a 6f  file as a hot-jo
1bf60 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66  urnal..  */.  if
1bf70 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
1bf80 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1bf90 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65  e && pPager->nRe
1bfa0 66 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  f==0 && pPager->
1bfb0 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 69  errCode ){.    i
1bfc0 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
1bfd0 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20  alOpen ){.      
1bfe0 69 73 48 6f 74 20 3d 20 31 3b 0a 20 20 20 20 7d  isHot = 1;.    }
1bff0 0a 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74  .    pager_reset
1c000 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
1c010 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
1c020 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a  SQLITE_OK;.  }..
1c030 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
1c040 72 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 61 6e  r is still in an
1c050 20 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 6f   error state, do
1c060 20 6e 6f 74 20 70 72 6f 63 65 65 64 2e 20 54 68   not proceed. Th
1c070 65 20 65 72 72 6f 72 20 0a 20 20 2a 2a 20 73 74  e error .  ** st
1c080 61 74 65 20 77 69 6c 6c 20 62 65 20 63 6c 65 61  ate will be clea
1c090 72 65 64 20 61 74 20 73 6f 6d 65 20 70 6f 69 6e  red at some poin
1c0a0 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 20  t in the future 
1c0b0 77 68 65 6e 20 61 6c 6c 20 70 61 67 65 20 0a 20  when all page . 
1c0c0 20 2a 2a 20 72 65 66 65 72 65 6e 63 65 73 20 61   ** references a
1c0d0 72 65 20 64 72 6f 70 70 65 64 20 61 6e 64 20 74  re dropped and t
1c0e0 68 65 20 63 61 63 68 65 20 63 61 6e 20 62 65 20  he cache can be 
1c0f0 64 69 73 63 61 72 64 65 64 2e 0a 20 20 2a 2f 0a  discarded..  */.
1c100 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
1c110 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72 2d  rCode && pPager-
1c120 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54 45  >errCode!=SQLITE
1c130 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74  _FULL ){.    ret
1c140 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1c150 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  ode;.  }..  if( 
1c160 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
1c170 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 69  AGER_UNLOCK || i
1c180 73 48 6f 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  sHot ){.    sqli
1c190 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
1c1a0 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20 20  pPager->pVfs;.  
1c1b0 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a    if( !MEMDB ){.
1c1c0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1c1d0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b  ager->nRef==0 );
1c1e0 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 67  .      if( !pPag
1c1f0 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 29  er->noReadlock )
1c200 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
1c210 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
1c220 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45 44  k(pPager, SHARED
1c230 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20  _LOCK);.        
1c240 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1c250 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
1c260 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f  eturn pager_erro
1c270 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20  r(pPager, rc);. 
1c280 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1c290 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1c2a0 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
1c2b0 4f 43 4b 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20  OCK );.      }. 
1c2c0 20 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 61 20   .      /* If a 
1c2d0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 69  journal file exi
1c2e0 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20 69  sts, and there i
1c2f0 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c 6f  s no RESERVED lo
1c300 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 20  ck on the.      
1c310 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
1c320 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
1c330 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
1c340 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
1c350 74 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ted..      */.  
1c360 20 20 20 20 69 66 28 20 68 61 73 48 6f 74 4a 6f      if( hasHotJo
1c370 75 72 6e 61 6c 28 70 50 61 67 65 72 29 20 7c 7c  urnal(pPager) ||
1c380 20 69 73 48 6f 74 20 29 7b 0a 20 20 20 20 20 20   isHot ){.      
1c390 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
1c3a0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
1c3b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1c3c0 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
1c3d0 74 20 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  t is.        ** 
1c3e0 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61  important that a
1c3f0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
1c400 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f  s not obtained o
1c410 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65  n the way to the
1c420 0a 20 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c  .        ** EXCL
1c430 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69  USIVE lock. If i
1c440 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20  t were, another 
1c450 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70  process might op
1c460 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a  en the.        *
1c470 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
1c480 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
1c490 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
1c4a0 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
1c4b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
1c4c0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
1c4d0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
1c4e0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
1c4f0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
1c500 20 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20       ** back..  
1c510 20 20 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20        ** .      
1c520 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65    ** Because the
1c530 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45   intermediate RE
1c540 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
1c550 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20 74 68  ot requested, th
1c560 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63  e.        ** sec
1c570 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c  ond process will
1c580 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69   get to this poi
1c590 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61  nt in the code a
1c5a0 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20  nd fail to.     
1c5b0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 73     ** obtain its
1c5c0 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c   own EXCLUSIVE l
1c5d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1c5e0 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  ase file..      
1c5f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
1c600 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 45   pPager->state<E
1c610 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 7b  XCLUSIVE_LOCK ){
1c620 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
1c630 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50  sqlite3OsLock(pP
1c640 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53  ager->fd, EXCLUS
1c650 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
1c660 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c670 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1c680 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f        pager_unlo
1c690 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
1c6a0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1c6b0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1c6c0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1c6d0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50    }.          pP
1c6e0 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1c6f0 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 20  GER_EXCLUSIVE;. 
1c700 20 20 20 20 20 20 20 7d 0a 20 0a 20 20 20 20 20         }. .     
1c710 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a     /* Open the j
1c720 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69  ournal for readi
1c730 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e  ng only.  Return
1c740 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a   SQLITE_BUSY if.
1c750 20 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72          ** we ar
1c760 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
1c770 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c780 65 2e 20 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  e. .        **. 
1c790 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f         ** The jo
1c7a0 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20  urnal file does 
1c7b0 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c  not need to be l
1c7c0 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54  ocked itself.  T
1c7d0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f  he.        ** jo
1c7e0 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
1c7f0 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
1c800 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1c810 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
1c820 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
1c830 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
1c840 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
1c850 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
1c860 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 72 6f  e.        ** pro
1c870 63 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74  cesses opening t
1c880 68 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68  he journal at th
1c890 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20  e same time..   
1c8a0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1c8b0 2a 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  ** Open the jour
1c8c0 6e 61 6c 20 66 6f 72 20 72 65 61 64 2f 77 72 69  nal for read/wri
1c8d0 74 65 20 61 63 63 65 73 73 2e 20 54 68 69 73 20  te access. This 
1c8e0 69 73 20 62 65 63 61 75 73 65 20 69 6e 20 0a 20  is because in . 
1c8f0 20 20 20 20 20 20 20 2a 2a 20 65 78 63 6c 75 73         ** exclus
1c900 69 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20  ive-access mode 
1c910 74 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70  the file descrip
1c920 74 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74  tor will be kept
1c930 20 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20   open and.      
1c940 20 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73    ** possibly us
1c950 65 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63  ed for a transac
1c960 74 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f  tion later on. O
1c970 6e 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20  n some systems, 
1c980 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  the.        ** O
1c990 73 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c  sTruncate() call
1c9a0 20 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69   used in exclusi
1c9b0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61  ve-access mode a
1c9c0 6c 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20  lso requires.   
1c9d0 20 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77       ** a read/w
1c9e0 72 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65  rite file handle
1c9f0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
1ca00 20 20 20 20 20 69 66 28 20 21 69 73 48 6f 74 20       if( !isHot 
1ca10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
1ca20 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1ca30 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
1ca40 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56 66  ite3OsAccess(pVf
1ca50 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1ca60 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45  nal, SQLITE_ACCE
1ca70 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20  SS_EXISTS) ){.  
1ca80 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 66 6f            int fo
1ca90 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ut = 0;.        
1caa0 20 20 20 20 69 6e 74 20 66 20 3d 20 53 51 4c 49      int f = SQLI
1cab0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54  TE_OPEN_READWRIT
1cac0 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d 41  E|SQLITE_OPEN_MA
1cad0 49 4e 5f 4a 4f 55 52 4e 41 4c 3b 0a 20 20 20 20  IN_JOURNAL;.    
1cae0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
1caf0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
1cb00 65 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e );.           
1cb10 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
1cb20 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67 65 72  pen(pVfs, pPager
1cb30 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67  ->zJournal, pPag
1cb40 65 72 2d 3e 6a 66 64 2c 20 66 2c 20 26 66 6f 75  er->jfd, f, &fou
1cb50 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
1cb60 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
1cb70 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72 2d  TE_OK || pPager-
1cb80 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29  >jfd->pMethods )
1cb90 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1cba0 28 20 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50  ( fout&SQLITE_OP
1cbb0 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 29 7b 0a 20  EN_READONLY ){. 
1cbc0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
1cbd0 3d 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  = SQLITE_BUSY;. 
1cbe0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
1cbf0 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61 67  ite3OsClose(pPag
1cc00 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
1cc10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1cc20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1cc30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1cc40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1cc50 20 20 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63       pager_unloc
1cc60 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
1cc70 20 20 20 20 20 72 65 74 75 72 6e 20 28 28 72 63       return ((rc
1cc80 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 7c 7c  ==SQLITE_NOMEM||
1cc90 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
1cca0 5f 4e 4f 4d 45 4d 29 3f 72 63 3a 53 51 4c 49 54  _NOMEM)?rc:SQLIT
1ccb0 45 5f 42 55 53 59 29 3b 0a 20 20 20 20 20 20 20  E_BUSY);.       
1ccc0 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1ccd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
1cce0 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   1;.        pPag
1ccf0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74  er->journalStart
1cd00 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ed = 0;.        
1cd10 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1cd20 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ff = 0;.        
1cd30 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1cd40 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  r = 0;.        p
1cd50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
1cd60 72 20 3d 20 30 3b 0a 20 0a 20 20 20 20 20 20 20  r = 0;. .       
1cd70 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64   /* Playback and
1cd80 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72   delete the jour
1cd90 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64  nal.  Drop the d
1cda0 61 74 61 62 61 73 65 20 77 72 69 74 65 0a 20 20  atabase write.  
1cdb0 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e        ** lock an
1cdc0 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65 20  d reacquire the 
1cdd0 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20  read lock..     
1cde0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63     */.        rc
1cdf0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
1ce00 6b 28 70 50 61 67 65 72 2c 20 31 29 3b 0a 20 20  k(pPager, 1);.  
1ce10 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ce20 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ce30 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65       return page
1ce40 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
1ce50 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  rc);.        }. 
1ce60 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70 50         assert(pP
1ce70 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1ce80 45 52 5f 53 48 41 52 45 44 20 7c 7c 20 0a 20 20  ER_SHARED || .  
1ce90 20 20 20 20 20 20 20 20 20 20 28 70 50 61 67 65            (pPage
1cea0 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
1ceb0 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
1cec0 65 3e 50 41 47 45 52 5f 53 48 41 52 45 44 29 0a  e>PAGER_SHARED).
1ced0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
1cee0 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50   }..      if( pP
1cef0 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
1cf00 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 61        /* The sha
1cf10 72 65 64 2d 6c 6f 63 6b 20 68 61 73 20 6a 75 73  red-lock has jus
1cf20 74 20 62 65 65 6e 20 61 63 71 75 69 72 65 64 20  t been acquired 
1cf30 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1cf40 66 69 6c 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  file.        ** 
1cf50 61 6e 64 20 74 68 65 72 65 20 61 72 65 20 61 6c  and there are al
1cf60 72 65 61 64 79 20 70 61 67 65 73 20 69 6e 20 74  ready pages in t
1cf70 68 65 20 63 61 63 68 65 20 28 66 72 6f 6d 20 61  he cache (from a
1cf80 20 70 72 65 76 69 6f 75 73 0a 20 20 20 20 20 20   previous.      
1cf90 20 20 2a 2a 20 72 65 61 64 20 6f 72 20 77 72 69    ** read or wri
1cfa0 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  te transaction).
1cfb0 20 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69    Check to see i
1cfc0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20  f the database. 
1cfd0 20 20 20 20 20 20 20 2a 2a 20 68 61 73 20 62 65         ** has be
1cfe0 65 6e 20 6d 6f 64 69 66 69 65 64 2e 20 20 49 66  en modified.  If
1cff0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
1d000 73 20 63 68 61 6e 67 65 64 2c 20 66 6c 75 73 68  s changed, flush
1d010 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
1d020 63 61 63 68 65 2e 0a 20 20 20 20 20 20 20 20 2a  cache..        *
1d030 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 61 74  *.        ** Dat
1d040 61 62 61 73 65 20 63 68 61 6e 67 65 73 20 69 73  abase changes is
1d050 20 64 65 74 65 63 74 65 64 20 62 79 20 6c 6f 6f   detected by loo
1d060 6b 69 6e 67 20 61 74 20 31 35 20 62 79 74 65 73  king at 15 bytes
1d070 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20 20   beginning.     
1d080 20 20 20 2a 2a 20 61 74 20 6f 66 66 73 65 74 20     ** at offset 
1d090 32 34 20 69 6e 74 6f 20 74 68 65 20 66 69 6c 65  24 into the file
1d0a0 2e 20 20 54 68 65 20 66 69 72 73 74 20 34 20 6f  .  The first 4 o
1d0b0 66 20 74 68 65 73 65 20 31 36 20 62 79 74 65 73  f these 16 bytes
1d0c0 20 61 72 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   are.        ** 
1d0d0 61 20 33 32 2d 62 69 74 20 63 6f 75 6e 74 65 72  a 32-bit counter
1d0e0 20 74 68 61 74 20 69 73 20 69 6e 63 72 65 6d 65   that is increme
1d0f0 6e 74 65 64 20 77 69 74 68 20 65 61 63 68 20 63  nted with each c
1d100 68 61 6e 67 65 2e 20 20 54 68 65 0a 20 20 20 20  hange.  The.    
1d110 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 62 79 74      ** other byt
1d120 65 73 20 63 68 61 6e 67 65 20 72 61 6e 64 6f 6d  es change random
1d130 6c 79 20 77 69 74 68 20 65 61 63 68 20 66 69 6c  ly with each fil
1d140 65 20 63 68 61 6e 67 65 20 77 68 65 6e 0a 20 20  e change when.  
1d150 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 64 65 63        ** a codec
1d160 20 69 73 20 69 6e 20 75 73 65 2e 0a 20 20 20 20   is in use..    
1d170 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
1d180 2a 2a 20 54 68 65 72 65 20 69 73 20 61 20 76 61  ** There is a va
1d190 6e 69 73 68 69 6e 67 6c 79 20 73 6d 61 6c 6c 20  nishingly small 
1d1a0 63 68 61 6e 63 65 20 74 68 61 74 20 61 20 63 68  chance that a ch
1d1b0 61 6e 67 65 20 77 69 6c 6c 20 6e 6f 74 20 62 65  ange will not be
1d1c0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 65 74   .        ** det
1d1d0 65 63 74 65 64 2e 20 20 54 68 65 20 63 68 61 6e  ected.  The chan
1d1e0 63 65 20 6f 66 20 61 6e 20 75 6e 64 65 74 65 63  ce of an undetec
1d1f0 74 65 64 20 63 68 61 6e 67 65 20 69 73 20 73 6f  ted change is so
1d200 20 73 6d 61 6c 6c 20 74 68 61 74 0a 20 20 20 20   small that.    
1d210 20 20 20 20 2a 2a 20 69 74 20 63 61 6e 20 62 65      ** it can be
1d220 20 6e 65 67 6c 65 63 74 65 64 2e 0a 20 20 20 20   neglected..    
1d230 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 63      */.        c
1d240 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 73  har dbFileVers[s
1d250 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1d260 46 69 6c 65 56 65 72 73 29 5d 3b 0a 20 20 20 20  FileVers)];.    
1d270 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1d280 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
1d290 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
1d2a0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
1d2b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1d2c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
1d2d0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ode;.        }..
1d2e0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1d2f0 65 72 2d 3e 64 62 53 69 7a 65 3e 30 20 29 7b 0a  er->dbSize>0 ){.
1d300 20 20 20 20 20 20 20 20 20 20 49 4f 54 52 41 43            IOTRAC
1d310 45 28 28 22 43 4b 56 45 52 53 20 25 70 20 25 64  E(("CKVERS %p %d
1d320 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 73 69 7a  \n", pPager, siz
1d330 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29  eof(dbFileVers))
1d340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
1d350 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
1d360 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 64 62 46  pPager->fd, &dbF
1d370 69 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28  ileVers, sizeof(
1d380 64 62 46 69 6c 65 56 65 72 73 29 2c 20 32 34 29  dbFileVers), 24)
1d390 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
1d3a0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
1d3b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1d3c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
1d3d0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
1d3e0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  e{.          mem
1d3f0 73 65 74 28 64 62 46 69 6c 65 56 65 72 73 2c 20  set(dbFileVers, 
1d400 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  0, sizeof(dbFile
1d410 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20 20 20  Vers));.        
1d420 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d  }..        if( m
1d430 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e 64 62  emcmp(pPager->db
1d440 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69 6c 65  FileVers, dbFile
1d450 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64 62 46  Vers, sizeof(dbF
1d460 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29 7b 0a  ileVers))!=0 ){.
1d470 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72 5f            pager_
1d480 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20  reset(pPager);. 
1d490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1d4a0 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1d4b0 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  t( pPager->exclu
1d4c0 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50 61 67  siveMode || pPag
1d4d0 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47 45 52  er->state<=PAGER
1d4e0 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20 69  _SHARED );.    i
1d4f0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
1d500 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  ==PAGER_UNLOCK )
1d510 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
1d520 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
1d530 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ARED;.    }.  }.
1d540 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1d550 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
1d560 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74 2e 20  a PgHdr object. 
1d570 20 20 45 69 74 68 65 72 20 63 72 65 61 74 65 20    Either create 
1d580 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72 65 75  a new one or reu
1d590 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74 69 6e  se.** an existin
1d5a0 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20 6e 6f  g one that is no
1d5b0 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e 20 75  t otherwise in u
1d5c0 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65 77 20  se..**.** A new 
1d5d0 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65 20  PgHdr structure 
1d5e0 69 73 20 63 72 65 61 74 65 64 20 69 66 20 61 6e  is created if an
1d5f0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
1d600 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65 3a 0a  ng are.** true:.
1d610 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57  **.**     (1)  W
1d620 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63 65 65  e have not excee
1d630 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75 6d 20  ded our maximum 
1d640 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68 65 20  allocated cache 
1d650 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20 20 20  size.**         
1d660 20 61 73 20 73 65 74 20 62 79 20 74 68 65 20 22   as set by the "
1d670 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1d680 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a 2a  e" command..**.*
1d690 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65  *     (2)  There
1d6a0 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64 20 50   are no unused P
1d6b0 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61 76 61  gHdr objects ava
1d6c0 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73 20 74  ilable at this t
1d6d0 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ime..**.**     (
1d6e0 33 29 20 20 54 68 69 73 20 69 73 20 61 6e 20 69  3)  This is an i
1d6f0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d700 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 34 29  e..**.**     (4)
1d710 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f 20 50    There are no P
1d720 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74 68 61  gHdr objects tha
1d730 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69 72 65  t do not require
1d740 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20   a journal.**   
1d750 20 20 20 20 20 20 20 66 69 6c 65 20 73 79 6e 63         file sync
1d760 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66 20 74   and a sync of t
1d770 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
1d780 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1d790 20 20 20 20 20 20 20 20 20 70 72 6f 68 69 62 69           prohibi
1d7a0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68 65 72  ted..**.** Other
1d7b0 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e 20 65  wise, reuse an e
1d7c0 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e 20 20  xisting PgHdr.  
1d7d0 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
1d7e0 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78 69 73  reuse an.** exis
1d7f0 74 69 6e 67 20 50 67 48 64 72 20 69 66 20 61 6c  ting PgHdr if al
1d800 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  l of the followi
1d810 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a 2a 0a  ng are true:.**.
1d820 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65 20 68  **     (1)  We h
1d830 61 76 65 20 72 65 61 63 68 65 64 20 6f 72 20 65  ave reached or e
1d840 78 63 65 65 64 65 64 20 74 68 65 20 6d 61 78 69  xceeded the maxi
1d850 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65 0a 2a  mum cache size.*
1d860 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77  *          allow
1d870 65 64 20 62 79 20 22 50 52 41 47 4d 41 20 63 61  ed by "PRAGMA ca
1d880 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a 2a 2a  che_size"..**.**
1d890 20 20 20 20 20 28 32 29 20 20 54 68 65 72 65 20       (2)  There 
1d8a0 69 73 20 61 20 50 67 48 64 72 20 61 76 61 69 6c  is a PgHdr avail
1d8b0 61 62 6c 65 20 77 69 74 68 20 50 67 48 64 72 2d  able with PgHdr-
1d8c0 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a 20 20  >nRef==0.**.**  
1d8d0 20 20 20 28 33 29 20 20 57 65 20 61 72 65 20 6e     (3)  We are n
1d8e0 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65 6d 6f  ot in an in-memo
1d8f0 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a 0a 2a  ry database.**.*
1d900 2a 20 20 20 20 20 28 34 29 20 20 45 69 74 68 65  *     (4)  Eithe
1d910 72 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 76  r there is an av
1d920 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20 74 68  ailable PgHdr th
1d930 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  at does not need
1d940 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74 6f 20  .**          to 
1d950 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73  be synced to dis
1d960 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b 20 73  k or else disk s
1d970 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72 65 6e  yncing is curren
1d980 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  tly.**          
1d990 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74 61 74  allowed..*/.stat
1d9a0 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c 6c 6f  ic int pagerAllo
1d9b0 63 61 74 65 50 61 67 65 28 50 61 67 65 72 20 2a  catePage(Pager *
1d9c0 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 2a  pPager, PgHdr **
1d9d0 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72 63 20  ppPg){.  int rc 
1d9e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 50  = SQLITE_OK;.  P
1d9f0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
1da00 20 6e 42 79 74 65 48 64 72 3b 0a 0a 20 20 2f 2a   nByteHdr;..  /*
1da10 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 50 67   Create a new Pg
1da20 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20 74 68  Hdr if any of th
1da30 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69 6f 6e  e four condition
1da40 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a 2a 20  s defined .  ** 
1da50 61 62 6f 76 65 20 61 72 65 20 6d 65 74 3a 20 2a  above are met: *
1da60 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1da70 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78  nPage<pPager->mx
1da80 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67 65  Page.   || pPage
1da90 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30  r->lru.pFirst==0
1daa0 20 0a 20 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20   .   || MEMDB.  
1dab0 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6c 72 75   || (pPager->lru
1dac0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30  .pFirstSynced==0
1dad0 20 26 26 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f   && pPager->doNo
1dae0 74 53 79 6e 63 29 0a 20 20 29 7b 0a 20 20 20 20  tSync).  ){.    
1daf0 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  if( pPager->nPag
1db00 65 3e 3d 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  e>=pPager->nHash
1db10 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72 5f   ){.      pager_
1db20 72 65 73 69 7a 65 5f 68 61 73 68 5f 74 61 62 6c  resize_hash_tabl
1db30 65 28 70 50 61 67 65 72 2c 0a 20 20 20 20 20 20  e(pPager,.      
1db40 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68     pPager->nHash
1db50 3c 32 35 36 20 3f 20 32 35 36 20 3a 20 70 50 61  <256 ? 256 : pPa
1db60 67 65 72 2d 3e 6e 48 61 73 68 2a 32 29 3b 0a 20  ger->nHash*2);. 
1db70 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1db80 3e 6e 48 61 73 68 3d 3d 30 20 29 7b 0a 20 20 20  >nHash==0 ){.   
1db90 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1dba0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
1dbb0 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
1dbc0 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 20 20 7d  ate_out;.      }
1dbd0 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65 72  .    }.    pager
1dbe0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
1dbf0 20 20 20 6e 42 79 74 65 48 64 72 20 3d 20 73 69     nByteHdr = si
1dc00 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 73 69 7a  zeof(*pPg) + siz
1dc10 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61 67 65  eof(u32) + pPage
1dc20 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20  r->nExtra.      
1dc30 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a          + MEMDB*
1dc40 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
1dc50 29 3b 0a 20 20 20 20 70 50 67 20 3d 20 73 71 6c  );.    pPg = sql
1dc60 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
1dc70 74 65 48 64 72 20 2b 20 70 50 61 67 65 72 2d 3e  teHdr + pPager->
1dc80 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20  pageSize );.    
1dc90 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
1dca0 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 3d  r);.    if( pPg=
1dcb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1dcc0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
1dcd0 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1dce0 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1dcf0 20 20 7d 0a 20 20 20 20 6d 65 6d 73 65 74 28 70    }.    memset(p
1dd00 50 67 2c 20 30 2c 20 6e 42 79 74 65 48 64 72 29  Pg, 0, nByteHdr)
1dd10 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 61 74 61  ;.    pPg->pData
1dd20 20 3d 20 28 76 6f 69 64 2a 29 28 6e 42 79 74 65   = (void*)(nByte
1dd30 48 64 72 20 2b 20 28 63 68 61 72 2a 29 70 50 67  Hdr + (char*)pPg
1dd40 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
1dd50 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20  er = pPager;.   
1dd60 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d   pPg->pNextAll =
1dd70 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20   pPager->pAll;. 
1dd80 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
1dd90 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65  = pPg;.    pPage
1dda0 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65  r->nPage++;.  }e
1ddb0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79  lse{.    /* Recy
1ddc0 63 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20  cle an existing 
1ddd0 70 61 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f  page with a zero
1dde0 20 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20   ref-count. */. 
1ddf0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65     rc = pager_re
1de00 63 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70  cycle(pPager, &p
1de10 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  Pg);.    if( rc=
1de20 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
1de30 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1de40 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b  E_IOERR_BLOCKED;
1de50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72  .    }.    if( r
1de60 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1de70 20 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72        goto pager
1de80 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20  _allocate_out;. 
1de90 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
1dea0 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
1deb0 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
1dec0 20 20 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a     assert(pPg);.
1ded0 20 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50    }.  *ppPg = pP
1dee0 67 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61  g;..pager_alloca
1def0 74 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e  te_out:.  return
1df00 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61   rc;.}../*.** Ma
1df10 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
1df20 74 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20  the content for 
1df30 61 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20  a page.  If the 
1df40 70 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76  page was.** prev
1df50 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
1df60 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
1df70 31 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74  1, then the cont
1df80 65 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20  ent was.** just 
1df90 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
1dfa0 65 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20  eros instead of 
1dfb0 62 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20  being read from 
1dfc0 64 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77  disk..** But now
1dfd0 20 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61   we need the rea
1dfe0 6c 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69  l data off of di
1dff0 73 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72  sk.  So make sur
1e000 65 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e  e we.** have it.
1e010 20 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20    Read it in if 
1e020 77 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69  we do not have i
1e030 74 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74  t already..*/.st
1e040 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67  atic int pager_g
1e050 65 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72  et_content(PgHdr
1e060 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
1e070 67 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20  g->needRead ){. 
1e080 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64     int rc = read
1e090 44 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67  DbPage(pPg->pPag
1e0a0 65 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67  er, pPg, pPg->pg
1e0b0 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  no);.    if( rc=
1e0c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1e0d0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61      pPg->needRea
1e0e0 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  d = 0;.    }else
1e0f0 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
1e100 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  c;.    }.  }.  r
1e110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
1e120 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
1e130 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1e140 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
1e150 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
1e160 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
1e170 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
1e180 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
1e190 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
1e1a0 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
1e1b0 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
1e1c0 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leased..**.** Th
1e1d0 69 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73  is routine works
1e1e0 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75   for any page nu
1e1f0 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61  mber greater tha
1e200 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74  n 0.  If the dat
1e210 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73  abase.** file is
1e220 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68   smaller than th
1e230 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65  e requested page
1e240 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c  , then no actual
1e250 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63   disk.** read oc
1e260 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d  curs and the mem
1e270 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65  ory image of the
1e280 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c   page is initial
1e290 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a  ized to.** all z
1e2a0 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61  eros.  The extra
1e2b0 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74   data appended t
1e2c0 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61  o a page is alwa
1e2d0 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a  ys initialized.*
1e2e0 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66  * to zeros the f
1e2f0 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65  irst time a page
1e300 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20   is loaded into 
1e310 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68  memory..**.** Th
1e320 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69  e acquisition mi
1e330 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76  ght fail for sev
1e340 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49  eral reasons.  I
1e350 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20  n all cases,.** 
1e360 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65  an appropriate e
1e370 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74  rror code is ret
1e380 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67  urned and *ppPag
1e390 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c  e is set to NULL
1e3a0 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f  ..**.** See also
1e3b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f   sqlite3PagerLoo
1e3c0 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
1e3d0 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f  s routine and Lo
1e3e0 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
1e3f0 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
1e400 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
1e410 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
1e420 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
1e430 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
1e440 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
1e450 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
1e460 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
1e470 20 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28   whereas Lookup(
1e480 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e  ).** just return
1e490 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69  s 0.  This routi
1e4a0 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65  ne acquires a re
1e4b0 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73  ad-lock the firs
1e4c0 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73  t time it.** has
1e4d0 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20   to go to disk, 
1e4e0 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70  and could also p
1e4f0 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a  layback an old j
1e500 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73  ournal if necess
1e510 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f  ary..** Since Lo
1e520 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65  okup() never goe
1e530 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65  s to disk, it ne
1e540 76 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20  ver has to deal 
1e550 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72  with locks.** or
1e560 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a   journal files..
1e570 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65  **.** If noConte
1e580 6e 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65  nt is false, the
1e590 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61   page contents a
1e5a0 72 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64  re actually read
1e5b0 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49   from disk..** I
1e5c0 66 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74  f noContent is t
1e5d0 72 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68  rue, it means th
1e5e0 61 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  at we do not car
1e5f0 65 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74  e about the cont
1e600 65 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70  ents.** of the p
1e610 61 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65  age at this time
1e620 2c 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61  , so do not do a
1e630 20 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73   disk read.  Jus
1e640 74 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a  t fill in the.**
1e650 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69   page content wi
1e660 74 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d  th zeros.  But m
1e670 61 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61  ark the fact tha
1e680 74 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65  t we have not re
1e690 61 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e  ad the.** conten
1e6a0 74 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65  t by setting the
1e6b0 20 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20   PgHdr.needRead 
1e6c0 66 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c  flag.  Later on,
1e6d0 20 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50   if .** sqlite3P
1e6e0 61 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63  agerWrite() is c
1e6f0 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61  alled on this pa
1e700 67 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f  ge or if this ro
1e710 75 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c  utine is.** call
1e720 65 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f  ed again with no
1e730 43 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74  Content==0, that
1e740 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1e750 63 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65  content is neede
1e760 64 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73  d.** and the dis
1e770 6b 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63  k read should oc
1e780 63 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e  cur at that poin
1e790 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
1e7a0 20 70 61 67 65 72 41 63 71 75 69 72 65 28 0a 20   pagerAcquire(. 
1e7b0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1e7c0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1e7d0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
1e7e0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1e7f0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
1e800 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1e810 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
1e820 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
1e830 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
1e840 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1e850 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
1e860 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
1e870 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
1e880 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
1e890 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
1e8a0 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67   true */.){.  Pg
1e8b0 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20  Hdr *pPg;.  int 
1e8c0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  rc;..  assert( p
1e8d0 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
1e8e0 47 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50  GER_UNLOCK || pP
1e8f0 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20  ager->nRef>0 || 
1e900 70 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a  pgno==1 );..  /*
1e910 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67   The maximum pag
1e920 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31  e number is 2^31
1e930 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  . Return SQLITE_
1e940 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67  CORRUPT if a pag
1e950 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72  e.  ** number gr
1e960 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c  eater than this,
1e970 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71   or zero, is req
1e980 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  uested..  */.  i
1e990 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41  f( pgno>PAGER_MA
1e9a0 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d  X_PGNO || pgno==
1e9b0 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52  0 || pgno==PAGER
1e9c0 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
1e9d0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
1e9e0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b  QLITE_CORRUPT_BK
1e9f0 50 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61  PT;.  }..  /* Ma
1ea00 6b 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20  ke sure we have 
1ea10 6e 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74  not hit any crit
1ea20 69 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a  ical errors..  *
1ea30 2f 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  / .  assert( pPa
1ea40 67 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50  ger!=0 );.  *ppP
1ea50 61 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49  age = 0;..  /* I
1ea60 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
1ea70 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
1ea80 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
1ea90 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
1eaa0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1eab0 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64  ile. pagerShared
1eac0 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f  Lock() is a no-o
1ead0 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74  p if .  ** a dat
1eae0 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c  abase lock is al
1eaf0 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f  ready held..  */
1eb00 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61  .  rc = pagerSha
1eb10 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b  redLock(pPager);
1eb20 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1eb30 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
1eb40 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
1eb50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
1eb60 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
1eb70 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67   );..  pPg = pag
1eb80 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1eb90 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1eba0 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  Pg==0 ){.    /* 
1ebb0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
1ebc0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65  ge is not in the
1ebd0 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a   page cache. */.
1ebe0 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20      int nMax;.  
1ebf0 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47    int h;.    PAG
1ec00 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e  ER_INCR(pPager->
1ec10 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d  nMiss);.    rc =
1ec20 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61   pagerAllocatePa
1ec30 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29  ge(pPager, &pPg)
1ec40 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
1ec50 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1ec60 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
1ec70 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f  }..    pPg->pgno
1ec80 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73   = pgno;.    ass
1ec90 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70  ert( !MEMDB || p
1eca0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74  gno>pPager->stmt
1ecb0 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28 20  Size );.    if( 
1ecc0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
1ecd0 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
1ece0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
1ecf0 69 7a 65 20 29 7b 0a 23 69 66 20 30 0a 20 20 20  ize ){.#if 0.   
1ed00 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
1ed10 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
1ed20 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
1ed30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
1ed40 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ed50 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
1ed60 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1ed70 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61  nal = (pPager->a
1ed80 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38  InJournal[pgno/8
1ed90 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29  ] & (1<<(pgno&7)
1eda0 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67  ))!=0;.      pPg
1edb0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1edc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1edd0 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1ede0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
1edf0 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
1ee00 20 20 7d 0a 0a 20 20 20 20 6d 61 6b 65 43 6c 65    }..    makeCle
1ee10 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 70 50 67  an(pPg);.    pPg
1ee20 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 0a 20 20 20  ->nRef = 1;..   
1ee30 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
1ee40 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1ee50 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
1ee60 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
1ee70 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
1ee80 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
1ee90 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
1eea0 0a 20 20 20 20 6e 4d 61 78 20 3d 20 73 71 6c 69  .    nMax = sqli
1eeb0 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
1eec0 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
1eed0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1eee0 64 65 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  de ){.      rc =
1eef0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1ef00 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 50  ;.      sqlite3P
1ef10 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a  agerUnref(pPg);.
1ef20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1ef30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
1ef40 6f 70 75 6c 61 74 65 20 74 68 65 20 70 61 67 65  opulate the page
1ef50 20 77 69 74 68 20 64 61 74 61 2c 20 65 69 74 68   with data, eith
1ef60 65 72 20 62 79 20 72 65 61 64 69 6e 67 20 66 72  er by reading fr
1ef70 6f 6d 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  om the database.
1ef80 20 20 20 20 2a 2a 20 66 69 6c 65 2c 20 6f 72 20      ** file, or 
1ef90 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20 65  by setting the e
1efa0 6e 74 69 72 65 20 70 61 67 65 20 74 6f 20 7a 65  ntire page to ze
1efb0 72 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ro..    */.    i
1efc0 66 28 20 6e 4d 61 78 3c 28 69 6e 74 29 70 67 6e  f( nMax<(int)pgn
1efd0 6f 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 28 6e  o || MEMDB || (n
1efe0 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50 61  oContent && !pPa
1eff0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
1f000 61 63 6b 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ack) ){.      if
1f010 28 20 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d  ( pgno>pPager->m
1f020 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 20  xPgno ){.       
1f030 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1f040 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  ef(pPg);.       
1f050 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
1f060 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ULL;.      }.   
1f070 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
1f080 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
1f090 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1f0a0 65 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  e);.      pPg->n
1f0b0 65 65 64 52 65 61 64 20 3d 20 6e 6f 43 6f 6e 74  eedRead = noCont
1f0c0 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d 3e  ent && !pPager->
1f0d0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a  alwaysRollback;.
1f0e0 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
1f0f0 5a 45 52 4f 20 25 70 20 25 64 5c 6e 22 2c 20 70  ZERO %p %d\n", p
1f100 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a 20  Pager, pgno));. 
1f110 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1f120 72 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28  rc = readDbPage(
1f130 70 50 61 67 65 72 2c 20 70 50 67 2c 20 70 67 6e  pPager, pPg, pgn
1f140 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  o);.      if( rc
1f150 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
1f160 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f  c!=SQLITE_IOERR_
1f170 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20  SHORT_READ ){.  
1f180 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20        pPg->pgno 
1f190 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
1f1a0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f1b0 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
1f1c0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a  urn rc;.      }.
1f1d0 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52        pPg->needR
1f1e0 65 61 64 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a  ead = 0;.    }..
1f1f0 20 20 20 20 2f 2a 20 4c 69 6e 6b 20 74 68 65 20      /* Link the 
1f200 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61  page into the pa
1f210 67 65 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f  ge hash table */
1f220 0a 20 20 20 20 68 20 3d 20 70 67 6e 6f 20 26 20  .    h = pgno & 
1f230 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
1f240 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1f250 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  gno!=0 );.    pP
1f260 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
1f270 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b  Pager->aHash[h];
1f280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61  .    pPager->aHa
1f290 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20  sh[h] = pPg;.   
1f2a0 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
1f2b0 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ash ){.      ass
1f2c0 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
1f2d0 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  ash->pPrevHash==
1f2e0 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  0 );.      pPg->
1f2f0 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
1f300 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20  Hash = pPg;.    
1f310 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  }..#ifdef SQLITE
1f320 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1f330 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
1f340 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
1f350 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  pPg);.#endif.  }
1f360 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 54 68 65  else{.    /* The
1f370 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
1f380 69 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  is in the page c
1f390 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73  ache. */.    ass
1f3a0 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52 65 66  ert(pPager->nRef
1f3b0 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a  >0 || pgno==1);.
1f3c0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70      PAGER_INCR(p
1f3d0 50 61 67 65 72 2d 3e 6e 48 69 74 29 3b 0a 20 20  Pager->nHit);.  
1f3e0 20 20 69 66 28 20 21 6e 6f 43 6f 6e 74 65 6e 74    if( !noContent
1f3f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1f400 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74  ager_get_content
1f410 28 70 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  (pPg);.      if(
1f420 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
1f430 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
1f440 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 61 67 65  }.    }.    page
1f450 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
1f460 20 2a 70 70 50 61 67 65 20 3d 20 70 50 67 3b 0a   *ppPage = pPg;.
1f470 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1f480 4f 4b 3b 0a 7d 0a 69 6e 74 20 73 71 6c 69 74 65  OK;.}.int sqlite
1f490 33 50 61 67 65 72 41 63 71 75 69 72 65 28 0a 20  3PagerAcquire(. 
1f4a0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20   Pager *pPager, 
1f4b0 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65       /* The page
1f4c0 72 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61  r open on the da
1f4d0 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
1f4e0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20   Pgno pgno,     
1f4f0 20 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d       /* Page num
1f500 62 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a  ber to fetch */.
1f510 20 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67    DbPage **ppPag
1f520 65 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  e,    /* Write a
1f530 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f540 70 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69  page here */.  i
1f550 6e 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20  nt noContent    
1f560 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
1f570 68 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74  her reading cont
1f580 65 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66  ent from disk if
1f590 20 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e   true */.){.  in
1f5a0 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e 74  t rc;.  pagerEnt
1f5b0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  er(pPager);.  rc
1f5c0 20 3d 20 70 61 67 65 72 41 63 71 75 69 72 65 28   = pagerAcquire(
1f5d0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 70 70  pPager, pgno, pp
1f5e0 50 61 67 65 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29  Page, noContent)
1f5f0 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  ;.  pagerLeave(p
1f600 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
1f610 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41   rc;.}.../*.** A
1f620 63 71 75 69 72 65 20 61 20 70 61 67 65 20 69 66  cquire a page if
1f630 20 69 74 20 69 73 20 61 6c 72 65 61 64 79 20 69   it is already i
1f640 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  n the in-memory 
1f650 63 61 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f  cache.  Do.** no
1f660 74 20 72 65 61 64 20 74 68 65 20 70 61 67 65 20  t read the page 
1f670 66 72 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75  from disk.  Retu
1f680 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
1f690 74 68 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20  the page,.** or 
1f6a0 30 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73  0 if the page is
1f6b0 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a   not in cache..*
1f6c0 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71  *.** See also sq
1f6d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 2e  lite3PagerGet().
1f6e0 20 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65    The difference
1f6f0 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f   between this ro
1f700 75 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c  utine.** and sql
1f710 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 69  ite3PagerGet() i
1f720 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
1f730 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
1f740 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
1f750 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
1f760 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
1f770 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
1f780 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
1f790 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
1f7a0 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
1f7b0 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
1f7c0 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
1f7d0 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
1f7e0 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62 50 61 67 65  pened..*/.DbPage
1f7f0 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f   *sqlite3PagerLo
1f800 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67  okup(Pager *pPag
1f810 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
1f820 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 30    PgHdr *pPg = 0
1f830 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1f840 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
1f850 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
1f860 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
1f870 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
1f880 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1f890 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 61  _UNLOCK ){.    a
1f8a0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1f8b0 70 41 6c 6c 20 7c 7c 20 70 50 61 67 65 72 2d 3e  pAll || pPager->
1f8c0 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b  exclusiveMode );
1f8d0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
1f8e0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
1f8f0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
1f900 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
1f910 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e      /* Do nothin
1f920 67 20 2a 2f 0a 20 20 7d 65 6c 73 65 20 69 66 28  g */.  }else if(
1f930 20 28 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f   (pPg = pager_lo
1f940 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
1f950 6f 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 61  o))!=0 ){.    pa
1f960 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  ge_ref(pPg);.  }
1f970 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
1f980 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
1f990 70 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  pPg;.}../*.** Re
1f9a0 6c 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a  lease a page..**
1f9b0 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65  .** If the numbe
1f9c0 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20  r of references 
1f9d0 74 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70  to the page drop
1f9e0 20 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   to zero, then t
1f9f0 68 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64  he.** page is ad
1fa00 64 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c  ded to the LRU l
1fa10 69 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72  ist.  When all r
1fa20 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c  eferences to all
1fa30 20 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65   pages.** are re
1fa40 6c 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61  leased, a rollba
1fa50 63 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68  ck occurs and th
1fa60 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e lock on the da
1fa70 74 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d  tabase is.** rem
1fa80 6f 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  oved..*/.int sql
1fa90 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44  ite3PagerUnref(D
1faa0 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50  bPage *pPg){.  P
1fab0 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
1fac0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  Pg->pPager;..  /
1fad0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1fae0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1faf0 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1fb00 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1fb10 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 61  ->nRef>0 );.  pa
1fb20 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e 70 50  gerEnter(pPg->pP
1fb30 61 67 65 72 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  ager);.  pPg->nR
1fb40 65 66 2d 2d 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  ef--;..  CHECK_P
1fb50 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
1fb60 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
1fb70 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
1fb80 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
1fb90 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
1fba0 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
1fbb0 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
1fbc0 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
1fbd0 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
1fbe0 3d 3d 30 20 29 7b 0a 0a 20 20 20 20 6c 72 75 4c  ==0 ){..    lruL
1fbf0 69 73 74 41 64 64 28 70 50 67 29 3b 0a 20 20 20  istAdd(pPg);.   
1fc00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65   if( pPager->xDe
1fc10 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20  structor ){.    
1fc20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72    pPager->xDestr
1fc30 75 63 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65  uctor(pPg, pPage
1fc40 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
1fc50 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68    }.  .    /* Wh
1fc60 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61  en all pages rea
1fc70 63 68 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  ch the freelist,
1fc80 20 64 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c   drop the read l
1fc90 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20  ock from.    ** 
1fca0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1fcb0 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50  e..    */.    pP
1fcc0 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20  ager->nRef--;.  
1fcd0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1fce0 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20  ->nRef>=0 );.   
1fcf0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
1fd00 66 3d 3d 30 20 26 26 20 28 21 70 50 61 67 65 72  f==0 && (!pPager
1fd10 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
1fd20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  || pPager->journ
1fd30 61 6c 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20  alOff>0) ){.    
1fd40 20 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64    pagerUnlockAnd
1fd50 52 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  Rollback(pPager)
1fd60 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 61  ;.    }.  }.  pa
1fd70 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
1fd80 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1fd90 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
1fda0 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
1fdb0 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
1fdc0 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
1fdd0 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
1fde0 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
1fdf0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
1fe00 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
1fe10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1fe20 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
1fe30 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
1fe40 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
1fe50 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
1fe60 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
1fe70 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
1fe80 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
1fe90 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
1fea0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1feb0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
1fec0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
1fed0 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70 56   sqlite3_vfs *pV
1fee0 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56 66  fs = pPager->pVf
1fef0 73 3b 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 3d  s;.  int flags =
1ff00 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45   (SQLITE_OPEN_RE
1ff10 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
1ff20 50 45 4e 5f 45 58 43 4c 55 53 49 56 45 7c 53 51  PEN_EXCLUSIVE|SQ
1ff30 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
1ff40 29 3b 0a 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  );..  int rc;.  
1ff50 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42 20 29  assert( !MEMDB )
1ff60 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
1ff70 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
1ff80 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 61  _RESERVED );.  a
1ff90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
1ffa0 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
1ffb0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ffc0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b  r->useJournal );
1ffd0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1ffe0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1fff0 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 50 61 67   );.  sqlite3Pag
20000 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67  erPagecount(pPag
20010 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
20020 65 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  e(pPager);.  pPa
20030 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
20040 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
20050 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ero( pPager->dbS
20060 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70  ize/8 + 1 );.  p
20070 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
20080 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
20090 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
200a0 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
200b0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
200c0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
200d0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 0a 20  _journal;.  }.. 
200e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
200f0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 66 6c 61  pFile ){.    fla
20100 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f 4f 50  gs |= (SQLITE_OP
20110 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c 4f 53 45  EN_DELETEONCLOSE
20120 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 54 45 4d  |SQLITE_OPEN_TEM
20130 50 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20 7d 65  P_JOURNAL);.  }e
20140 6c 73 65 7b 0a 20 20 20 20 66 6c 61 67 73 20 7c  lse{.    flags |
20150 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 4d  = (SQLITE_OPEN_M
20160 41 49 4e 5f 4a 4f 55 52 4e 41 4c 29 3b 0a 20 20  AIN_JOURNAL);.  
20170 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
20180 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57 52  ENABLE_ATOMIC_WR
20190 49 54 45 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  ITE.  rc = sqlit
201a0 65 33 4a 6f 75 72 6e 61 6c 4f 70 65 6e 28 0a 20  e3JournalOpen(. 
201b0 20 20 20 20 20 70 56 66 73 2c 20 70 50 61 67 65       pVfs, pPage
201c0 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 70 50 61  r->zJournal, pPa
201d0 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61 67 73 2c  ger->jfd, flags,
201e0 20 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28   jrnlBufferSize(
201f0 70 50 61 67 65 72 29 0a 20 20 29 3b 0a 23 65 6c  pPager).  );.#el
20200 73 65 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  se.  rc = sqlite
20210 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50  3OsOpen(pVfs, pP
20220 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
20230 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 66 6c 61  pPager->jfd, fla
20240 67 73 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20  gs, 0);.#endif. 
20250 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
20260 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61 67 65 72  ITE_OK || pPager
20270 2d 3e 6a 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20  ->jfd->pMethods 
20280 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
20290 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
202a0 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
202b0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
202c0 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
202d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
202e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72  _OK ){.    if( r
202f0 63 3d 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c==SQLITE_NOMEM 
20300 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
20310 4f 73 44 65 6c 65 74 65 28 70 56 66 73 2c 20 70  OsDelete(pVfs, p
20320 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c  Pager->zJournal,
20330 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67   0);.    }.    g
20340 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
20350 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
20360 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
20370 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 70 50 61  lOpen = 1;.  pPa
20380 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
20390 74 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ted = 0;.  pPage
203a0 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
203b0 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  .  pPager->alway
203c0 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 20  sRollback = 0;. 
203d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
203e0 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  0;.  if( pPager-
203f0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
20400 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
20410 43 6f 64 65 3b 0a 20 20 20 20 67 6f 74 6f 20 66  Code;.    goto f
20420 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
20430 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 70 50 61  urnal;.  }.  pPa
20440 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
20450 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
20460 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
20470 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
20480 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
20490 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
204a0 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
204b0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
204c0 74 65 33 50 61 67 65 72 53 74 6d 74 42 65 67 69  te3PagerStmtBegi
204d0 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  n(pPager);.  }. 
204e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
204f0 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  OK && rc!=SQLITE
20500 5f 4e 4f 4d 45 4d 20 26 26 20 72 63 21 3d 53 51  _NOMEM && rc!=SQ
20510 4c 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d  LITE_IOERR_NOMEM
20520 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
20530 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
20540 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
20550 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
20560 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20570 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
20580 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
20590 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
205a0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
205b0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
205c0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
205d0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
205e0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
205f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
20600 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
20610 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
20620 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
20630 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
20640 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
20650 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
20660 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
20670 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
20680 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
20690 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
206a0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
206b0 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
206c0 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
206d0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
206e0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
206f0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
20700 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
20710 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
20720 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
20730 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
20740 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
20750 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
20760 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
20770 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
20780 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
20790 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
207a0 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
207b0 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
207c0 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
207d0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
207e0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
207f0 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
20800 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
20810 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
20820 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
20830 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
20840 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
20850 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
20860 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
20870 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
20880 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
20890 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
208a0 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
208b0 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
208c0 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
208d0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
208e0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
208f0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
20900 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
20910 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
20920 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
20930 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
20940 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
20950 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
20960 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
20970 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
20980 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
20990 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
209a0 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
209b0 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
209c0 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
209d0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
209e0 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
209f0 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
20a00 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
20a10 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
20a20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
20a30 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
20a40 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
20a50 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
20a60 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
20a70 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
20a80 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
20a90 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
20aa0 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
20ab0 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
20ac0 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
20ad0 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
20ae0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
20af0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
20b00 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
20b10 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65  pagerEnter(pPage
20b20 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  r);.  assert( pP
20b30 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61  g->nRef>0 );.  a
20b40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
20b50 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
20b60 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
20b70 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
20b80 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61  _SHARED ){.    a
20b90 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
20ba0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
20bb0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
20bc0 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
20bd0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
20be0 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50  LUSIVE;.      pP
20bf0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
20c00 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
20c10 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  e;.    }else{.  
20c20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
20c30 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
20c40 64 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  d, RESERVED_LOCK
20c50 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  );.      if( rc=
20c60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
20c70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
20c80 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
20c90 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  RVED;.        if
20ca0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
20cb0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
20cc0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
20cd0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
20ce0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
20cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
20d00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
20d10 20 29 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65   ){.        page
20d20 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
20d30 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
20d40 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  c;.      }.     
20d50 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
20d60 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50  che = 0;.      P
20d70 41 47 45 52 54 52 41 43 45 32 28 22 54 52 41 4e  AGERTRACE2("TRAN
20d80 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50  SACTION %d\n", P
20d90 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
20da0 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
20db0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26  r->useJournal &&
20dc0 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
20dd0 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  le ){.        rc
20de0 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f   = pager_open_jo
20df0 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20  urnal(pPager);. 
20e00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
20e10 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
20e20 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20  >journalOpen && 
20e30 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
20e40 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ff==0 ){.    /* 
20e50 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
20e60 6e 20 74 68 65 20 70 61 67 65 72 20 77 61 73 20  n the pager was 
20e70 69 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  in exclusive-acc
20e80 65 73 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20  ess mode last.  
20e90 20 20 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61    ** time a (rea
20ea0 64 20 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e  d or write) tran
20eb0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63  saction was succ
20ec0 65 73 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64  essfully conclud
20ed0 65 64 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69  ed.    ** by thi
20ee0 73 20 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e  s connection. In
20ef0 73 74 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e  stead of deletin
20f00 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  g the journal fi
20f10 6c 65 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a  le it was .    *
20f20 2a 20 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20  * kept open and 
20f30 74 72 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62  truncated to 0 b
20f40 79 74 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ytes..    */.   
20f50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
20f60 3e 6e 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRec==0 );.    
20f70 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20f80 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b  origDbSize==0 );
20f90 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
20fa0 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d  ger->aInJournal=
20fb0 3d 30 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  =0 );.    sqlite
20fc0 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
20fd0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67  pPager);.    pag
20fe0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
20ff0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e  .    pPager->aIn
21000 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65  Journal = sqlite
21010 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20 70 50 61  3MallocZero( pPa
21020 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
21030 31 20 29 3b 0a 20 20 20 20 70 61 67 65 72 45 6e  1 );.    pagerEn
21040 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ter(pPager);.   
21050 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49   if( !pPager->aI
21060 6e 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20  nJournal ){.    
21070 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f    rc = SQLITE_NO
21080 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
21090 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6f 72        pPager->or
210a0 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67 65  igDbSize = pPage
210b0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 20  r->dbSize;.     
210c0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
210d0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
210e0 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72     }.  }.  asser
210f0 74 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  t( !pPager->jour
21100 6e 61 6c 4f 70 65 6e 20 7c 7c 20 70 50 61 67 65  nalOpen || pPage
21110 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3e 30 20  r->journalOff>0 
21120 7c 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  || rc!=SQLITE_OK
21130 20 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   );.  pagerLeave
21140 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
21150 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
21160 4d 61 6b 65 20 61 20 70 61 67 65 20 64 69 72 74  Make a page dirt
21170 79 2e 20 20 53 65 74 20 69 74 73 20 64 69 72 74  y.  Set its dirt
21180 79 20 66 6c 61 67 20 61 6e 64 20 61 64 64 20 69  y flag and add i
21190 74 20 74 6f 20 74 68 65 20 64 69 72 74 79 0a 2a  t to the dirty.*
211a0 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a  * page list..*/.
211b0 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65  static void make
211c0 44 69 72 74 79 28 50 67 48 64 72 20 2a 70 50 67  Dirty(PgHdr *pPg
211d0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  ){.  if( pPg->di
211e0 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61  rty==0 ){.    Pa
211f0 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
21200 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70  g->pPager;.    p
21210 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
21220 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d     pPg->pDirty =
21230 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b   pPager->pDirty;
21240 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
21250 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
21260 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 2d   pPager->pDirty-
21270 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70 50  >pPrevDirty = pP
21280 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67  g;.    }.    pPg
21290 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 30  ->pPrevDirty = 0
212a0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44  ;.    pPager->pD
212b0 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  irty = pPg;.  }.
212c0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61 20  }../*.** Make a 
212d0 70 61 67 65 20 63 6c 65 61 6e 2e 20 20 43 6c 65  page clean.  Cle
212e0 61 72 20 69 74 73 20 64 69 72 74 79 20 62 69 74  ar its dirty bit
212f0 20 61 6e 64 20 72 65 6d 6f 76 65 20 69 74 20 66   and remove it f
21300 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69 72 74 79  rom the.** dirty
21310 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a 2f 0a 73   page list..*/.s
21320 74 61 74 69 63 20 76 6f 69 64 20 6d 61 6b 65 43  tatic void makeC
21330 6c 65 61 6e 28 50 67 48 64 72 20 2a 70 50 67 29  lean(PgHdr *pPg)
21340 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72  {.  if( pPg->dir
21350 74 79 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 64  ty ){.    pPg->d
21360 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66  irty = 0;.    if
21370 28 20 70 50 67 2d 3e 70 44 69 72 74 79 20 29 7b  ( pPg->pDirty ){
21380 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21390 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
213a0 76 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  vDirty==pPg );. 
213b0 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
213c0 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d 20 70  ->pPrevDirty = p
213d0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 3b 0a  Pg->pPrevDirty;.
213e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
213f0 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20 29 7b  g->pPrevDirty ){
21400 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21410 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
21420 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b 0a 20  pDirty==pPg );. 
21430 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 44       pPg->pPrevD
21440 69 72 74 79 2d 3e 70 44 69 72 74 79 20 3d 20 70  irty->pDirty = p
21450 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20  Pg->pDirty;.    
21460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
21470 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72  ert( pPg->pPager
21480 2d 3e 70 44 69 72 74 79 3d 3d 70 50 67 20 29 3b  ->pDirty==pPg );
21490 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
214a0 65 72 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 67  er->pDirty = pPg
214b0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
214c0 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61    }.}.../*.** Ma
214d0 72 6b 20 61 20 64 61 74 61 20 70 61 67 65 20 61  rk a data page a
214e0 73 20 77 72 69 74 65 61 62 6c 65 2e 20 20 54 68  s writeable.  Th
214f0 65 20 70 61 67 65 20 69 73 20 77 72 69 74 74 65  e page is writte
21500 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
21510 61 6c 20 0a 2a 2a 20 69 66 20 69 74 20 69 73 20  al .** if it is 
21520 6e 6f 74 20 74 68 65 72 65 20 61 6c 72 65 61 64  not there alread
21530 79 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  y.  This routine
21540 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64 20   must be called 
21550 62 65 66 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a  before making.**
21560 20 63 68 61 6e 67 65 73 20 74 6f 20 61 20 70 61   changes to a pa
21570 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69  ge..**.** The fi
21580 72 73 74 20 74 69 6d 65 20 74 68 69 73 20 72 6f  rst time this ro
21590 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c  utine is called,
215a0 20 74 68 65 20 70 61 67 65 72 20 63 72 65 61 74   the pager creat
215b0 65 73 20 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72  es a new.** jour
215c0 6e 61 6c 20 61 6e 64 20 61 63 71 75 69 72 65 73  nal and acquires
215d0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
215e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
215f0 2e 20 20 49 66 20 74 68 65 20 52 45 53 45 52 56  .  If the RESERV
21600 45 44 0a 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64  ED.** lock could
21610 20 6e 6f 74 20 62 65 20 61 63 71 75 69 72 65 64   not be acquired
21620 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  , this routine r
21630 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 42 55  eturns SQLITE_BU
21640 53 59 2e 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c  SY.  The.** call
21650 69 6e 67 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  ing routine must
21660 20 63 68 65 63 6b 20 66 6f 72 20 74 68 61 74 20   check for that 
21670 72 65 74 75 72 6e 20 76 61 6c 75 65 20 61 6e 64  return value and
21680 20 62 65 20 63 61 72 65 66 75 6c 20 6e 6f 74 20   be careful not 
21690 74 6f 0a 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79  to.** change any
216a0 20 70 61 67 65 20 64 61 74 61 20 75 6e 74 69 6c   page data until
216b0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   this routine re
216c0 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
216d0 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
216e0 75 72 6e 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64  urnal file could
216f0 20 6e 6f 74 20 62 65 20 77 72 69 74 74 65 6e 20   not be written 
21700 62 65 63 61 75 73 65 20 74 68 65 20 64 69 73 6b  because the disk
21710 20 69 73 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65   is full,.** the
21720 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 72  n this routine r
21730 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 46 55  eturns SQLITE_FU
21740 4c 4c 20 61 6e 64 20 64 6f 65 73 20 61 6e 20 69  LL and does an i
21750 6d 6d 65 64 69 61 74 65 20 72 6f 6c 6c 62 61 63  mmediate rollbac
21760 6b 2e 0a 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71  k..** All subseq
21770 75 65 6e 74 20 77 72 69 74 65 20 61 74 74 65 6d  uent write attem
21780 70 74 73 20 61 6c 73 6f 20 72 65 74 75 72 6e 20  pts also return 
21790 53 51 4c 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69  SQLITE_FULL unti
217a0 6c 20 74 68 65 72 65 0a 2a 2a 20 69 73 20 61 20  l there.** is a 
217b0 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 50  call to sqlite3P
217c0 61 67 65 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20  agerCommit() or 
217d0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
217e0 62 61 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73  back() to.** res
217f0 65 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  et..*/.static in
21800 74 20 70 61 67 65 72 5f 77 72 69 74 65 28 50 67  t pager_write(Pg
21810 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69  Hdr *pPg){.  voi
21820 64 20 2a 70 44 61 74 61 20 3d 20 50 47 48 44 52  d *pData = PGHDR
21830 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
21840 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
21850 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
21860 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
21870 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
21880 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
21890 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
218a0 72 43 6f 64 65 20 29 7b 20 0a 20 20 20 20 72 65  rCode ){ .    re
218b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
218c0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
218d0 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
218e0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
218f0 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
21900 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
21910 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
21920 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70  ..  CHECK_PAGE(p
21930 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
21940 69 73 20 70 61 67 65 20 77 61 73 20 70 72 65 76  is page was prev
21950 69 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20  iously acquired 
21960 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d  with noContent==
21970 31 2c 20 74 68 61 74 20 6d 65 61 6e 73 0a 20 20  1, that means.  
21980 2a 2a 20 77 65 20 64 69 64 6e 27 74 20 72 65 61  ** we didn't rea
21990 6c 6c 79 20 72 65 61 64 20 69 6e 20 74 68 65 20  lly read in the 
219a0 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70  content of the p
219b0 61 67 65 2e 20 20 54 68 69 73 20 63 61 6e 20 68  age.  This can h
219c0 61 70 70 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20  appen.  ** (for 
219d0 65 78 61 6d 70 6c 65 29 20 77 68 65 6e 20 74 68  example) when th
219e0 65 20 70 61 67 65 20 69 73 20 62 65 69 6e 67 20  e page is being 
219f0 6d 6f 76 65 64 20 74 6f 20 74 68 65 20 66 72 65  moved to the fre
21a00 65 6c 69 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a  elist.  But.  **
21a10 20 6e 6f 77 20 77 65 20 61 72 65 20 28 70 65 72   now we are (per
21a20 68 61 70 73 29 20 6d 6f 76 69 6e 67 20 74 68 65  haps) moving the
21a30 20 70 61 67 65 20 6f 66 66 20 6f 66 20 74 68 65   page off of the
21a40 20 66 72 65 65 6c 69 73 74 20 66 6f 72 0a 20 20   freelist for.  
21a50 2a 2a 20 72 65 75 73 65 20 61 6e 64 20 77 65 20  ** reuse and we 
21a60 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73  need to know its
21a70 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e   original conten
21a80 74 20 73 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e  t so that conten
21a90 74 0a 20 20 2a 2a 20 63 61 6e 20 62 65 20 73 74  t.  ** can be st
21aa0 6f 72 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c  ored in the roll
21ab0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53  back journal.  S
21ac0 6f 20 64 6f 20 74 68 65 20 72 65 61 64 20 61 74  o do the read at
21ad0 20 74 68 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e   this.  ** time.
21ae0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
21af0 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
21b00 50 67 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Pg);.  if( rc ){
21b10 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
21b20 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74    }..  /* Mark t
21b30 68 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79  he page as dirty
21b40 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68  .  If the page h
21b50 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
21b60 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20  written.  ** to 
21b70 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e  the journal then
21b80 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72   we can return r
21b90 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a  ight away..  */.
21ba0 20 20 6d 61 6b 65 44 69 72 74 79 28 70 50 67 29    makeDirty(pPg)
21bb0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a  ;.  if( pPg->inJ
21bc0 6f 75 72 6e 61 6c 20 26 26 20 28 70 61 67 65 49  ournal && (pageI
21bd0 6e 53 74 61 74 65 6d 65 6e 74 28 70 50 67 29 20  nStatement(pPg) 
21be0 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  || pPager->stmtI
21bf0 6e 55 73 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20  nUse==0) ){.    
21c00 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
21c10 68 65 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  he = 1;.  }else{
21c20 0a 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 67  ..    /* If we g
21c30 65 74 20 74 68 69 73 20 66 61 72 2c 20 69 74 20  et this far, it 
21c40 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
21c50 61 67 65 20 6e 65 65 64 73 20 74 6f 20 62 65 0a  age needs to be.
21c60 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 20 74      ** written t
21c70 6f 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  o the transactio
21c80 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65  n journal or the
21c90 20 63 6b 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72   ckeckpoint jour
21ca0 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f  nal.    ** or bo
21cb0 74 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  th..    **.    *
21cc0 2a 20 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f  * First check to
21cd0 20 73 65 65 20 74 68 61 74 20 74 68 65 20 74 72   see that the tr
21ce0 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
21cf0 6c 20 65 78 69 73 74 73 20 61 6e 64 0a 20 20 20  l exists and.   
21d00 20 2a 2a 20 63 72 65 61 74 65 20 69 74 20 69 66   ** create it if
21d10 20 69 74 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20   it does not..  
21d20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
21d30 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
21d40 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
21d50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
21d60 50 61 67 65 72 42 65 67 69 6e 28 70 50 67 2c 20  PagerBegin(pPg, 
21d70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
21d80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21d90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
21da0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
21db0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
21dc0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
21dd0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
21de0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
21df0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
21e00 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
21e10 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
21e20 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
21e30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
21e40 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
21e50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
21e60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
21e70 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
21e80 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
21e90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
21ea0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
21eb0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
21ec0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
21ed0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
21ee0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
21ef0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
21f00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
21f10 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
21f20 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
21f30 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
21f40 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
21f50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
21f60 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
21f70 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
21f80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
21f90 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
21fa0 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
21fb0 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
21fc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
21fd0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
21fe0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
21ff0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
22000 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
22010 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
22020 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
22030 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
22040 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47  );.          PAG
22050 45 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41  ERTRACE3("JOURNA
22060 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
22070 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22080 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
22090 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
220a0 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
220b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
220c0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
220d0 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 70 50 61 67  te3_malloc( pPag
220e0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
220f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 70            if( !p
22100 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
22110 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22120 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
22130 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22140 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
22150 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52  st->pOrig, PGHDR
22160 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
22170 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
22180 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
22190 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
221a0 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  ksum;.          
221b0 63 68 61 72 20 2a 70 44 61 74 61 32 3b 0a 0a 20  char *pData2;.. 
221c0 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 73           /* We s
221d0 68 6f 75 6c 64 20 6e 65 76 65 72 20 77 72 69 74  hould never writ
221e0 65 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e to the journal
221f0 20 66 69 6c 65 20 74 68 65 20 70 61 67 65 20 74   file the page t
22200 68 61 74 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  hat.          **
22210 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 64 61   contains the da
22220 74 61 62 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54  tabase locks.  T
22230 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  he following ass
22240 65 72 74 20 76 65 72 69 66 69 65 73 0a 20 20 20  ert verifies.   
22250 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 77         ** that w
22260 65 20 64 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20  e do not. */.   
22270 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
22280 50 67 2d 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f  Pg->pgno!=PAGER_
22290 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
222a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44 61  );.          pDa
222b0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
222c0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
222d0 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
222e0 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61 67       cksum = pag
222f0 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72 2c  er_cksum(pPager,
22300 20 28 75 38 2a 29 70 44 61 74 61 32 29 3b 0a 20   (u8*)pData2);. 
22310 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
22320 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
22330 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
22340 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50 67 2d 3e  ournalOff, pPg->
22350 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
22360 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
22370 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
22380 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
22390 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
223a0 64 2c 20 70 44 61 74 61 32 2c 20 70 50 61 67 65  d, pData2, pPage
223b0 72 2d 3e 70 61 67 65 53 69 7a 65 2c 0a 20 20 20  r->pageSize,.   
223c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
223d0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
223e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
223f0 2b 20 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20  + 4);.          
22400 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
22410 6c 4f 66 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e  lOff += pPager->
22420 70 61 67 65 53 69 7a 65 2b 34 3b 0a 20 20 20 20  pageSize+4;.    
22430 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22440 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
22450 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
22460 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
22470 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
22480 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22490 4f 66 66 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 20  Off, cksum);.   
224a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
224b0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
224c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
224d0 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28          IOTRACE(
224e0 28 22 4a 4f 55 54 20 25 70 20 25 64 20 25 6c 6c  ("JOUT %p %d %ll
224f0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
22500 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 0a 20 20 20   pPg->pgno, .   
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
22530 66 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ff, pPager->page
22540 53 69 7a 65 29 29 3b 0a 20 20 20 20 20 20 20 20  Size));.        
22550 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
22560 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74 65  ite3_pager_write
22570 6a 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  j_count);.      
22580 20 20 20 20 50 41 47 45 52 54 52 41 43 45 35 28      PAGERTRACE5(
22590 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
225a0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 20   %d needSync=%d 
225b0 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20  hash(%08x)\n",. 
225c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
225d0 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
225e0 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
225f0 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72 5f 70  eedSync, pager_p
22600 61 67 65 68 61 73 68 28 70 50 67 29 29 3b 0a 0a  agehash(pPg));..
22610 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
22620 65 72 72 6f 72 20 68 61 73 20 6f 63 63 75 72 65  error has occure
22630 64 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65  d writing to the
22640 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
22650 68 65 20 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  he .          **
22660 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
22670 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  l be rolled back
22680 20 62 79 20 74 68 65 20 6c 61 79 65 72 20 61 62   by the layer ab
22690 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ove..          *
226a0 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
226b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
226c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
226d0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
226e0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 70    }..          p
226f0 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20  Pager->nRec++;. 
22700 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
22710 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
22720 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  nal!=0 );.      
22730 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
22740 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
22750 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
22760 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20  pgno&7);.       
22770 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
22780 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = !pPager->noSy
22790 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  nc;.          if
227a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
227b0 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Use ){.         
227c0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
227d0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
227e0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
227f0 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  &7);.          }
22800 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
22810 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
22820 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
22830 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
22840 53 74 61 72 74 65 64 20 26 26 20 21 70 50 61 67  Started && !pPag
22850 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20  er->noSync;.    
22860 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
22870 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20  "APPEND %d page 
22880 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
22890 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
228a0 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
228b0 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
228c0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20  Pg->needSync);. 
228d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
228e0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
228f0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
22900 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
22910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
22920 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
22930 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
22940 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65  * If the stateme
22950 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  nt journal is op
22960 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20  en and the page 
22970 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20  is not in it,.  
22980 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20    ** then write 
22990 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65  the current page
229a0 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e   to the statemen
229b0 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65  t journal.  Note
229c0 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65   that.    ** the
229d0 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
229e0 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72  al format differ
229f0 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64  s from the stand
22a00 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ard journal form
22a10 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61  at.    ** in tha
22a20 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63  t it omits the c
22a30 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65  hecksums and the
22a40 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a   header..    */.
22a50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22a60 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20 20 20  stmtInUse .     
22a70 26 26 20 21 70 61 67 65 49 6e 53 74 61 74 65 6d  && !pageInStatem
22a80 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20 20 26  ent(pPg) .     &
22a90 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
22aa0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
22ab0 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  ze .    ){.     
22ac0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e   assert( pPg->in
22ad0 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29  Journal || (int)
22ae0 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72  pPg->pgno>pPager
22af0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
22b00 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
22b10 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
22b20 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
22b30 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
22b40 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
22b50 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
22b60 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20  >pStmt==0 );.   
22b70 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d       pHist->pStm
22b80 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  t = sqlite3_mall
22b90 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  oc( pPager->page
22ba0 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
22bb0 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
22bc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
22bd0 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d  mcpy(pHist->pStm
22be0 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  t, PGHDR_TO_DATA
22bf0 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
22c00 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
22c10 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41 47 45    }.        PAGE
22c20 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f  RTRACE3("STMT-JO
22c30 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64  URNAL %d page %d
22c40 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
22c50 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
22c60 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65 5f 61  ;.        page_a
22c70 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
22c80 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  pPg);.      }els
22c90 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 6f  e{.        i64 o
22ca0 66 66 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e  ffset = pPager->
22cb0 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50 61 67  stmtNRec*(4+pPag
22cc0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
22cd0 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
22ce0 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61  ta2 = CODEC2(pPa
22cf0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
22d00 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
22d10 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
22d20 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74 66 64  its(pPager->stfd
22d30 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d 3e 70  , offset, pPg->p
22d40 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69 66  gno);.        if
22d50 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
22d60 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
22d70 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
22d80 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70  (pPager->stfd, p
22d90 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70  Data2, pPager->p
22da0 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65 74 2b  ageSize, offset+
22db0 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  4);.        }.  
22dc0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
22dd0 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
22de0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
22df0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
22e00 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
22e10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
22e20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
22e30 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
22e40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22e50 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
22e60 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ++;.        asse
22e70 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
22e80 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  tmt!=0 );.      
22e90 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
22ea0 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
22eb0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
22ec0 37 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  7);.      }.    
22ed0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
22ee0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
22ef0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
22f00 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
22f10 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
22f20 41 47 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20  AGER_SHARED );. 
22f30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
22f40 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
22f50 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
22f60 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
22f70 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
22f80 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
22f90 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
22fa0 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
22fb0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
22fc0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
22fd0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22fe0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
22ff0 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69   This function i
23000 73 20 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61  s used to mark a
23010 20 64 61 74 61 2d 70 61 67 65 20 61 73 20 77 72   data-page as wr
23020 69 74 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20  itable. It uses 
23030 0a 2a 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28  .** pager_write(
23040 29 20 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72  ) to open a jour
23050 6e 61 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20  nal file (if it 
23060 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f  is not already o
23070 70 65 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74  pen).** and writ
23080 65 20 74 68 65 20 70 61 67 65 20 2a 70 44 61 74  e the page *pDat
23090 61 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  a to the journal
230a0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66  ..**.** The diff
230b0 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
230c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  his function and
230d0 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69   pager_write() i
230e0 73 20 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66  s that this.** f
230f0 75 6e 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61  unction also dea
23100 6c 73 20 77 69 74 68 20 74 68 65 20 73 70 65 63  ls with the spec
23110 69 61 6c 20 63 61 73 65 20 77 68 65 72 65 20 32  ial case where 2
23120 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a   or more pages.*
23130 2a 20 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c  * fit on a singl
23140 65 20 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49  e disk sector. I
23150 6e 20 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20  n this case all 
23160 63 6f 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65  co-resident page
23170 73 0a 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62  s.** must have b
23180 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
23190 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
231a0 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67  before returning
231b0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
231c0 50 61 67 65 72 57 72 69 74 65 28 44 62 50 61 67  PagerWrite(DbPag
231d0 65 20 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69  e *pDbPage){.  i
231e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
231f0 4b 3b 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67  K;..  PgHdr *pPg
23200 20 3d 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61   = pDbPage;.  Pa
23210 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
23220 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e  g->pPager;.  Pgn
23230 6f 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  o nPagePerSector
23240 20 3d 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74   = (pPager->sect
23250 6f 72 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70  orSize/pPager->p
23260 61 67 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67  ageSize);..  pag
23270 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
23280 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
23290 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e   nPagePerSector>
232a0 31 20 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50  1 ){.    Pgno nP
232b0 61 67 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20  ageCount;       
232c0 20 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62     /* Total numb
232d0 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64  er of pages in d
232e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
232f0 20 20 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20      Pgno pg1;   
23300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23310 20 46 69 72 73 74 20 70 61 67 65 20 6f 66 20 74   First page of t
23320 68 65 20 73 65 63 74 6f 72 20 70 50 67 20 69 73  he sector pPg is
23330 20 6c 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a   located on. */.
23340 20 20 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20      int nPage;  
23350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23360 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   Number of pages
23370 20 73 74 61 72 74 69 6e 67 20 61 74 20 70 67 31   starting at pg1
23380 20 74 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   to journal */. 
23390 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69     int ii;.    i
233a0 6e 74 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  nt needSync = 0;
233b0 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65  ..    /* Set the
233c0 20 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20   doNotSync flag 
233d0 74 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65  to 1. This is be
233e0 63 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20  cause we cannot 
233f0 61 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a  allow a journal.
23400 20 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f      ** header to
23410 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77   be written betw
23420 65 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f  een the pages jo
23430 75 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20  urnaled by this 
23440 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  function..    */
23450 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
23460 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d  ger->doNotSync==
23470 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
23480 3e 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a  >doNotSync = 1;.
23490 0a 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69  .    /* This tri
234a0 63 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20  ck assumes that 
234b0 62 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69  both the page-si
234c0 7a 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69  ze and sector-si
234d0 7a 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e  ze are.    ** an
234e0 20 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f   integer power o
234f0 66 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72  f 2. It sets var
23500 69 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65  iable pg1 to the
23510 20 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20   identifier.    
23520 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
23530 70 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74  page of the sect
23540 6f 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65  or pPg is locate
23550 64 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  d on..    */.   
23560 20 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67   pg1 = ((pPg->pg
23570 6e 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50  no-1) & ~(nPageP
23580 65 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31  erSector-1)) + 1
23590 3b 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e  ;..    nPageCoun
235a0 74 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  t = sqlite3Pager
235b0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
235c0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  );.    if( pPg->
235d0 70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20  pgno>nPageCount 
235e0 29 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  ){.      nPage =
235f0 20 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67   (pPg->pgno - pg
23600 31 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20  1)+1;.    }else 
23610 69 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65  if( (pg1+nPagePe
23620 72 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65  rSector-1)>nPage
23630 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e  Count ){.      n
23640 50 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e  Page = nPageCoun
23650 74 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c  t+1-pg1;.    }el
23660 73 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20  se{.      nPage 
23670 3d 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72  = nPagePerSector
23680 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
23690 72 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20  rt(nPage>0);.   
236a0 20 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67   assert(pg1<=pPg
236b0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73  ->pgno);.    ass
236c0 65 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e  ert((pg1+nPage)>
236d0 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20  pPg->pgno);..   
236e0 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50   for(ii=0; ii<nP
236f0 61 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  age && rc==SQLIT
23700 45 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  E_OK; ii++){.   
23710 20 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31     Pgno pg = pg1
23720 2b 69 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72  +ii;.      PgHdr
23730 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69   *pPage;.      i
23740 66 28 20 21 70 50 61 67 65 72 2d 3e 61 49 6e 4a  f( !pPager->aInJ
23750 6f 75 72 6e 61 6c 20 7c 7c 20 70 67 3d 3d 70 50  ournal || pg==pP
23760 67 2d 3e 70 67 6e 6f 20 7c 7c 20 0a 20 20 20 20  g->pgno || .    
23770 20 20 20 20 20 20 70 67 3e 70 50 61 67 65 72 2d        pg>pPager-
23780 3e 6f 72 69 67 44 62 53 69 7a 65 20 7c 7c 20 21  >origDbSize || !
23790 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
237a0 6e 61 6c 5b 70 67 2f 38 5d 26 28 31 3c 3c 28 70  nal[pg/8]&(1<<(p
237b0 67 26 37 29 29 29 0a 20 20 20 20 20 20 29 20 7b  g&7))).      ) {
237c0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21  .        if( pg!
237d0 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
237e0 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
237f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
23800 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
23810 20 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20   pg, &pPage);.  
23820 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
23830 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
23840 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
23850 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
23860 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23870 28 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e  ( pPage->needSyn
23880 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  c ){.           
23890 20 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b     needSync = 1;
238a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
238b0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
238c0 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61  e3PagerUnref(pPa
238d0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ge);.          }
238e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
238f0 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67   }else if( (pPag
23900 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  e = pager_lookup
23910 28 70 50 61 67 65 72 2c 20 70 67 29 29 20 29 7b  (pPager, pg)) ){
23920 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61  .        if( pPa
23930 67 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ge->needSync ){.
23940 20 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79            needSy
23950 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
23960 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
23970 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50  .    /* If the P
23980 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  gHdr.needSync fl
23990 61 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e  ag is set for an
239a0 79 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70  y of the nPage p
239b0 61 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61  ages .    ** sta
239c0 72 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68  rting at pg1, th
239d0 65 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  en it needs to b
239e0 65 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66  e set for all of
239f0 20 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20   them. Because. 
23a00 20 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f     ** writing to
23a10 20 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50   any of these nP
23a20 61 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61  age pages may da
23a30 6d 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c  mage the others,
23a40 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72   the.    ** jour
23a50 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f  nal file must co
23a60 6e 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63  ntain sync()ed c
23a70 6f 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20  opies of all of 
23a80 74 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f  them.    ** befo
23a90 72 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63  re any of them c
23aa0 61 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75  an be written ou
23ab0 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  t to the databas
23ac0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
23ad0 20 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20     if( needSync 
23ae0 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d  ){.      for(ii=
23af0 30 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e  0; ii<nPage && n
23b00 65 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a  eedSync; ii++){.
23b10 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70          PgHdr *p
23b20 50 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f  Page = pager_loo
23b30 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b  kup(pPager, pg1+
23b40 69 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ii);.        if(
23b50 20 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e   pPage ) pPage->
23b60 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
23b70 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
23b80 72 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  rt(pPager->needS
23b90 79 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ync);.    }..   
23ba0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23bb0 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b  >doNotSync==1 );
23bc0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e  .    pPager->doN
23bd0 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65  otSync = 0;.  }e
23be0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  lse{.    rc = pa
23bf0 67 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67  ger_write(pDbPag
23c00 65 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c  e);.  }.  pagerL
23c10 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
23c20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
23c30 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
23c40 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
23c50 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
23c60 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
23c70 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
23c80 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28  lite3PagerWrite(
23c90 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  ).  In other wor
23ca0 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20  ds, return TRUE 
23cb0 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74  if it is ok.** t
23cc0 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e  o change the con
23cd0 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
23ce0 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45  ..*/.#ifndef NDE
23cf0 42 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  BUG.int sqlite3P
23d00 61 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28  agerIswriteable(
23d10 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
23d20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74  return pPg->dirt
23d30 79 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y;.}.#endif..#if
23d40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
23d50 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65  _VACUUM./*.** Re
23d60 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e  place the conten
23d70 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61  t of a single pa
23d80 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f  ge with the info
23d90 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74  rmation in the t
23da0 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  hird.** argument
23db0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23dc0 50 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50  PagerOverwrite(P
23dd0 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
23de0 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70  no pgno, void *p
23df0 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
23e00 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
23e10 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
23e20 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ger);.  rc = sql
23e30 69 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61  ite3PagerGet(pPa
23e40 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29  ger, pgno, &pPg)
23e50 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
23e60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
23e70 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  = sqlite3PagerWr
23e80 69 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ite(pPg);.    if
23e90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23ea0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
23eb0 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44  sqlite3PagerGetD
23ec0 61 74 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c  ata(pPg), pData,
23ed0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
23ee0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
23ef0 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
23f00 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  pPg);.  }.  page
23f10 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
23f20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23    return rc;.}.#
23f30 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  endif../*.** A c
23f40 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
23f50 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
23f60 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e  ger that it is n
23f70 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a  ot necessary to.
23f80 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66  ** write the inf
23f90 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65  ormation on page
23fa0 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65   pPg back to the
23fb0 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
23fc0 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
23fd0 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
23fe0 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
23ff0 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
24000 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
24010 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
24020 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
24030 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
24040 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
24050 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
24060 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
24070 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
24080 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
24090 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
240a0 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
240b0 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
240c0 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
240d0 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
240e0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
240f0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  ntRollback() bel
24100 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
24110 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
24120 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
24130 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
24140 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
24150 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
24160 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
24170 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
24180 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
24190 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
241a0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
241b0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
241c0 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67  ls to sqlite3Pag
241d0 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29  erDontRollback()
241e0 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61   for the same pa
241f0 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65  ge.** will there
24200 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64  after be ignored
24210 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73  .  This is neces
24220 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20  sary to avoid a 
24230 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65  problem.** where
24240 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74   a page with dat
24250 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68  a is added to th
24260 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e  e freelist durin
24270 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a  g one part of.**
24280 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74   a transaction t
24290 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d  hen removed from
242a0 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75   the freelist du
242b0 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72  ring a later par
242c0 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65  t.** of the same
242d0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
242e0 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65   reused for some
242f0 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20   other purpose. 
24300 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66   When it.** is f
24310 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68  irst added to th
24320 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73  e freelist, this
24330 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
24340 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64  ed.  When reused
24350 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33  ,.** the sqlite3
24360 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
24370 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63  k() routine is c
24380 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61  alled.  But beca
24390 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20  use the.** page 
243a0 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61  contains critica
243b0 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c  l data, we still
243c0 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65   need to be sure
243d0 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c   it gets.** roll
243e0 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65  ed back in spite
243f0 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50   of the sqlite3P
24400 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
24410 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64  () call..*/.void
24420 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
24430 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70  tWrite(DbPage *p
24440 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72  DbPage){.  PgHdr
24450 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b   *pPg = pDbPage;
24460 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24470 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
24480 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
24490 65 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e  eturn;.  pagerEn
244a0 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70  ter(pPager);.  p
244b0 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
244c0 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
244d0 67 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61  g->dirty && !pPa
244e0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29  ger->stmtInUse )
244f0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
24500 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
24510 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
24520 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
24530 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
24540 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
24550 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
24560 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
24570 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
24580 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
24590 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
245a0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
245b0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
245c0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
245d0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
245e0 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
245f0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
24600 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
24610 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
24620 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
24630 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
24640 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
24650 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
24660 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
24670 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
24680 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
24690 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
246a0 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
246b0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
246c0 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
246d0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
246e0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
246f0 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
24700 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
24710 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
24720 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
24730 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
24740 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
24750 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
24760 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
24770 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43  .      PAGERTRAC
24780 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
24790 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
247a0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45   pPg->pgno, PAGE
247b0 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
247c0 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c      IOTRACE(("CL
247d0 45 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  EAN %p %d\n", pP
247e0 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ager, pPg->pgno)
247f0 29 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61  ).      makeClea
24800 6e 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53  n(pPg);.#ifdef S
24810 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
24820 53 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67  S.      pPg->pag
24830 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
24840 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
24850 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  dif.    }.  }.  
24860 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
24870 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63  r);.}../*.** A c
24880 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
24890 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
248a0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
248b0 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
248c0 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
248d0 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
248e0 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
248f0 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
24900 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
24910 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
24920 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
24930 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
24940 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
24950 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
24960 0a 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e  .** If we have n
24970 6f 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20  ot yet actually 
24980 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  read the content
24990 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69   of this page (i
249a0 66 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e  f.** the PgHdr.n
249b0 65 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20  eedRead flag is 
249c0 73 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72  set) then this r
249d0 6f 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61  outine acts as a
249e0 20 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74   promise.** that
249f0 20 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e   we will never n
24a00 65 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20  eed to read the 
24a10 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20  page content in 
24a20 74 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73  the future..** s
24a30 6f 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66  o the needRead f
24a40 6c 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72  lag can be clear
24a50 65 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  ed at this point
24a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
24a70 74 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c  tine is only cal
24a80 6c 65 64 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c  led from a singl
24a90 65 20 70 6c 61 63 65 20 69 6e 20 74 68 65 20 73  e place in the s
24aa0 71 6c 69 74 65 20 62 74 72 65 65 0a 2a 2a 20 63  qlite btree.** c
24ab0 6f 64 65 20 28 77 68 65 6e 20 61 20 6c 65 61 66  ode (when a leaf
24ac0 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
24ad0 20 74 68 65 20 66 72 65 65 2d 6c 69 73 74 29 2e   the free-list).
24ae0 20 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65   This allows the
24af0 0a 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73  .** following as
24b00 73 75 6d 70 74 69 6f 6e 73 20 74 6f 20 62 65 20  sumptions to be 
24b10 6d 61 64 65 20 61 62 6f 75 74 20 70 50 67 3a 0a  made about pPg:.
24b20 2a 2a 0a 2a 2a 20 20 20 31 2e 20 50 61 67 65 72  **.**   1. Pager
24b30 44 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20  DontWrite() has 
24b40 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74  been called on t
24b50 68 65 20 70 61 67 65 2c 20 4f 52 20 0a 2a 2a 20  he page, OR .** 
24b60 20 20 20 20 20 50 61 67 65 72 57 72 69 74 65 28       PagerWrite(
24b70 29 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65  ) has not yet be
24b80 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65  en called on the
24b90 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32   page..**.**   2
24ba0 2e 20 54 68 65 20 70 61 67 65 20 65 78 69 73 74  . The page exist
24bb0 65 64 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e  ed when the tran
24bc0 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72  saction was star
24bd0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69  ted..**.** Detai
24be0 6c 73 3a 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  ls: DontRollback
24bf0 28 29 20 28 74 68 69 73 20 72 6f 75 74 69 6e 65  () (this routine
24c00 29 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64  ) is only called
24c10 20 77 68 65 6e 20 61 20 6c 65 61 66 20 69 73 0a   when a leaf is.
24c20 2a 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  ** removed from 
24c30 74 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 44  the free list. D
24c40 6f 6e 74 57 72 69 74 65 28 29 20 69 73 20 63 61  ontWrite() is ca
24c50 6c 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20  lled whenever a 
24c60 70 61 67 65 20 0a 2a 2a 20 62 65 63 6f 6d 65 73  page .** becomes
24c70 20 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61   a free-list lea
24c80 66 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  f..*/.void sqlit
24c90 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62  e3PagerDontRollb
24ca0 61 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29  ack(DbPage *pPg)
24cb0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
24cc0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
24cd0 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ..  pagerEnter(p
24ce0 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74  Pager);.  assert
24cf0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
24d00 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
24d10 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
24d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
24d30 6e 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e  not open, or Don
24d40 74 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65  tWrite() has bee
24d50 6e 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a  n called on.  **
24d60 20 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74   this page (Dont
24d70 57 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65  Write() sets the
24d80 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
24d90 66 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73  flag), then this
24da0 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69  .  ** function i
24db0 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a  s a no-op..  */.
24dc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f    if( pPager->jo
24dd0 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20  urnalOpen==0 || 
24de0 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  pPg->alwaysRollb
24df0 61 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61  ack || pPager->a
24e00 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
24e10 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
24e20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
24e30 75 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72  urn;.  }.  asser
24e40 74 28 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20  t( !MEMDB );    
24e50 2f 2a 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20  /* For a memdb, 
24e60 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
24e70 70 65 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20  pen is always 0 
24e80 2a 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74  */..  /* Check t
24e90 68 61 74 20 50 61 67 65 72 57 72 69 74 65 28 29  hat PagerWrite()
24ea0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
24eb0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73  n called on this
24ec0 20 70 61 67 65 2c 20 61 6e 64 0a 20 20 2a 2a 20   page, and.  ** 
24ed0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78  that the page ex
24ee0 69 73 74 65 64 20 77 68 65 6e 20 74 68 65 20 74  isted when the t
24ef0 72 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74  ransaction start
24f00 65 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  ed..  */.  asser
24f10 74 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  t( !pPg->inJourn
24f20 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  al && (int)pPg->
24f30 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
24f40 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20  origDbSize );.. 
24f50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
24f60 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29  >aInJournal!=0 )
24f70 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ;.  pPager->aInJ
24f80 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
24f90 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
24fa0 70 67 6e 6f 26 37 29 3b 0a 20 20 70 50 67 2d 3e  pgno&7);.  pPg->
24fb0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
24fc0 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d   pPg->needRead =
24fd0 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   0;.  if( pPager
24fe0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20  ->stmtInUse ){. 
24ff0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
25000 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3c 3d 20 70  r->stmtSize <= p
25010 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
25020 65 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  e );.    pPager-
25030 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
25040 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
25050 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a 20  ->pgno&7);.  }. 
25060 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44 4f   PAGERTRACE3("DO
25070 4e 54 5f 52 4f 4c 4c 42 41 43 4b 20 70 61 67 65  NT_ROLLBACK page
25080 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50   %d of %d\n", pP
25090 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  g->pgno, PAGERID
250a0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 49 4f 54  (pPager));.  IOT
250b0 52 41 43 45 28 28 22 47 41 52 42 41 47 45 20 25  RACE(("GARBAGE %
250c0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
250d0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 70   pPg->pgno)).  p
250e0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
250f0 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  );.}.../*.** Thi
25100 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
25110 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74  led to increment
25120 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
25130 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65  le change-counte
25140 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20  r,.** stored at 
25150 62 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70  byte 24 of the p
25160 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74  ager file..*/.st
25170 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69  atic int pager_i
25180 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65  ncr_changecounte
25190 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
251a0 20 69 6e 74 20 69 73 44 69 72 65 63 74 29 7b 0a   int isDirect){.
251b0 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
251c0 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
251d0 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 20  unter;.  int rc 
251e0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20  = SQLITE_OK;..  
251f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 63 68 61  if( !pPager->cha
25200 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 29 7b 0a  ngeCountDone ){.
25210 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65      /* Open page
25220 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
25230 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
25240 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25250 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
25260 31 2c 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20  1, &pPgHdr);.   
25270 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
25280 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
25290 0a 20 20 20 20 69 66 28 20 21 69 73 44 69 72 65  .    if( !isDire
252a0 63 74 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  ct ){.      rc =
252b0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
252c0 74 65 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20  te(pPgHdr);.    
252d0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
252e0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 73  _OK ){.        s
252f0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
25300 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 20 20  (pPgHdr);.      
25310 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
25320 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
25330 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
25340 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64   value just read
25350 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62 61   and write it ba
25360 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a  ck to byte 24. *
25370 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75  /.    change_cou
25380 6e 74 65 72 20 3d 20 73 71 6c 69 74 65 33 47 65  nter = sqlite3Ge
25390 74 34 62 79 74 65 28 28 75 38 2a 29 70 50 61 67  t4byte((u8*)pPag
253a0 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 3b  er->dbFileVers);
253b0 0a 20 20 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  .    change_coun
253c0 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75 74 33 32  ter++;.    put32
253d0 62 69 74 73 28 28 28 63 68 61 72 2a 29 50 47 48  bits(((char*)PGH
253e0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 48 64  DR_TO_DATA(pPgHd
253f0 72 29 29 2b 32 34 2c 20 63 68 61 6e 67 65 5f 63  r))+24, change_c
25400 6f 75 6e 74 65 72 29 3b 0a 0a 20 20 20 20 69 66  ounter);..    if
25410 28 20 69 73 44 69 72 65 63 74 20 26 26 20 70 50  ( isDirect && pP
25420 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65 74 68 6f  ager->fd->pMetho
25430 64 73 20 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  ds ){.      cons
25440 74 20 76 6f 69 64 20 2a 7a 42 75 66 20 3d 20 50  t void *zBuf = P
25450 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
25460 48 64 72 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Hdr);.      rc =
25470 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
25480 70 50 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66  pPager->fd, zBuf
25490 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
254a0 7a 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20  ze, 0);.    }.. 
254b0 20 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68     /* Release th
254c0 65 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65  e page reference
254d0 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
254e0 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 48 64  PagerUnref(pPgHd
254f0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
25500 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
25510 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
25520 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
25530 79 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65  ync the database
25540 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61   file for the pa
25550 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73  ger pPager. zMas
25560 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68  ter points to th
25570 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d  e name.** of a m
25580 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
25590 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62  le that should b
255a0 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  e written into t
255b0 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a  he individual.**
255c0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a   journal file. z
255d0 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55  Master may be NU
255e0 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74  LL, which is int
255f0 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d  erpreted as no m
25600 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  aster.** journal
25610 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62   (a single datab
25620 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29  ase transaction)
25630 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
25640 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61  tine ensures tha
25650 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  t the journal is
25660 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72   synced, all dir
25670 74 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e  ty pages written
25680 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62  .** to the datab
25690 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  ase file and the
256a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73   database file s
256b0 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20  ynced. The only 
256c0 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65  thing that.** re
256d0 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20  mains to commit 
256e0 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
256f0 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65  is to delete the
25700 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f   journal file (o
25710 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  r.** master jour
25720 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63  nal file if spec
25730 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  ified)..**.** No
25740 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74  te that if zMast
25750 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64  er==NULL, this d
25760 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74  oes not overwrit
25770 65 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c  e a previous val
25780 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20  ue.** passed to 
25790 61 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  an sqlite3PagerC
257a0 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28 29 20  ommitPhaseOne() 
257b0 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  call..**.** If p
257c0 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63 20  arameter nTrunc 
257d0 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
257e0 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  n the pager file
257f0 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74 6f   is truncated to
25800 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65 73  .** nTrunc pages
25810 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20 62   (this is used b
25820 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64 61  y auto-vacuum da
25830 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e 74  tabases)..*/.int
25840 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d   sqlite3PagerCom
25850 6d 69 74 50 68 61 73 65 4f 6e 65 28 50 61 67 65  mitPhaseOne(Page
25860 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
25870 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
25880 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
25890 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
258a0 4f 4b 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43  OK;..  PAGERTRAC
258b0 45 34 28 22 44 41 54 41 42 41 53 45 20 53 59 4e  E4("DATABASE SYN
258c0 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d 61 73 74  C: File=%s zMast
258d0 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d 25 64 5c  er=%s nTrunc=%d\
258e0 6e 22 2c 20 0a 20 20 20 20 20 20 70 50 61 67 65  n", .      pPage
258f0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 4d  r->zFilename, zM
25900 61 73 74 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  aster, nTrunc);.
25910 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
25920 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  ger);..  /* If t
25930 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d  his is an in-mem
25940 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61  ory db, or no pa
25950 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72  ges have been wr
25960 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69  itten to, or thi
25970 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  s.  ** function 
25980 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
25990 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61   called, it is a
259a0 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69   no-op..  */.  i
259b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
259c0 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26  !=PAGER_SYNCED &
259d0 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  & !MEMDB && pPag
259e0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
259f0 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67  {.    PgHdr *pPg
25a00 3b 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ;..#ifdef SQLITE
25a10 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d 49 43 5f 57  _ENABLE_ATOMIC_W
25a20 52 49 54 45 0a 20 20 20 20 2f 2a 20 54 68 65 20  RITE.    /* The 
25a30 61 74 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74  atomic-write opt
25a40 69 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65  imization can be
25a50 20 75 73 65 64 20 69 66 20 61 6c 6c 20 6f 66 20   used if all of 
25a60 74 68 65 0a 20 20 20 20 2a 2a 20 66 6f 6c 6c 6f  the.    ** follo
25a70 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 20  wing are true:. 
25a80 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20     **.    **    
25a90 2b 20 54 68 65 20 66 69 6c 65 2d 73 79 73 74 65  + The file-syste
25aa0 6d 20 73 75 70 70 6f 72 74 73 20 74 68 65 20 61  m supports the a
25ab0 74 6f 6d 69 63 2d 77 72 69 74 65 20 70 72 6f 70  tomic-write prop
25ac0 65 72 74 79 20 66 6f 72 0a 20 20 20 20 2a 2a 20  erty for.    ** 
25ad0 20 20 20 20 20 62 6c 6f 63 6b 73 20 6f 66 20 73       blocks of s
25ae0 69 7a 65 20 70 61 67 65 2d 73 69 7a 65 2c 20 61  ize page-size, a
25af0 6e 64 0a 20 20 20 20 2a 2a 20 20 20 20 2b 20 54  nd.    **    + T
25b00 68 69 73 20 63 6f 6d 6d 69 74 20 69 73 20 6e 6f  his commit is no
25b10 74 20 70 61 72 74 20 6f 66 20 61 20 6d 75 6c 74  t part of a mult
25b20 69 2d 66 69 6c 65 20 74 72 61 6e 73 61 63 74 69  i-file transacti
25b30 6f 6e 2c 20 61 6e 64 0a 20 20 20 20 2a 2a 20 20  on, and.    **  
25b40 20 20 2b 20 45 78 61 63 74 6c 79 20 6f 6e 65 20    + Exactly one 
25b50 70 61 67 65 20 68 61 73 20 62 65 65 6e 20 6d 6f  page has been mo
25b60 64 69 66 69 65 64 20 61 6e 64 20 73 74 6f 72 65  dified and store
25b70 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
25b80 66 69 6c 65 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  file..    **.   
25b90 20 2a 2a 20 49 66 20 74 68 65 20 6f 70 74 69 6d   ** If the optim
25ba0 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  ization can be u
25bb0 73 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  sed, then the jo
25bc0 75 72 6e 61 6c 20 66 69 6c 65 20 77 69 6c 6c 20  urnal file will 
25bd0 6e 65 76 65 72 0a 20 20 20 20 2a 2a 20 62 65 20  never.    ** be 
25be0 63 72 65 61 74 65 64 20 66 6f 72 20 74 68 69 73  created for this
25bf0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
25c00 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 75 73 65    */.    int use
25c10 41 74 6f 6d 69 63 57 72 69 74 65 20 3d 20 28 0a  AtomicWrite = (.
25c20 20 20 20 20 20 20 20 20 21 7a 4d 61 73 74 65 72          !zMaster
25c30 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
25c40 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
25c50 3d 6a 72 6e 6c 42 75 66 66 65 72 53 69 7a 65 28  =jrnlBufferSize(
25c60 70 50 61 67 65 72 29 20 26 26 20 0a 20 20 20 20  pPager) && .    
25c70 20 20 20 20 6e 54 72 75 6e 63 3d 3d 30 20 26 26      nTrunc==0 &&
25c80 20 0a 20 20 20 20 20 20 20 20 28 30 3d 3d 70 50   .        (0==pP
25c90 61 67 65 72 2d 3e 70 44 69 72 74 79 20 7c 7c 20  ager->pDirty || 
25ca0 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69 72 74  0==pPager->pDirt
25cb0 79 2d 3e 70 44 69 72 74 79 29 0a 20 20 20 20 29  y->pDirty).    )
25cc0 3b 0a 20 20 20 20 69 66 28 20 75 73 65 41 74 6f  ;.    if( useAto
25cd0 6d 69 63 57 72 69 74 65 20 29 7b 0a 20 20 20 20  micWrite ){.    
25ce0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
25cf0 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
25d00 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
25d10 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6f 66 66  */.      int off
25d20 73 65 74 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  set = pPager->jo
25d30 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f  urnalHdr + sizeo
25d40 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29  f(aJournalMagic)
25d50 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
25d60 50 61 67 65 72 2d 3e 6e 52 65 63 3d 3d 31 29 3b  Pager->nRec==1);
25d70 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
25d80 65 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e  e32bits(pPager->
25d90 6a 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 61  jfd, offset, pPa
25da0 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 0a 20 20 20  ger->nRec);..   
25db0 20 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65     /* Update the
25dc0 20 64 62 20 66 69 6c 65 20 63 68 61 6e 67 65 20   db file change 
25dd0 63 6f 75 6e 74 65 72 2e 20 54 68 65 20 66 6f 6c  counter. The fol
25de0 6c 6f 77 69 6e 67 20 63 61 6c 6c 20 77 69 6c 6c  lowing call will
25df0 20 6d 6f 64 69 66 79 0a 20 20 20 20 20 20 2a 2a   modify.      **
25e00 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 72   the in-memory r
25e10 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
25e20 20 70 61 67 65 20 31 20 74 6f 20 69 6e 63 6c 75   page 1 to inclu
25e30 64 65 20 74 68 65 20 75 70 64 61 74 65 64 0a 20  de the updated. 
25e40 20 20 20 20 20 2a 2a 20 63 68 61 6e 67 65 20 63       ** change c
25e50 6f 75 6e 74 65 72 20 61 6e 64 20 74 68 65 6e 20  ounter and then 
25e60 77 72 69 74 65 20 70 61 67 65 20 31 20 64 69 72  write page 1 dir
25e70 65 63 74 6c 79 20 74 6f 20 74 68 65 20 64 61 74  ectly to the dat
25e80 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 66  abase.      ** f
25e90 69 6c 65 2e 20 42 65 63 61 75 73 65 20 6f 66 20  ile. Because of 
25ea0 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69 74 65  the atomic-write
25eb0 20 70 72 6f 70 65 72 74 79 20 6f 66 20 74 68 65   property of the
25ec0 20 68 6f 73 74 20 66 69 6c 65 2d 73 79 73 74 65   host file-syste
25ed0 6d 2c 20 0a 20 20 20 20 20 20 2a 2a 20 74 68 69  m, .      ** thi
25ee0 73 20 69 73 20 73 61 66 65 2e 0a 20 20 20 20 20  s is safe..     
25ef0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 72 63   */.      if( rc
25f00 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25f10 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
25f20 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
25f30 6e 74 65 72 28 70 50 61 67 65 72 2c 20 31 29 3b  nter(pPager, 1);
25f40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
25f50 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  se{.      rc = s
25f60 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 43 72 65  qlite3JournalCre
25f70 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29  ate(pPager->jfd)
25f80 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25f90 20 21 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65   !useAtomicWrite
25fa0 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f   && rc==SQLITE_O
25fb0 4b 20 29 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20  K ).#endif..    
25fc0 2f 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a  /* If a master j
25fd0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
25fe0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
25ff0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
26000 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  .    ** journal 
26010 66 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79  file, then no sy
26020 6e 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  nc is required. 
26030 54 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65  This happens whe
26040 6e 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77  n it is.    ** w
26050 72 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65  ritten, then the
26060 20 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74   process fails t
26070 6f 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61  o upgrade from a
26080 20 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a   RESERVED to an.
26090 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
260a0 20 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20   lock. The next 
260b0 74 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73  time the process
260c0 20 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74   tries to commit
260d0 20 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e   the.    ** tran
260e0 73 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20  saction the m-j 
260f0 6e 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61  name will have a
26100 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
26110 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
26120 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74  if( !pPager->set
26130 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20  Master ){.      
26140 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
26150 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
26160 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
26170 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74  incr_changecount
26180 65 72 28 70 50 61 67 65 72 2c 20 30 29 3b 0a 20  er(pPager, 0);. 
26190 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
261a0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
261b0 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
261c0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
261d0 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
261e0 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
261f0 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
26200 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
26210 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
26220 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
26230 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
26240 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
26250 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
26260 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
26270 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
26280 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
26290 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
262a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
262b0 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
262c0 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
262d0 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
262e0 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
262f0 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
26300 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
26310 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
26320 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
26330 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
26340 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
26350 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
26360 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
26370 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
26380 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
26390 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
263a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
263b0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
263c0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
263d0 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
263e0 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
263f0 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
26400 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
26410 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
26420 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
26430 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
26440 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
26450 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
26460 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
26470 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
26480 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
26490 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
264a0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
264b0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
264c0 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
264d0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d  l(pPager);.    }
264e0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
264f0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26500 6e 63 5f 65 78 69 74 3b 0a 0a 23 69 66 6e 64 65  nc_exit;..#ifnde
26510 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26520 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
26530 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
26540 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
26550 50 61 67 65 72 54 72 75 6e 63 61 74 65 28 70 50  PagerTruncate(pP
26560 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20  ager, nTrunc);. 
26570 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
26580 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
26590 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23  nc_exit;.    }.#
265a0 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72  endif..    /* Wr
265b0 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61  ite all dirty pa
265c0 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62  ges to the datab
265d0 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20  ase file */.    
265e0 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f  pPg = pager_get_
265f0 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28  all_dirty_pages(
26600 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20  pPager);.    rc 
26610 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
26620 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20  gelist(pPg);.   
26630 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
26640 4f 4b 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c  OK ){.      whil
26650 65 28 20 70 50 67 20 26 26 20 21 70 50 67 2d 3e  e( pPg && !pPg->
26660 64 69 72 74 79 20 29 7b 20 70 50 67 20 3d 20 70  dirty ){ pPg = p
26670 50 67 2d 3e 70 44 69 72 74 79 3b 20 7d 0a 20 20  Pg->pDirty; }.  
26680 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
26690 74 79 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ty = pPg;.      
266a0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
266b0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
266c0 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20  ->pDirty = 0;.. 
266d0 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
266e0 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
266f0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
26700 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
26710 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
26720 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c  Sync(pPager->fd,
26730 20 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c   pPager->sync_fl
26740 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ags);.    }.    
26750 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
26760 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
26770 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
26780 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
26790 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
267a0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
267b0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
267c0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
267d0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
267e0 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
267f0 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
26800 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
26810 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
26820 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
26830 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
26840 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
26850 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
26860 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
26870 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
26880 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
26890 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
268a0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
268b0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
268c0 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
268d0 65 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20  ent, it is.     
268e0 2a 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75  * better to retu
268f0 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a  rn SQLITE_BUSY..
26900 20 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d       */.    rc =
26910 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
26920 7d 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70  }.  pagerLeave(p
26930 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
26940 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43   rc;.}.../*.** C
26950 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
26960 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
26970 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
26980 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
26990 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
269a0 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
269b0 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
269c0 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
269d0 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
269e0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
269f0 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
26a00 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
26a10 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
26a20 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
26a30 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
26a40 68 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70  haseTwo(Pager *p
26a50 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
26a60 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  ;.  PgHdr *pPg;.
26a70 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
26a80 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65  rrCode ){.    re
26a90 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
26aa0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
26ab0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41  pPager->state<PA
26ac0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
26ad0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
26ae0 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70  E_ERROR;.  }.  p
26af0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
26b00 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
26b10 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
26b20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
26b30 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
26b40 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
26b50 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
26b60 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
26b70 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
26b80 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
26b90 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
26ba0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
26bb0 65 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72  er);.      clear
26bc0 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
26bd0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
26be0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
26bf0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
26c00 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53        pHist->inS
26c10 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
26c20 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
26c30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70  ;.      pHist->p
26c40 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74  PrevStmt = pHist
26c50 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
26c60 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
26c70 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
26c80 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
26c90 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20  ty = 0;.#ifndef 
26ca0 4e 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70  NDEBUG.    for(p
26cb0 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
26cc0 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
26cd0 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
26ce0 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
26cf0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
26d00 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
26d10 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
26d20 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
26d30 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
26d40 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
26d50 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
26d60 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
26d70 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
26d80 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d      pPager->pStm
26d90 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  t = 0;.    pPage
26da0 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
26db0 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67  _SHARED;.    pag
26dc0 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b  erLeave(pPager);
26dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
26de0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
26df0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
26e00 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
26e10 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
26e20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
26e30 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
26e40 52 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61  R_SYNCED || !pPa
26e50 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
26e60 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  );.  rc = pager_
26e70 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28  end_transaction(
26e80 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20  pPager);.  rc = 
26e90 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67  pager_error(pPag
26ea0 65 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72  er, rc);.  pager
26eb0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
26ec0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
26ed0 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c  *.** Rollback al
26ee0 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20  l changes.  The 
26ef0 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62  database falls b
26f00 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41  ack to PAGER_SHA
26f10 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c  RED mode..** All
26f20 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
26f30 20 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f   pages revert to
26f40 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20   their original 
26f50 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a  data contents..*
26f60 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  * The journal is
26f70 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
26f80 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e  This routine can
26f90 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20  not fail unless 
26fa0 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
26fb0 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77  ss is not follow
26fc0 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65  ing.** the corre
26fd0 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f  ct locking proto
26fe0 63 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  col or unless so
26ff0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
27000 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
27010 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
27020 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
27030 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
27040 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
27050 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
27060 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
27070 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
27080 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
27090 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
270a0 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
270b0 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
270c0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
270d0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
270e0 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
270f0 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
27100 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
27110 20 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f   PAGERTRACE2("RO
27120 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
27130 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
27140 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
27150 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
27160 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
27170 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
27180 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
27190 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
271a0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
271b0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
271c0 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
271d0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
271e0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
271f0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
27200 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
27210 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
27220 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
27230 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
27240 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
27250 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
27260 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
27270 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
27280 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
27290 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
272a0 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
272b0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
272c0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
272d0 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
272e0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
272f0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
27300 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
27310 43 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41  CE3("ROLLBACK-PA
27320 47 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  GE %d of %d\n", 
27330 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44  p->pgno, PAGERID
27340 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
27350 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
27360 50 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47  PAGERTRACE3("PAG
27370 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
27380 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
27390 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
273a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
273b0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
273c0 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
273d0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
273e0 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
273f0 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69  ;.      pHist->i
27400 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
27410 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d   pHist->pPrevStm
27420 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74  t = pHist->pNext
27430 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
27440 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69  if( pPager->xRei
27450 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20  niter ){.       
27460 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74   pPager->xReinit
27470 65 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61  er(p, pPager->pa
27480 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d  geSize);.      }
27490 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
274a0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20  r->pDirty = 0;. 
274b0 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
274c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
274d0 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
274e0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20  r->origDbSize;. 
274f0 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
27500 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
27510 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
27520 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
27530 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
27540 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
27550 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
27560 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72  OK;.  }..  pager
27570 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
27580 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69   if( !pPager->di
27590 72 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61  rtyCache || !pPa
275a0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
275b0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
275c0 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69  er_end_transacti
275d0 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  on(pPager);.    
275e0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
275f0 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
27600 63 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50  c;.  }..  if( pP
27610 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26  ager->errCode &&
27620 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
27630 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b  !=SQLITE_FULL ){
27640 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
27650 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
27660 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
27670 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
27680 70 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20  pPager, 0);.    
27690 7d 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65  }.    pagerLeave
276a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
276b0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
276c0 43 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Code;.  }.  if( 
276d0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50  pPager->state==P
276e0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
276f0 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
27700 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
27710 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29  yback(pPager, 0)
27720 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65  ;.    rc2 = page
27730 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
27740 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  n(pPager);.    i
27750 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
27760 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
27770 63 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  c2;.    }.  }els
27780 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  e{.    rc = page
27790 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
277a0 72 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  r, 0);.  }.  /* 
277b0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
277c0 65 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72  er); */.  pPager
277d0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a  ->dbSize = -1;..
277e0 20 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72    /* If an error
277f0 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61   occurs during a
27800 20 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61   ROLLBACK, we ca
27810 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73  n no longer trus
27820 74 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a  t the pager.  **
27830 20 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20   cache. So call 
27840 70 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e  pager_error() on
27850 20 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20   the way out to 
27860 6d 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a  make any error .
27870 20 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e    ** persistent.
27880 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
27890 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
278a0 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61   rc);.  pagerLea
278b0 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
278c0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
278d0 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
278e0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
278f0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61  le is opened rea
27900 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  d-only.  Return 
27910 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20  FALSE.** if the 
27920 64 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20  database is (in 
27930 74 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65  theory) writable
27940 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
27950 50 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28  PagerIsreadonly(
27960 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27970 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
27980 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
27990 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
279a0 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e  umber of referen
279b0 63 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72  ces to the pager
279c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
279d0 50 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61  PagerRefcount(Pa
279e0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
279f0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
27a00 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  Ref;.}..#ifdef S
27a10 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
27a20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
27a30 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
27a40 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
27a50 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
27a60 69 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50  ite3PagerStats(P
27a70 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27a80 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31   static int a[11
27a90 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67  ];.  a[0] = pPag
27aa0 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d  er->nRef;.  a[1]
27ab0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65   = pPager->nPage
27ac0 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65  ;.  a[2] = pPage
27ad0 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33  r->mxPage;.  a[3
27ae0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ] = pPager->dbSi
27af0 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61  ze;.  a[4] = pPa
27b00 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b  ger->state;.  a[
27b10 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  5] = pPager->err
27b20 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70  Code;.  a[6] = p
27b30 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61  Pager->nHit;.  a
27b40 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d  [7] = pPager->nM
27b50 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b  iss;.  a[8] = 0;
27b60 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20    /* Used to be 
27b70 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f  pPager->nOvfl */
27b80 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
27b90 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
27ba0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
27bb0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
27bc0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
27bd0 65 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  et the statement
27be0 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e   rollback point.
27bf0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
27c00 69 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61  ine should be ca
27c10 6c 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72  lled with the tr
27c20 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
27c30 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65  l already.** ope
27c40 6e 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d  n.  A new statem
27c50 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63  ent journal is c
27c60 72 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20  reated that can 
27c70 62 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62  be used to rollb
27c80 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f  ack.** changes o
27c90 66 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63  f a single SQL c
27ca0 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20  ommand within a 
27cb0 6c 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69  larger transacti
27cc0 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  on..*/.static in
27cd0 74 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e  t pagerStmtBegin
27ce0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
27cf0 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
27d00 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
27d10 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
27d20 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
27d30 74 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te>=PAGER_SHARED
27d40 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
27d50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20  ager->dbSize>=0 
27d60 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32  );.  PAGERTRACE2
27d70 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
27d80 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
27d90 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
27da0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
27db0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
27dc0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
27dd0 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
27de0 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
27df0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
27e00 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
27e10 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
27e20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
27e30 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
27e40 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27e50 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
27e60 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
27e70 4f 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c  Open );.  pagerL
27e80 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27e90 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
27ea0 61 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20  aInStmt==0 );.  
27eb0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
27ec0 3d 20 73 71 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a  = sqlite3MallocZ
27ed0 65 72 6f 28 20 70 50 61 67 65 72 2d 3e 64 62 53  ero( pPager->dbS
27ee0 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 70  ize/8 + 1 );.  p
27ef0 61 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72  agerEnter(pPager
27f00 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
27f10 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  >aInStmt==0 ){. 
27f20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73 4c     /* sqlite3OsL
27f30 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ock(pPager->fd, 
27f40 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20 2a 2f  SHARED_LOCK); */
27f50 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
27f60 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69  TE_NOMEM;.  }.#i
27f70 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72  fndef NDEBUG.  r
27f80 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
27f90 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
27fa0 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74  d, &pPager->stmt
27fb0 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  JSize);.  if( rc
27fc0 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
27fd0 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73  in_failed;.  ass
27fe0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d  ert( pPager->stm
27ff0 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72  tJSize == pPager
28000 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a  ->journalOff );.
28010 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d  #endif.  pPager-
28020 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61  >stmtJSize = pPa
28030 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
28040 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  .  pPager->stmtS
28050 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
28060 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Size;.  pPager->
28070 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a  stmtHdrOff = 0;.
28080 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b    pPager->stmtCk
28090 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b  sum = pPager->ck
280a0 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21  sumInit;.  if( !
280b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
280c0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
280d0 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74 65 6d  ite3PagerOpentem
280e0 70 28 70 50 61 67 65 72 2d 3e 70 56 66 73 2c 20  p(pPager->pVfs, 
280f0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 50  pPager->stfd, pP
28100 61 67 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 2c  ager->zStmtJrnl,
28110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
28130 51 4c 49 54 45 5f 4f 50 45 4e 5f 53 55 42 4a 4f  QLITE_OPEN_SUBJO
28140 55 52 4e 41 4c 29 3b 0a 20 20 20 20 69 66 28 20  URNAL);.    if( 
28150 72 63 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f  rc ){.      goto
28160 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
28170 65 64 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ed;.    }.    pP
28180 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
28190 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
281a0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
281b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
281c0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
281d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
281e0 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
281f0 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
28200 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
28210 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50   sqlite3_free(pP
28220 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a  ager->aInStmt);.
28230 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
28240 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  tmt = 0;.  }.  r
28250 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74 20  eturn rc;.}.int 
28260 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74  sqlite3PagerStmt
28270 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61  Begin(Pager *pPa
28280 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
28290 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
282a0 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67  ger);.  rc = pag
282b0 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61 67  erStmtBegin(pPag
282c0 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  er);.  pagerLeav
282d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
282e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
282f0 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
28300 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
28310 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
28320 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
28330 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ){.  pagerEnter(
28340 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
28350 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
28360 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
28370 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
28380 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54 4d  PAGERTRACE2("STM
28390 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  T-COMMIT %d\n", 
283a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
283b0 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42  ;.    if( !MEMDB
283c0 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c   ){.      /* sql
283d0 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70  ite3OsTruncate(p
283e0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
283f0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
28400 33 5f 66 72 65 65 28 20 70 50 61 67 65 72 2d 3e  3_free( pPager->
28410 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  aInStmt );.     
28420 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
28430 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
28440 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70  .      for(pPg=p
28450 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50  Pager->pStmt; pP
28460 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
28470 20 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79         PgHistory
28480 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f   *pHist = PGHDR_
28490 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
284a0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  ger);.        pN
284b0 65 78 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  ext = pHist->pNe
284c0 78 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20  xtStmt;.        
284d0 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 69  assert( pHist->i
284e0 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 20  nStmt );.       
284f0 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d   pHist->inStmt =
28500 20 30 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   0;.        pHis
28510 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  t->pPrevStmt = p
28520 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20  Hist->pNextStmt 
28530 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 0;.        sql
28540 69 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d  ite3_free(pHist-
28550 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  >pStmt);.       
28560 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
28570 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  0;.      }.    }
28580 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
28590 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 70  tNRec = 0;.    p
285a0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
285b0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
285c0 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d  ->pStmt = 0;.  }
285d0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
285e0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70  utoopen = 0;.  p
285f0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
28600 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
28610 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
28620 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
28630 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
28640 69 74 65 33 50 61 67 65 72 53 74 6d 74 52 6f 6c  ite3PagerStmtRol
28650 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
28660 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
28670 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61    pagerEnter(pPa
28680 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67  ger);.  if( pPag
28690 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
286a0 0a 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32  .    PAGERTRACE2
286b0 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20  ("STMT-ROLLBACK 
286c0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
286d0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
286e0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
286f0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20  PgHdr *pPg;.    
28700 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
28710 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50  st;.      for(pP
28720 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b  g=pPager->pStmt;
28730 20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d   pPg; pPg=pHist-
28740 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
28750 20 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48       pHist = PGH
28760 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
28770 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
28780 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d   if( pHist->pStm
28790 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  t ){.          m
287a0 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44  emcpy(PGHDR_TO_D
287b0 41 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d  ATA(pPg), pHist-
287c0 3e 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e  >pStmt, pPager->
287d0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
287e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
287f0 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b  e(pHist->pStmt);
28800 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74  .          pHist
28810 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
28820 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
28830 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
28840 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
28850 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 70 61  mtSize;.      pa
28860 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
28870 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  he(pPager);.    
28880 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
28890 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
288a0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
288b0 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
288c0 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
288d0 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
288e0 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
288f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
28900 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
28910 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
28920 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 61  toopen = 0;.  pa
28930 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
28940 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
28950 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
28960 68 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65  he full pathname
28970 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
28980 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
28990 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50 61 67  char *sqlite3Pag
289a0 65 72 46 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  erFilename(Pager
289b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
289c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
289d0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
289e0 52 65 74 75 72 6e 20 74 68 65 20 56 46 53 20 73  Return the VFS s
289f0 74 72 75 63 74 75 72 65 20 66 6f 72 20 74 68 65  tructure for the
28a00 20 70 61 67 65 72 2e 0a 2a 2f 0a 63 6f 6e 73 74   pager..*/.const
28a10 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 73 71   sqlite3_vfs *sq
28a20 6c 69 74 65 33 50 61 67 65 72 56 66 73 28 50 61  lite3PagerVfs(Pa
28a30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28a40 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
28a50 56 66 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  Vfs;.}../*.** Re
28a60 74 75 72 6e 20 74 68 65 20 66 69 6c 65 20 68 61  turn the file ha
28a70 6e 64 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74  ndle for the dat
28a80 61 62 61 73 65 20 66 69 6c 65 20 61 73 73 6f 63  abase file assoc
28a90 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  iated.** with th
28aa0 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 6d  e pager.  This m
28ab0 69 67 68 74 20 72 65 74 75 72 6e 20 4e 55 4c 4c  ight return NULL
28ac0 20 69 66 20 74 68 65 20 66 69 6c 65 20 68 61 73   if the file has
28ad0 0a 2a 2a 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  .** not yet been
28ae0 20 6f 70 65 6e 65 64 2e 0a 2a 2f 0a 73 71 6c 69   opened..*/.sqli
28af0 74 65 33 5f 66 69 6c 65 20 2a 73 71 6c 69 74 65  te3_file *sqlite
28b00 33 50 61 67 65 72 46 69 6c 65 28 50 61 67 65 72  3PagerFile(Pager
28b10 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
28b20 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 3b 0a  urn pPager->fd;.
28b30 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
28b40 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66  the directory of
28b50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
28b60 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61  le..*/.const cha
28b70 72 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44  r *sqlite3PagerD
28b80 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
28b90 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
28ba0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
28bb0 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
28bc0 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
28bd0 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
28be0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
28bf0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
28c00 33 50 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d  3PagerJournalnam
28c10 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
28c20 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28c30 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a  r->zJournal;.}..
28c40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
28c50 65 20 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c  e if fsync() cal
28c60 6c 73 20 61 72 65 20 64 69 73 61 62 6c 65 64 20  ls are disabled 
28c70 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
28c80 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a   Return FALSE.**
28c90 20 69 66 20 66 73 79 6e 63 28 29 73 20 61 72 65   if fsync()s are
28ca0 20 65 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c   executed normal
28cb0 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ly..*/.int sqlit
28cc0 65 33 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61  e3PagerNosync(Pa
28cd0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28ce0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e  return pPager->n
28cf0 6f 53 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66  oSync;.}..#ifdef
28d00 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45   SQLITE_HAS_CODE
28d10 43 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  C./*.** Set the 
28d20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70  codec for this p
28d30 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ager.*/.void sql
28d40 69 74 65 33 50 61 67 65 72 53 65 74 43 6f 64 65  ite3PagerSetCode
28d50 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  c(.  Pager *pPag
28d60 65 72 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  er,.  void *(*xC
28d70 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
28d80 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
28d90 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
28da0 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
28db0 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
28dc0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
28dd0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
28de0 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20  #endif..#ifndef 
28df0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
28e00 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76  VACUUM./*.** Mov
28e10 65 20 74 68 65 20 70 61 67 65 20 70 50 67 20 74  e the page pPg t
28e20 6f 20 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20  o location pgno 
28e30 69 6e 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a  in the file..**.
28e40 2a 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65  ** There must be
28e50 20 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74   no references t
28e60 6f 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  o the page previ
28e70 6f 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74  ously located at
28e80 0a 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20  .** pgno (which 
28e90 77 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20  we call pPgOld) 
28ea0 74 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65  though that page
28eb0 20 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62   is allowed to b
28ec0 65 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20  e.** in cache.  
28ed0 49 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76  If the page prev
28ee0 69 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20  ious located at 
28ef0 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65  pgno is not alre
28f00 61 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f  ady.** in the ro
28f10 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
28f20 69 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68  it is not put th
28f30 65 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72  ere by by this r
28f40 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  outine..**.** Re
28f50 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
28f60 70 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20  page pPg remain 
28f70 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20  valid. Updating 
28f80 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61  any.** meta-data
28f90 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
28fa0 20 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20   pPg (i.e. data 
28fb0 73 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45  stored in the nE
28fc0 78 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c  xtra bytes.** al
28fd0 6c 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69  located along wi
28fe0 74 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20  th the page) is 
28ff0 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
29000 74 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72  ty of the caller
29010 2e 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61  ..**.** A transa
29020 63 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63  ction must be ac
29030 74 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72  tive when this r
29040 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
29050 2e 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a  . It used to be.
29060 2a 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74  ** required that
29070 20 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61   a statement tra
29080 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74  nsaction was not
29090 20 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69   active, but thi
290a0 73 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a  s restriction.**
290b0 20 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65   has been remove
290c0 64 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20  d (CREATE INDEX 
290d0 6e 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20  needs to move a 
290e0 70 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74  page when a stat
290f0 65 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63  ement.** transac
29100 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e  tion is active).
29110 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
29120 61 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67  agerMovepage(Pag
29130 65 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61  er *pPager, DbPa
29140 67 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67  ge *pPg, Pgno pg
29150 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
29160 67 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61  gOld;  /* The pa
29170 67 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69  ge being overwri
29180 74 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68  tten. */.  int h
29190 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e  ;.  Pgno needSyn
291a0 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 70 61  cPgno = 0;..  pa
291b0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
291c0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
291d0 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 50 41  >nRef>0 );..  PA
291e0 47 45 52 54 52 41 43 45 35 28 22 4d 4f 56 45 20  GERTRACE5("MOVE 
291f0 25 64 20 70 61 67 65 20 25 64 20 28 6e 65 65 64  %d page %d (need
29200 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65 73 20 74  Sync=%d) moves t
29210 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  o %d\n", .      
29220 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
29230 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
29240 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67 6e 6f 29  >needSync, pgno)
29250 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4d 4f  ;.  IOTRACE(("MO
29260 56 45 20 25 70 20 25 64 20 25 64 5c 6e 22 2c 20  VE %p %d %d\n", 
29270 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
29280 6f 2c 20 70 67 6e 6f 29 29 0a 0a 20 20 70 61 67  o, pgno))..  pag
29290 65 72 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70  er_get_content(p
292a0 50 67 29 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg);.  if( pPg->
292b0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
292c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 70  needSyncPgno = p
292d0 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61 73  Pg->pgno;.    as
292e0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
292f0 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 67 6e  rnal || (int)pgn
29300 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
29310 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
29320 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29  rt( pPg->dirty )
29330 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29340 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
29350 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
29360 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 73 20  nk pPg from its 
29370 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a 20 20  hash-chain */.  
29380 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
29390 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 0a 20  pPager, pPg);.. 
293a0 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63 68 65   /* If the cache
293b0 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61 67 65   contains a page
293c0 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d 62 65   with page-numbe
293d0 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65 20 69  r pgno, remove i
293e0 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74 73 20  t.  ** from its 
293f0 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
29400 2c 20 69 66 20 74 68 65 20 50 67 48 64 72 2e 6e  , if the PgHdr.n
29410 65 65 64 53 79 6e 63 20 77 61 73 20 73 65 74 20  eedSync was set 
29420 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67 65 20 70  for .  ** page p
29430 67 6e 6f 20 62 65 66 6f 72 65 20 74 68 65 20 27  gno before the '
29440 6d 6f 76 65 27 20 6f 70 65 72 61 74 69 6f 6e 2c  move' operation,
29450 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20   it needs to be 
29460 72 65 74 61 69 6e 65 64 20 0a 20 20 2a 2a 20 66  retained .  ** f
29470 6f 72 20 74 68 65 20 70 61 67 65 20 6d 6f 76 65  or the page move
29480 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f 0a 20 20  d there..  */.  
29490 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
294a0 30 3b 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61  0;.  pPgOld = pa
294b0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
294c0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
294d0 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73  pPgOld ){.    as
294e0 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52  sert( pPgOld->nR
294f0 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c  ef==0 );.    unl
29500 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
29510 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20  ger, pPgOld);.  
29520 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 4f    makeClean(pPgO
29530 6c 64 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 65  ld);.    pPg->ne
29540 65 64 53 79 6e 63 20 3d 20 70 50 67 4f 6c 64 2d  edSync = pPgOld-
29550 3e 6e 65 65 64 53 79 6e 63 3b 0a 20 20 7d 65 6c  >needSync;.  }el
29560 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65  se{.    pPg->nee
29570 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 0a 20  dSync = 0;.  }. 
29580 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
29590 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
295a0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
295b0 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
295c0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
295d0 20 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f    (pPager->aInJo
295e0 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20  urnal[pgno/8] & 
295f0 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d  (1<<(pgno&7)))!=
29600 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
29610 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
29620 20 30 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   0;.    assert( 
29630 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
29640 20 7c 7c 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50   || (int)pgno>pP
29650 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
29660 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68   );.  }..  /* Ch
29670 61 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75  ange the page nu
29680 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64  mber for pPg and
29690 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
296a0 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61  the new hash-cha
296b0 69 6e 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  in. */.  assert(
296c0 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50   pgno!=0 );.  pP
296d0 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
296e0 20 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50    h = pgno & (pP
296f0 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a  ager->nHash-1);.
29700 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48    if( pPager->aH
29710 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73  ash[h] ){.    as
29720 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
29730 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73  ash[h]->pPrevHas
29740 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67  h==0 );.    pPag
29750 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50  er->aHash[h]->pP
29760 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20  revHash = pPg;. 
29770 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48   }.  pPg->pNextH
29780 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48  ash = pPager->aH
29790 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72  ash[h];.  pPager
297a0 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
297b0 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61  ;.  pPg->pPrevHa
297c0 73 68 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44  sh = 0;..  makeD
297d0 69 72 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61  irty(pPg);.  pPa
297e0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
297f0 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64  = 1;..  if( need
29800 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20  SyncPgno ){.    
29810 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67  /* If needSyncPg
29820 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  no is non-zero, 
29830 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  then the journal
29840 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62   file needs to b
29850 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29  e .    ** sync()
29860 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61  ed before any da
29870 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f  ta is written to
29880 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70   database file p
29890 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  age needSyncPgno
298a0 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74  ..    ** Current
298b0 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65  ly, no such page
298c0 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70   exists in the p
298d0 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68  age-cache and th
298e0 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e  e .    ** Pager.
298f0 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68  aInJournal bit h
29900 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69  as been set. Thi
29910 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65  s needs to be re
29920 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e  medied by loadin
29930 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67  g.    ** the pag
29940 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72  e into the pager
29950 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69  -cache and setti
29960 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65  ng the PgHdr.nee
29970 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20  dSync flag..    
29980 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  **.    ** If the
29990 20 61 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64   attempt to load
299a0 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74   the page into t
299b0 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 66 61  he page-cache fa
299c0 69 6c 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a  ils, (due.    **
299d0 20 74 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f   to a malloc() o
299e0 72 20 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63  r IO failure), c
299f0 6c 65 61 72 20 74 68 65 20 62 69 74 20 69 6e 20  lear the bit in 
29a00 74 68 65 20 61 49 6e 4a 6f 75 72 6e 61 6c 5b 5d  the aInJournal[]
29a10 0a 20 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f  .    ** array. O
29a20 74 68 65 72 77 69 73 65 2c 20 69 66 20 74 68 65  therwise, if the
29a30 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20   page is loaded 
29a40 61 6e 64 20 77 72 69 74 74 65 6e 20 61 67 61 69  and written agai
29a50 6e 20 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73  n in.    ** this
29a60 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74   transaction, it
29a70 20 6d 61 79 20 62 65 20 77 72 69 74 74 65 6e 20   may be written 
29a80 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
29a90 66 69 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20  file before.    
29aa0 2a 2a 20 69 74 20 69 73 20 73 79 6e 63 65 64 20  ** it is synced 
29ab0 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
29ac0 20 66 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c   file. This way,
29ad0 20 69 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69   it may end up i
29ae0 6e 0a 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75  n.    ** the jou
29af0 72 6e 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c  rnal file twice,
29b00 20 62 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74   but that is not
29b10 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20   a problem..    
29b20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71  **.    ** The sq
29b30 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20  lite3PagerGet() 
29b40 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
29b50 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
29b60 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
29b70 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
29b80 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
29b90 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
29ba0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
29bb0 20 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72     PgHdr *pPgHdr
29bc0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
29bd0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
29be0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
29bf0 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
29c00 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
29c10 20 26 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69   &pPgHdr);.    i
29c20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29c30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50   ){.      if( pP
29c40 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
29c50 20 26 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e   && (int)needSyn
29c60 63 50 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  cPgno<=pPager->o
29c70 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
29c80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
29c90 4a 6f 75 72 6e 61 6c 5b 6e 65 65 64 53 79 6e 63  Journal[needSync
29ca0 50 67 6e 6f 2f 38 5d 20 26 3d 20 7e 28 31 3c 3c  Pgno/8] &= ~(1<<
29cb0 28 6e 65 65 64 53 79 6e 63 50 67 6e 6f 26 37 29  (needSyncPgno&7)
29cc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
29cd0 20 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67   pagerLeave(pPag
29ce0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
29cf0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
29d00 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
29d10 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
29d20 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
29d30 20 20 20 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f      pPgHdr->inJo
29d40 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d  urnal = 1;.    m
29d50 61 6b 65 44 69 72 74 79 28 70 50 67 48 64 72 29  akeDirty(pPgHdr)
29d60 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  ;.    sqlite3Pag
29d70 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
29d80 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 4c 65 61  .  }..  pagerLea
29d90 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
29da0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
29db0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
29dc0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
29dd0 20 74 6f 20 74 68 65 20 64 61 74 61 20 66 6f 72   to the data for
29de0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
29df0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
29e00 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61 74  lite3PagerGetDat
29e10 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a  a(DbPage *pPg){.
29e20 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54    return PGHDR_T
29e30 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a  O_DATA(pPg);.}..
29e40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
29e50 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
29e60 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
29e70 20 6f 66 20 22 65 78 74 72 61 22 20 73 70 61 63   of "extra" spac
29e80 65 20 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  e .** allocated 
29e90 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 73  along with the s
29ea0 70 65 63 69 66 69 65 64 20 70 61 67 65 2e 0a 2a  pecified page..*
29eb0 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
29ec0 61 67 65 72 47 65 74 45 78 74 72 61 28 44 62 50  agerGetExtra(DbP
29ed0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  age *pPg){.  Pag
29ee0 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
29ef0 2d 3e 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  ->pPager;.  retu
29f00 72 6e 20 28 70 50 61 67 65 72 3f 50 47 48 44 52  rn (pPager?PGHDR
29f10 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70  _TO_EXTRA(pPg, p
29f20 50 61 67 65 72 29 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Pager):0);.}../*
29f30 0a 2a 2a 20 47 65 74 2f 73 65 74 20 74 68 65 20  .** Get/set the 
29f40 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 66 6f 72  locking-mode for
29f50 20 74 68 69 73 20 70 61 67 65 72 2e 20 50 61 72   this pager. Par
29f60 61 6d 65 74 65 72 20 65 4d 6f 64 65 20 6d 75 73  ameter eMode mus
29f70 74 20 62 65 20 6f 6e 65 0a 2a 2a 20 6f 66 20 50  t be one.** of P
29f80 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
29f90 5f 51 55 45 52 59 2c 20 50 41 47 45 52 5f 4c 4f  _QUERY, PAGER_LO
29fa0 43 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c  CKINGMODE_NORMAL
29fb0 20 6f 72 20 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f   or .** PAGER_LO
29fc0 43 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53  CKINGMODE_EXCLUS
29fd0 49 56 45 2e 20 49 66 20 74 68 65 20 70 61 72 61  IVE. If the para
29fe0 6d 65 74 65 72 20 69 73 20 6e 6f 74 20 5f 51 55  meter is not _QU
29ff0 45 52 59 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65  ERY, then.** the
2a000 20 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 20 69 73   locking-mode is
2a010 20 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75   set to the valu
2a020 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 0a  e specified..**.
2a030 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 65 64 20  ** The returned 
2a040 76 61 6c 75 65 20 69 73 20 65 69 74 68 65 72 20  value is either 
2a050 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2a060 45 5f 4e 4f 52 4d 41 4c 20 6f 72 0a 2a 2a 20 50  E_NORMAL or.** P
2a070 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a080 5f 45 58 43 4c 55 53 49 56 45 2c 20 69 6e 64 69  _EXCLUSIVE, indi
2a090 63 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  cating the curre
2a0a0 6e 74 20 28 70 6f 73 73 69 62 6c 79 20 75 70 64  nt (possibly upd
2a0b0 61 74 65 64 29 0a 2a 2a 20 6c 6f 63 6b 69 6e 67  ated).** locking
2a0c0 2d 6d 6f 64 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71  -mode..*/.int sq
2a0d0 6c 69 74 65 33 50 61 67 65 72 4c 6f 63 6b 69 6e  lite3PagerLockin
2a0e0 67 4d 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  gMode(Pager *pPa
2a0f0 67 65 72 2c 20 69 6e 74 20 65 4d 6f 64 65 29 7b  ger, int eMode){
2a100 0a 20 20 61 73 73 65 72 74 28 20 65 4d 6f 64 65  .  assert( eMode
2a110 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
2a120 4f 44 45 5f 51 55 45 52 59 0a 20 20 20 20 20 20  ODE_QUERY.      
2a130 20 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d        || eMode==
2a140 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
2a150 45 5f 4e 4f 52 4d 41 4c 0a 20 20 20 20 20 20 20  E_NORMAL.       
2a160 20 20 20 20 20 7c 7c 20 65 4d 6f 64 65 3d 3d 50       || eMode==P
2a170 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a180 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20  _EXCLUSIVE );.  
2a190 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f  assert( PAGER_LO
2a1a0 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 3c  CKINGMODE_QUERY<
2a1b0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  0 );.  assert( P
2a1c0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
2a1d0 5f 4e 4f 52 4d 41 4c 3e 3d 30 20 26 26 20 50 41  _NORMAL>=0 && PA
2a1e0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a1f0 45 58 43 4c 55 53 49 56 45 3e 3d 30 20 29 3b 0a  EXCLUSIVE>=0 );.
2a200 20 20 69 66 28 20 65 4d 6f 64 65 3e 3d 30 20 26    if( eMode>=0 &
2a210 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
2a220 69 6c 65 20 29 7b 0a 20 20 20 20 70 50 61 67 65  ile ){.    pPage
2a230 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65  r->exclusiveMode
2a240 20 3d 20 65 4d 6f 64 65 3b 0a 20 20 7d 0a 20 20   = eMode;.  }.  
2a250 72 65 74 75 72 6e 20 28 69 6e 74 29 70 50 61 67  return (int)pPag
2a260 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
2a270 65 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c  e;.}..#ifdef SQL
2a280 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20 50  ITE_TEST./*.** P
2a290 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
2a2a0 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
2a2b0 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
2a2c0 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
2a2d0 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
2a2e0 52 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a 70  Refdump(Pager *p
2a2f0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
2a300 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67 3d  *pPg;.  for(pPg=
2a310 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
2a320 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
2a330 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
2a340 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63 6f  Pg->nRef<=0 ) co
2a350 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c 69  ntinue;.    sqli
2a360 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 22  te3DebugPrintf("
2a370 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25 70  PAGE %3d addr=%p
2a380 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20 20   nRef=%d\n", .  
2a390 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c 20       pPg->pgno, 
2a3a0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
2a3b0 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b 0a  g), pPg->nRef);.
2a3c0 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 65    }.}.#endif..#e
2a3d0 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
2a3e0 4d 49 54 5f 44 49 53 4b 49 4f 20 2a 2f 0a        MIT_DISKIO */.