/ Hex Artifact Content
Login

Artifact d09885bb88e9868a5c322a0181d4022cf294d98b:


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 31  : pager.c,v 1.41
0350: 32 20 32 30 30 38 2f 30 32 2f 32 36 20 31 38 3a  2 2008/02/26 18:
0360: 34 30 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a  40:12 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  t.h".#include <a
03b0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03c0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03d0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03e0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
03f0: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0400: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0410: 65 66 69 6e 65 20 73 71 6c 69 74 65 33 44 65 62  efine sqlite3Deb
0420: 75 67 50 72 69 6e 74 66 20 70 72 69 6e 74 66 0a  ugPrintf printf.
0430: 23 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41  #define PAGERTRA
0440: 43 45 31 28 58 29 20 20 20 20 20 20 20 73 71 6c  CE1(X)       sql
0450: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
0460: 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  X).#define PAGER
0470: 54 52 41 43 45 32 28 58 2c 59 29 20 20 20 20 20  TRACE2(X,Y)     
0480: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0490: 74 66 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20  tf(X,Y).#define 
04a0: 50 41 47 45 52 54 52 41 43 45 33 28 58 2c 59 2c  PAGERTRACE3(X,Y,
04b0: 5a 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  Z)   sqlite3Debu
04c0: 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23  gPrintf(X,Y,Z).#
04d0: 64 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43  define PAGERTRAC
04e0: 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73 71 6c 69  E4(X,Y,Z,W) sqli
04f0: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0500: 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20  ,Y,Z,W).#define 
0510: 50 41 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c  PAGERTRACE5(X,Y,
0520: 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65 33 44 65  Z,W,V) sqlite3De
0530: 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c  bugPrintf(X,Y,Z,
0540: 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64 65 66 69  W,V).#else.#defi
0550: 6e 65 20 50 41 47 45 52 54 52 41 43 45 31 28 58  ne PAGERTRACE1(X
0560: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0570: 52 41 43 45 32 28 58 2c 59 29 0a 23 64 65 66 69  RACE2(X,Y).#defi
0580: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
0590: 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Y,Z).#define PA
05a0: 47 45 52 54 52 41 43 45 34 28 58 2c 59 2c 5a 2c  GERTRACE4(X,Y,Z,
05b0: 57 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  W).#define PAGER
05c0: 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c 57 2c 56  TRACE5(X,Y,Z,W,V
05d0: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
05e0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 77  The following tw
05f0: 6f 20 6d 61 63 72 6f 73 20 61 72 65 20 75 73 65  o macros are use
0600: 64 20 77 69 74 68 69 6e 20 74 68 65 20 50 41 47  d within the PAG
0610: 45 52 54 52 41 43 45 58 28 29 20 6d 61 63 72 6f  ERTRACEX() macro
0620: 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f 20 70 72  s above.** to pr
0630: 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d 64 65 73  int out file-des
0640: 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a 0a 2a 2a  criptors. .**.**
0650: 20 50 41 47 45 52 49 44 28 29 20 74 61 6b 65 73   PAGERID() takes
0660: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20   a pointer to a 
0670: 50 61 67 65 72 20 73 74 72 75 63 74 20 61 73 20  Pager struct as 
0680: 69 74 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68  its argument. Th
0690: 65 0a 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20  e.** associated 
06a0: 66 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20  file-descriptor 
06b0: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c  is returned. FIL
06c0: 45 48 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65  EHANDLEID() take
06d0: 73 20 61 6e 20 73 71 6c 69 74 65 33 5f 66 69 6c  s an sqlite3_fil
06e0: 65 0a 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69  e.** struct as i
06f0: 74 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ts argument..*/.
0700: 23 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28  #define PAGERID(
0710: 70 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29  p) ((int)(p->fd)
0720: 29 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41  ).#define FILEHA
0730: 4e 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74  NDLEID(fd) ((int
0740: 29 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  )fd)../*.** The 
0750: 70 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20  page cache as a 
0760: 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20  whole is always 
0770: 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f  in one of the fo
0780: 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65  llowing.** state
0790: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  s:.**.**   PAGER
07a0: 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54  _UNLOCK        T
07b0: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
07c0: 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72   not currently r
07d0: 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20  eading or .**   
07e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07f0: 20 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20      writing the 
0800: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
0810: 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20  There is no.**  
0820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0830: 20 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69       data held i
0840: 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20  n memory.  This 
0850: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a  is the initial.*
0860: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0870: 20 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a          state..*
0880: 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41  *.**   PAGER_SHA
0890: 52 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70  RED        The p
08a0: 61 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61  age cache is rea
08b0: 64 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ding the databas
08c0: 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  e..**           
08d0: 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
08e0: 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69  ing is not permi
08f0: 74 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e  tted.  There can
0900: 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   be.**          
0910: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c               mul
0920: 74 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63  tiple readers ac
0930: 63 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65  cessing the same
0940: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0960: 20 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73     file at the s
0970: 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20  ame time..**.** 
0980: 20 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44    PAGER_RESERVED
0990: 20 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65        This proce
09a0: 73 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20  ss has reserved 
09b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72  the database for
09c0: 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20   writing.**     
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65    but has not ye
09f0: 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67  t made any chang
0a00: 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72  es.  Only one pr
0a10: 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20  ocess.**        
0a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
0a30: 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73  t a time can res
0a40: 65 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73  erve the databas
0a50: 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c  e.  The original
0a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0a70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
0a80: 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20  se file has not 
0a90: 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f  been modified so
0aa0: 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20   other.**       
0ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ac0: 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74  processes may st
0ad0: 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74  ill be reading t
0ae0: 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20  he on-disk.**   
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b00: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
0b10: 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52  e..**.**   PAGER
0b20: 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54  _EXCLUSIVE     T
0b30: 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73  he page cache is
0b40: 20 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74   writing the dat
0b50: 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20  abase..**       
0b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b70: 41 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73  Access is exclus
0b80: 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70  ive.  No other p
0b90: 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20  rocesses or.**  
0ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bb0: 20 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e       threads can
0bc0: 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77   be reading or w
0bd0: 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65  riting while one
0be0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0bf0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73            proces
0c00: 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a  s is writing..**
0c10: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43  .**   PAGER_SYNC
0c20: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
0c30: 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69  ger moves to thi
0c40: 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47  s state from PAG
0c50: 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20  ER_EXCLUSIVE.** 
0c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c70: 20 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20        after all 
0c80: 64 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65  dirty pages have
0c90: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
0ca0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0cb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61                da
0cc0: 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20  tabase file and 
0cd0: 74 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  the file has bee
0ce0: 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20  n synced to.**  
0cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d00: 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74       disk. All t
0d10: 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64  hat remains to d
0d20: 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f  o is to remove o
0d30: 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  r.**            
0d40: 20 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63             trunc
0d50: 61 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ate the journal 
0d60: 66 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61  file and the tra
0d70: 6e 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20  nsaction .**    
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d90: 20 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69     will be commi
0da0: 74 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  tted..**.** The 
0db0: 70 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73  page cache comes
0dc0: 20 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c   up in PAGER_UNL
0dd0: 4f 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20  OCK.  The first 
0de0: 74 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65  time a.** sqlite
0df0: 33 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75  3PagerGet() occu
0e00: 72 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72  rs, the state tr
0e10: 61 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47  ansitions to PAG
0e20: 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66  ER_SHARED..** Af
0e30: 74 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61  ter all pages ha
0e40: 76 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64  ve been released
0e50: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61   using sqlite_pa
0e60: 67 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74  ge_unref(),.** t
0e70: 68 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74  he state transit
0e80: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47  ions back to PAG
0e90: 45 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20  ER_UNLOCK.  The 
0ea0: 66 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68  first time.** th
0eb0: 61 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57  at sqlite3PagerW
0ec0: 72 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64  rite() is called
0ed0: 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e  , the state tran
0ee0: 73 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41  sitions to.** PA
0ef0: 47 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28  GER_RESERVED.  (
0f00: 4e 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65  Note that sqlite
0f10: 33 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61  3PagerWrite() ca
0f20: 6e 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c  n only be.** cal
0f30: 6c 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61  led on an outsta
0f40: 6e 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68  nding page which
0f50: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
0f60: 70 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65  pager must.** be
0f70: 20 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44   in PAGER_SHARED
0f80: 20 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73   before it trans
0f90: 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f  itions to PAGER_
0fa0: 52 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41  RESERVED.).** PA
0fb0: 47 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61  GER_RESERVED mea
0fc0: 6e 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73  ns that there is
0fd0: 20 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63   an open rollbac
0fe0: 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68  k journal..** Th
0ff0: 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20  e transition to 
1000: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
1010: 6f 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e  occurs before an
1020: 79 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  y changes.** are
1030: 20 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74   made to the dat
1040: 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75  abase file, thou
1050: 67 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65  gh writes to the
1060: 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75   rollback.** jou
1070: 72 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68  rnal occurs with
1080: 20 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45   just PAGER_RESE
1090: 52 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20  RVED.  After an 
10a0: 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
10b0: 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c  back().** or sql
10c0: 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50  ite3PagerCommitP
10d0: 68 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73  haseTwo(), the s
10e0: 74 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b  tate can go back
10f0: 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44   to PAGER_SHARED
1100: 2c 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73  ,.** or it can s
1110: 74 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43  tay at PAGER_EXC
1120: 4c 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65  LUSIVE if we are
1130: 20 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63   in exclusive ac
1140: 63 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64  cess mode..*/.#d
1150: 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f  efine PAGER_UNLO
1160: 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e  CK      0.#defin
1170: 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20  e PAGER_SHARED  
1180: 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20      1   /* same 
1190: 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a  as SHARED_LOCK *
11a0: 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f  /.#define PAGER_
11b0: 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20  RESERVED    2   
11c0: 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52  /* same as RESER
11d0: 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66  VED_LOCK */.#def
11e0: 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53  ine PAGER_EXCLUS
11f0: 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d  IVE   4   /* sam
1200: 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c  e as EXCLUSIVE_L
1210: 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  OCK */.#define P
1220: 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20  AGER_SYNCED     
1230: 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65   5../*.** If the
1240: 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53   SQLITE_BUSY_RES
1250: 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f  ERVED_LOCK macro
1260: 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20   is set to true 
1270: 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c  at compile-time,
1280: 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20  .** then failed 
1290: 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20  attempts to get 
12a0: 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  a reserved lock 
12b0: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20  will invoke the 
12c0: 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a  busy callback..*
12d0: 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79  * This is off by
12e0: 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65   default.  To se
12f0: 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20  e why, consider 
1300: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63  the following sc
1310: 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53  enario:.** .** S
1320: 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20  uppose thread A 
1330: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68  already has a sh
1340: 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61  ared lock and wa
1350: 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c  nts a reserved l
1360: 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42  ock..** Thread B
1370: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72   already has a r
1380: 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64  eserved lock and
1390: 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73   wants an exclus
13a0: 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a  ive lock.  If.**
13b0: 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72   both threads ar
13c0: 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75  e using their bu
13d0: 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74  sy callbacks, it
13e0: 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67   might be a long
13f0: 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20   time.** be for 
1400: 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61  one of the threa
1410: 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61  ds give up and a
1420: 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20  llows the other 
1430: 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42  to proceed..** B
1440: 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64  ut if the thread
1450: 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74   trying to get t
1460: 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b  he reserved lock
1470: 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c   gives up quickl
1480: 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65  y.** (if it neve
1490: 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75  r invokes its bu
14a0: 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65  sy callback) the
14b0: 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e  n the contention
14c0: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f   will be.** reso
14d0: 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f  lved quickly..*/
14e0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
14f0: 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f  BUSY_RESERVED_LO
1500: 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49  CK.# define SQLI
1510: 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44  TE_BUSY_RESERVED
1520: 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a  _LOCK 0.#endif..
1530: 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f  /*.** This macro
1540: 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75   rounds values u
1550: 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65  p so that if the
1560: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64   value is an add
1570: 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75  ress it.** is gu
1580: 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61  aranteed to be a
1590: 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69  n address that i
15a0: 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20  s aligned to an 
15b0: 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e  8-byte boundary.
15c0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43  .*/.#define FORC
15d0: 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20  E_ALIGNMENT(X)  
15e0: 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 74   (((X)+7)&~7)..t
15f0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 50 67  ypedef struct Pg
1600: 48 64 72 20 50 67 48 64 72 3b 0a 0a 2f 2a 0a 2a  Hdr PgHdr;../*.*
1610: 2a 20 45 61 63 68 20 70 61 67 65 72 20 73 74 6f  * Each pager sto
1620: 72 65 73 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  res all currentl
1630: 79 20 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70  y unreferenced p
1640: 61 67 65 73 20 69 6e 20 61 20 6c 69 73 74 20 73  ages in a list s
1650: 6f 72 74 65 64 0a 2a 2a 20 69 6e 20 6c 65 61 73  orted.** in leas
1660: 74 2d 72 65 63 65 6e 74 6c 79 2d 75 73 65 64 20  t-recently-used 
1670: 28 4c 52 55 29 20 6f 72 64 65 72 20 28 69 2e 65  (LRU) order (i.e
1680: 2e 20 74 68 65 20 66 69 72 73 74 20 69 74 65 6d  . the first item
1690: 20 6f 6e 20 74 68 65 20 6c 69 73 74 20 68 61 73   on the list has
16a0: 20 0a 2a 2a 20 6e 6f 74 20 62 65 65 6e 20 72 65   .** not been re
16b0: 66 65 72 65 6e 63 65 64 20 69 6e 20 61 20 6c 6f  ferenced in a lo
16c0: 6e 67 20 74 69 6d 65 2c 20 74 68 65 20 6c 61 73  ng time, the las
16d0: 74 20 69 74 65 6d 20 68 61 73 20 62 65 65 6e 20  t item has been 
16e0: 72 65 63 65 6e 74 6c 79 0a 2a 2a 20 75 73 65 64  recently.** used
16f0: 29 2e 20 41 6e 20 69 6e 73 74 61 6e 63 65 20 6f  ). An instance o
1700: 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72 65  f this structure
1710: 20 69 73 20 69 6e 63 6c 75 64 65 64 20 61 73 20   is included as 
1720: 70 61 72 74 20 6f 66 20 65 61 63 68 0a 2a 2a 20  part of each.** 
1730: 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
1740: 66 6f 72 20 74 68 69 73 20 70 75 72 70 6f 73 65  for this purpose
1750: 20 28 76 61 72 69 61 62 6c 65 20 50 61 67 65 72   (variable Pager
1760: 2e 6c 72 75 29 2e 0a 2a 2a 0a 2a 2a 20 41 64 64  .lru)..**.** Add
1770: 69 74 69 6f 6e 61 6c 6c 79 2c 20 69 66 20 6d 65  itionally, if me
1780: 6d 6f 72 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20  mory-management 
1790: 69 73 20 65 6e 61 62 6c 65 64 2c 20 61 6c 6c 20  is enabled, all 
17a0: 75 6e 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  unreferenced pag
17b0: 65 73 20 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65  es .** are store
17c0: 64 20 69 6e 20 61 20 67 6c 6f 62 61 6c 20 4c 52  d in a global LR
17d0: 55 20 6c 69 73 74 20 28 67 6c 6f 62 61 6c 20 76  U list (global v
17e0: 61 72 69 61 62 6c 65 20 73 71 6c 69 74 65 33 4c  ariable sqlite3L
17f0: 72 75 50 61 67 65 4c 69 73 74 29 2e 0a 2a 2a 0a  ruPageList)..**.
1800: 2a 2a 20 49 6e 20 62 6f 74 68 20 63 61 73 65 73  ** In both cases
1810: 2c 20 74 68 65 20 50 61 67 65 72 4c 72 75 4c 69  , the PagerLruLi
1820: 73 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20  st.pFirstSynced 
1830: 76 61 72 69 61 62 6c 65 20 70 6f 69 6e 74 73 20  variable points 
1840: 74 6f 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  to.** the first 
1850: 70 61 67 65 20 69 6e 20 74 68 65 20 63 6f 72 72  page in the corr
1860: 65 73 70 6f 6e 64 69 6e 67 20 6c 69 73 74 20 74  esponding list t
1870: 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71  hat does not req
1880: 75 69 72 65 20 61 6e 0a 2a 2a 20 66 73 79 6e 63  uire an.** fsync
1890: 28 29 20 6f 70 65 72 61 74 69 6f 6e 20 62 65 66  () operation bef
18a0: 6f 72 65 20 69 74 73 20 6d 65 6d 6f 72 79 20 63  ore its memory c
18b0: 61 6e 20 62 65 20 72 65 63 6c 61 69 6d 65 64 2e  an be reclaimed.
18c0: 20 49 66 20 6e 6f 20 73 75 63 68 0a 2a 2a 20 70   If no such.** p
18d0: 61 67 65 20 65 78 69 73 74 73 2c 20 50 61 67 65  age exists, Page
18e0: 72 4c 72 75 4c 69 73 74 2e 70 46 69 72 73 74 53  rLruList.pFirstS
18f0: 79 6e 63 65 64 20 69 73 20 73 65 74 20 74 6f 20  ynced is set to 
1900: 4e 55 4c 4c 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  NULL..*/.typedef
1910: 20 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75   struct PagerLru
1920: 4c 69 73 74 20 50 61 67 65 72 4c 72 75 4c 69 73  List PagerLruLis
1930: 74 3b 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c  t;.struct PagerL
1940: 72 75 4c 69 73 74 20 7b 0a 20 20 50 67 48 64 72  ruList {.  PgHdr
1950: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 20 20 20   *pFirst;       
1960: 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65 20    /* First page 
1970: 69 6e 20 4c 52 55 20 6c 69 73 74 20 2a 2f 0a 20  in LRU list */. 
1980: 20 50 67 48 64 72 20 2a 70 4c 61 73 74 3b 20 20   PgHdr *pLast;  
1990: 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 73 74 20          /* Last 
19a0: 70 61 67 65 20 69 6e 20 4c 52 55 20 6c 69 73 74  page in LRU list
19b0: 20 28 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e   (the most recen
19c0: 74 6c 79 20 75 73 65 64 29 20 2a 2f 0a 20 20 50  tly used) */.  P
19d0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
19e0: 65 64 3b 20 20 20 2f 2a 20 46 69 72 73 74 20 70  ed;   /* First p
19f0: 61 67 65 20 69 6e 20 6c 69 73 74 20 77 69 74 68  age in list with
1a00: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 3d   PgHdr.needSync=
1a10: 3d 30 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  =0 */.};../*.** 
1a20: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74  The following st
1a30: 72 75 63 74 75 72 65 20 63 6f 6e 74 61 69 6e 73  ructure contains
1a40: 20 74 68 65 20 6e 65 78 74 20 61 6e 64 20 70 72   the next and pr
1a50: 65 76 69 6f 75 73 20 70 6f 69 6e 74 65 72 73 20  evious pointers 
1a60: 75 73 65 64 0a 2a 2a 20 74 6f 20 6c 69 6e 6b 20  used.** to link 
1a70: 61 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  a PgHdr structur
1a80: 65 20 69 6e 74 6f 20 61 20 50 61 67 65 72 4c 72  e into a PagerLr
1a90: 75 4c 69 73 74 20 6c 69 6e 6b 65 64 20 6c 69 73  uList linked lis
1aa0: 74 2e 20 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  t. .*/.typedef s
1ab0: 74 72 75 63 74 20 50 61 67 65 72 4c 72 75 4c 69  truct PagerLruLi
1ac0: 6e 6b 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 3b  nk PagerLruLink;
1ad0: 0a 73 74 72 75 63 74 20 50 61 67 65 72 4c 72 75  .struct PagerLru
1ae0: 4c 69 6e 6b 20 7b 0a 20 20 50 67 48 64 72 20 2a  Link {.  PgHdr *
1af0: 70 4e 65 78 74 3b 0a 20 20 50 67 48 64 72 20 2a  pNext;.  PgHdr *
1b00: 70 50 72 65 76 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  pPrev;.};../*.**
1b10: 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   Each in-memory 
1b20: 69 6d 61 67 65 20 6f 66 20 61 20 70 61 67 65 20  image of a page 
1b30: 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 20  begins with the 
1b40: 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61 64 65 72  following header
1b50: 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61 64 65 72  ..** This header
1b60: 20 69 73 20 6f 6e 6c 79 20 76 69 73 69 62 6c 65   is only visible
1b70: 20 74 6f 20 74 68 69 73 20 70 61 67 65 72 20 6d   to this pager m
1b80: 6f 64 75 6c 65 2e 20 20 54 68 65 20 63 6c 69 65  odule.  The clie
1b90: 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68 61 74 20  nt.** code that 
1ba0: 63 61 6c 6c 73 20 70 61 67 65 72 20 73 65 65 73  calls pager sees
1bb0: 20 6f 6e 6c 79 20 74 68 65 20 64 61 74 61 20 74   only the data t
1bc0: 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74 68 65 20  hat follows the 
1bd0: 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 43 6c  header..**.** Cl
1be0: 69 65 6e 74 20 63 6f 64 65 20 73 68 6f 75 6c 64  ient code should
1bf0: 20 63 61 6c 6c 20 73 71 6c 69 74 65 33 50 61 67   call sqlite3Pag
1c00: 65 72 57 72 69 74 65 28 29 20 6f 6e 20 61 20 70  erWrite() on a p
1c10: 61 67 65 20 70 72 69 6f 72 20 74 6f 20 6d 61 6b  age prior to mak
1c20: 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f 64 69 66  ing.** any modif
1c30: 69 63 61 74 69 6f 6e 73 20 74 6f 20 74 68 61 74  ications to that
1c40: 20 70 61 67 65 2e 20 20 54 68 65 20 66 69 72 73   page.  The firs
1c50: 74 20 74 69 6d 65 20 73 71 6c 69 74 65 33 50 61  t time sqlite3Pa
1c60: 67 65 72 57 72 69 74 65 28 29 0a 2a 2a 20 69 73  gerWrite().** is
1c70: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 6f 72 69   called, the ori
1c80: 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65  ginal page conte
1c90: 6e 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  nts are written 
1ca0: 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63  into the rollbac
1cb0: 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  k.** journal and
1cc0: 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72 6e 61 6c   PgHdr.inJournal
1cd0: 20 61 6e 64 20 50 67 48 64 72 2e 6e 65 65 64 53   and PgHdr.needS
1ce0: 79 6e 63 20 61 72 65 20 73 65 74 2e 20 20 4c 61  ync are set.  La
1cf0: 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20 74 68 65  ter, once.** the
1d00: 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 68 61   journal page ha
1d10: 73 20 6d 61 64 65 20 69 74 20 6f 6e 74 6f 20 74  s made it onto t
1d20: 68 65 20 64 69 73 6b 20 73 75 72 66 61 63 65 2c  he disk surface,
1d30: 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 0a   PgHdr.needSync.
1d40: 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 2e 20 20  ** is cleared.  
1d50: 54 68 65 20 6d 6f 64 69 66 69 65 64 20 70 61 67  The modified pag
1d60: 65 20 63 61 6e 6e 6f 74 20 62 65 20 77 72 69 74  e cannot be writ
1d70: 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  ten back into th
1d80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1d90: 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69  tabase file unti
1da0: 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61  l the journal pa
1db0: 67 65 73 20 68 61 73 20 62 65 65 6e 20 73 79 6e  ges has been syn
1dc0: 63 65 64 20 74 6f 20 64 69 73 6b 20 61 6e 64 20  ced to disk and 
1dd0: 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e 6e 65 65  the.** PgHdr.nee
1de0: 64 53 79 6e 63 20 68 61 73 20 62 65 65 6e 20 63  dSync has been c
1df0: 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  leared..**.** Th
1e00: 65 20 50 67 48 64 72 2e 64 69 72 74 79 20 66 6c  e PgHdr.dirty fl
1e10: 61 67 20 69 73 20 73 65 74 20 77 68 65 6e 20 73  ag is set when s
1e20: 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
1e30: 28 29 20 69 73 20 63 61 6c 6c 65 64 20 61 6e 64  () is called and
1e40: 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64 20 61  .** is cleared a
1e50: 67 61 69 6e 20 77 68 65 6e 20 74 68 65 20 70 61  gain when the pa
1e60: 67 65 20 63 6f 6e 74 65 6e 74 20 69 73 20 77 72  ge content is wr
1e70: 69 74 74 65 6e 20 62 61 63 6b 20 74 6f 20 74 68  itten back to th
1e80: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 64 61  e original.** da
1e90: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 0a  tabase file..**.
1ea0: 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66 20 69 6d  ** Details of im
1eb0: 70 6f 72 74 61 6e 74 20 73 74 72 75 63 74 75 72  portant structur
1ec0: 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a 2a 0a 2a  e elements:.**.*
1ed0: 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a 0a 2a 2a  * needSync.**.**
1ee0: 20 20 20 20 20 49 66 20 74 68 69 73 20 69 73 20       If this is 
1ef0: 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e 73  true, this means
1f00: 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
1f10: 73 61 66 65 20 74 6f 20 77 72 69 74 65 20 74 68  safe to write th
1f20: 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63 6f  e page.**     co
1f30: 6e 74 65 6e 74 20 74 6f 20 74 68 65 20 64 61 74  ntent to the dat
1f40: 61 62 61 73 65 20 62 65 63 61 75 73 65 20 74 68  abase because th
1f50: 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f 6e 74 65  e original conte
1f60: 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20 20 20 20  nt needed.**    
1f70: 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 20 68 61   for rollback ha
1f80: 73 20 6e 6f 74 20 62 79 20 73 79 6e 63 65 64 20  s not by synced 
1f90: 74 6f 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c  to the main roll
1fa0: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  back journal..**
1fb0: 20 20 20 20 20 54 68 65 20 6f 72 69 67 69 6e 61       The origina
1fc0: 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79 20 68 61  l content may ha
1fd0: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
1fe0: 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  to the rollback 
1ff0: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 62  journal.**     b
2000: 75 74 20 69 74 20 68 61 73 20 6e 6f 74 20 79 65  ut it has not ye
2010: 74 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20  t been synced.  
2020: 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20 77 72 69  So we cannot wri
2030: 74 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  te to the databa
2040: 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c 65 20 62  se.**     file b
2050: 65 63 61 75 73 65 20 70 6f 77 65 72 20 66 61 69  ecause power fai
2060: 6c 75 72 65 20 6d 69 67 68 74 20 63 61 75 73 65  lure might cause
2070: 20 74 68 65 20 70 61 67 65 20 69 6e 20 74 68 65   the page in the
2080: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a   journal file.**
2090: 20 20 20 20 20 74 6f 20 6e 65 76 65 72 20 72 65       to never re
20a0: 61 63 68 20 74 68 65 20 64 69 73 6b 2e 20 20 49  ach the disk.  I
20b0: 74 20 69 73 20 61 73 20 69 66 20 74 68 65 20 77  t is as if the w
20c0: 72 69 74 65 20 74 6f 20 74 68 65 20 6a 6f 75 72  rite to the jour
20d0: 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20 20 20 20  nal file.**     
20e0: 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75 72 20 75  does not occur u
20f0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
2100: 20 66 69 6c 65 20 69 73 20 73 79 6e 63 65 64 2e   file is synced.
2110: 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20 20 20 20  .**     .**     
2120: 54 68 69 73 20 66 6c 61 67 20 69 73 20 66 61 6c  This flag is fal
2130: 73 65 20 69 66 20 74 68 65 20 70 61 67 65 20 63  se if the page c
2140: 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c 79 20 6d  ontent exactly m
2150: 61 74 63 68 65 73 20 77 68 61 74 0a 2a 2a 20 20  atches what.**  
2160: 20 20 20 63 75 72 72 65 6e 74 6c 79 20 65 78 69     currently exi
2170: 73 74 73 20 69 6e 20 74 68 65 20 64 61 74 61 62  sts in the datab
2180: 61 73 65 20 66 69 6c 65 2e 20 20 54 68 65 20 6e  ase file.  The n
2190: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
21a0: 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66 61 6c 73  also.**     fals
21b0: 65 20 69 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e if the origina
21c0: 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73 20 62 65  l content has be
21d0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
21e0: 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a  e main rollback.
21f0: 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 61  **     journal a
2200: 6e 64 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  nd synced.  If t
2210: 68 65 20 70 61 67 65 20 72 65 70 72 65 73 65 6e  he page represen
2220: 74 73 20 61 20 6e 65 77 20 70 61 67 65 20 74 68  ts a new page th
2230: 61 74 20 68 61 73 0a 2a 2a 20 20 20 20 20 62 65  at has.**     be
2240: 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f 20 74 68  en added onto th
2250: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 64 61 74  e end of the dat
2260: 61 62 61 73 65 20 64 75 72 69 6e 67 20 74 68 65  abase during the
2270: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20 20 20 20   current.**     
2280: 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65  transaction, the
2290: 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69   needSync flag i
22a0: 73 20 74 72 75 65 20 75 6e 74 69 6c 20 74 68 65  s true until the
22b0: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
22c0: 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a 65 20 69  se.**     size i
22d0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  n the journal he
22e0: 61 64 65 72 20 68 61 73 20 62 65 65 6e 20 73 79  ader has been sy
22f0: 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 0a 2a 2a  nced to disk..**
2300: 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c 0a 2a 2a  .** inJournal.**
2310: 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 69 73 20  .**     This is 
2320: 74 72 75 65 20 69 66 20 74 68 65 20 6f 72 69 67  true if the orig
2330: 69 6e 61 6c 20 70 61 67 65 20 68 61 73 20 62 65  inal page has be
2340: 65 6e 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  en written into 
2350: 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20 20 20 20  the main.**     
2360: 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
2370: 2e 20 20 54 68 69 73 20 69 73 20 61 6c 77 61 79  .  This is alway
2380: 73 20 66 61 6c 73 65 20 66 6f 72 20 6e 65 77 20  s false for new 
2390: 70 61 67 65 73 20 61 64 64 65 64 20 74 6f 0a 2a  pages added to.*
23a0: 2a 20 20 20 20 20 74 68 65 20 65 6e 64 20 6f 66  *     the end of
23b0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
23c0: 6c 65 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  le during the cu
23d0: 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
23e0: 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64 20 74 68  n..**     And th
23f0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 6e 6f 74  is flag says not
2400: 68 69 6e 67 20 61 62 6f 75 74 20 77 68 65 74 68  hing about wheth
2410: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 6a 6f  er or not the jo
2420: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 68 61 73  urnal.**     has
2430: 20 62 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20   been synced to 
2440: 64 69 73 6b 2e 20 20 46 6f 72 20 70 61 67 65 73  disk.  For pages
2450: 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65   that are in the
2460: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2470: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20   database file, 
2480: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
2490: 70 72 65 73 73 69 6f 6e 20 73 68 6f 75 6c 64 20  pression should 
24a0: 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 3a 0a  always be true:.
24b0: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69 6e 4a 6f  **.**       inJo
24c0: 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
24d0: 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65 72  itvecTest(pPager
24e0: 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->pInJournal, pg
24f0: 6e 6f 29 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68  no).**.**     Th
2500: 65 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  e pPager->pInJou
2510: 72 6e 61 6c 20 6f 62 6a 65 63 74 20 69 73 20 6f  rnal object is o
2520: 6e 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68  nly valid for th
2530: 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20  e original.**   
2540: 20 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64    pages of the d
2550: 61 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77  atabase, not new
2560: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
2570: 61 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64  added to the end
2580: 0a 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64  .**     of the d
2590: 61 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69  atabase, so obvi
25a0: 6f 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20  ously the above 
25b0: 65 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f  expression canno
25c0: 74 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69  t be.**     vali
25d0: 64 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e  d for new pages.
25e0: 20 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20    For new pages 
25f0: 69 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77  inJournal is alw
2600: 61 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72  ays 0..**.** dir
2610: 74 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65  ty.**.**     Whe
2620: 6e 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61  n true, this mea
2630: 6e 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74  ns that the cont
2640: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2650: 68 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20  has been.**     
2660: 6d 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65  modified and nee
2670: 64 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e  ds to be written
2680: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74   back to the dat
2690: 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20  abase file..**  
26a0: 20 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20     If false, it 
26b0: 6d 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65  means that eithe
26c0: 72 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  r the content of
26d0: 20 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20   the page is.** 
26e0: 20 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72      unchanged or
26f0: 20 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e   else the conten
2700: 74 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74  t is unimportant
2710: 20 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a   and we do not.*
2720: 2a 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68  *     care wheth
2730: 65 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20  er or not it is 
2740: 70 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a  preserved..**.**
2750: 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a   alwaysRollback.
2760: 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d  **.**     This m
2770: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71  eans that the sq
2780: 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f  lite3PagerDontRo
2790: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f  llback() API sho
27a0: 75 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67  uld be.**     ig
27b0: 6e 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70  nored for this p
27c0: 61 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f  age.  The DontRo
27d0: 6c 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74  llback() API att
27e0: 65 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20  empts to say.** 
27f0: 20 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e      that the con
2800: 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
2810: 20 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d   on disk is unim
2820: 70 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61  portant (it is a
2830: 6e 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20  n.**     unused 
2840: 70 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65  page on the free
2850: 6c 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74  list) so that it
2860: 20 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20   is unnecessary 
2870: 74 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62  to .**     rollb
2880: 61 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74  ack changes to t
2890: 68 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65  his page because
28a0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
28b0: 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20  the page.**     
28c0: 63 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f  can change witho
28d0: 75 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  ut changing the 
28e0: 6d 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64  meaning of the d
28f0: 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a  atabase.  This.*
2900: 2a 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72  *     flag overr
2910: 69 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c  ides any DontRol
2920: 6c 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e  lback() attempt.
2930: 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73    This flag is s
2940: 65 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61  et.**     when a
2950: 20 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69   page that origi
2960: 6e 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20  nally contained 
2970: 76 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64  valid data is ad
2980: 64 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68  ded to.**     th
2990: 65 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74  e freelist.  Lat
29a0: 65 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74  er in the same t
29b0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73  ransaction, this
29c0: 20 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20   page might.**  
29d0: 20 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f     be pulled fro
29e0: 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61  m the freelist a
29f0: 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
2a00: 6d 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e  mething differen
2a10: 74 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20  t.**     and at 
2a20: 74 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44  that point the D
2a30: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50  ontRollback() AP
2a40: 49 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  I will be called
2a50: 20 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20   because.**     
2a60: 70 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d  pages taken from
2a70: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f   the freelist do
2a80: 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
2a90: 70 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20  protected by.** 
2aa0: 20 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b      the rollback
2ab0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74   journal.  But t
2ac0: 68 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68  his flag says th
2ad0: 61 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a  at the page was.
2ae0: 2a 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69  **     not origi
2af0: 6e 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68  nally part of th
2b00: 65 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68  e freelist so th
2b10: 61 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64  at it still need
2b20: 73 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72  s to.**     be r
2b30: 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70  olled back in sp
2b40: 69 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65  ite of any subse
2b50: 71 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61  quent DontRollba
2b60: 63 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a  ck() calls..**.*
2b70: 2a 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a  * needRead .**.*
2b80: 2a 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20  *     This flag 
2b90: 6d 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65  means (when true
2ba0: 29 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  ) that the conte
2bb0: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2bc0: 61 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65  as.**     not ye
2bd0: 74 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72  t been loaded fr
2be0: 6f 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e  om disk.  The in
2bf0: 2d 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20  -memory content 
2c00: 69 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67  is just.**     g
2c10: 61 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c  arbage.  (Actual
2c20: 6c 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20  ly, we zero the 
2c30: 63 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75  content, but you
2c40: 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20   should not.**  
2c50: 20 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75     make any assu
2c60: 6d 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68  mptions about th
2c70: 65 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74  e content nevert
2c80: 68 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65  heless.)  If the
2c90: 0a 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20  .**     content 
2ca0: 69 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65  is needed in the
2cb0: 20 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75   future, it shou
2cc0: 6c 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20  ld be read from 
2cd0: 74 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69  the.**     origi
2ce0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
2cf0: 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20 50 67 48  e..*/.struct PgH
2d00: 64 72 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  dr {.  Pager *pP
2d10: 61 67 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  ager;           
2d20: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
2d30: 65 72 20 74 6f 20 77 68 69 63 68 20 74 68 69 73  er to which this
2d40: 20 70 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f   page belongs */
2d50: 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20  .  Pgno pgno;   
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
2d80: 6d 62 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  mber for this pa
2d90: 67 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  ge */.  PgHdr *p
2da0: 4e 65 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76  NextHash, *pPrev
2db0: 48 61 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63  Hash;  /* Hash c
2dc0: 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66  ollision chain f
2dd0: 6f 72 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f  or PgHdr.pgno */
2de0: 0a 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20  .  PagerLruLink 
2df0: 66 72 65 65 3b 20 20 20 20 20 20 20 20 20 20 20  free;           
2e00: 20 20 2f 2a 20 4e 65 78 74 20 61 6e 64 20 70 72    /* Next and pr
2e10: 65 76 69 6f 75 73 20 66 72 65 65 20 70 61 67 65  evious free page
2e20: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e  s */.  PgHdr *pN
2e30: 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20  extAll;         
2e40: 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20        /* A list 
2e50: 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a  of all pages */.
2e60: 20 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20    u8 inJournal; 
2e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e80: 20 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20   /* TRUE if has 
2e90: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
2ea0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20  journal */.  u8 
2eb0: 64 69 72 74 79 3b 20 20 20 20 20 20 20 20 20 20  dirty;          
2ec0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ed0: 52 55 45 20 69 66 20 77 65 20 6e 65 65 64 20 74  RUE if we need t
2ee0: 6f 20 77 72 69 74 65 20 62 61 63 6b 20 63 68 61  o write back cha
2ef0: 6e 67 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65  nges */.  u8 nee
2f00: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63           /* Sync
2f20: 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
2f30: 77 72 69 74 69 6e 67 20 74 68 69 73 20 70 61 67  writing this pag
2f40: 65 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  e */.  u8 always
2f50: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
2f60: 20 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65        /* Disable
2f70: 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20   DontRollback() 
2f80: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
2f90: 0a 20 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20  .  u8 needRead; 
2fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fb0: 20 20 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e    /* Read conten
2fc0: 74 20 69 66 20 50 61 67 65 72 57 72 69 74 65 28  t if PagerWrite(
2fd0: 29 20 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20  ) is called */. 
2fe0: 20 73 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b   short int nRef;
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3000: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65  /* Number of use
3010: 72 73 20 6f 66 20 74 68 69 73 20 70 61 67 65 20  rs of this page 
3020: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72  */.  PgHdr *pDir
3030: 74 79 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b  ty, *pPrevDirty;
3040: 20 20 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67      /* Dirty pag
3050: 65 73 20 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  es */.#ifdef SQL
3060: 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52  ITE_ENABLE_MEMOR
3070: 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 50  Y_MANAGEMENT.  P
3080: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 67 66 72 65  agerLruLink gfre
3090: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
30a0: 20 47 6c 6f 62 61 6c 20 6c 69 73 74 20 6f 66 20   Global list of 
30b0: 6e 52 65 66 3d 3d 30 20 70 61 67 65 73 20 2a 2f  nRef==0 pages */
30c0: 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66 20 53  .#endif.#ifdef S
30d0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
30e0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
30f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 76 6f 69 64 20  ;.#endif.  void 
3100: 2a 70 44 61 74 61 3b 20 20 20 20 20 20 20 20 20  *pData;         
3110: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 67            /* Pag
3120: 65 20 64 61 74 61 20 2a 2f 0a 20 20 2f 2a 20 50  e data */.  /* P
3130: 61 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65  ager.nExtra byte
3140: 73 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20  s of local data 
3150: 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 69 73  appended to this
3160: 20 68 65 61 64 65 72 20 2a 2f 0a 7d 3b 0a 0a 2f   header */.};../
3170: 2a 0a 2a 2a 20 46 6f 72 20 61 6e 20 69 6e 2d 6d  *.** For an in-m
3180: 65 6d 6f 72 79 20 6f 6e 6c 79 20 64 61 74 61 62  emory only datab
3190: 61 73 65 2c 20 73 6f 6d 65 20 65 78 74 72 61 20  ase, some extra 
31a0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 72  information is r
31b0: 65 63 6f 72 64 65 64 20 61 62 6f 75 74 0a 2a 2a  ecorded about.**
31c0: 20 65 61 63 68 20 70 61 67 65 20 73 6f 20 74 68   each page so th
31d0: 61 74 20 63 68 61 6e 67 65 73 20 63 61 6e 20 62  at changes can b
31e0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20  e rolled back.  
31f0: 28 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 61  (Journal files a
3200: 72 65 20 6e 6f 74 0a 2a 2a 20 75 73 65 64 20 66  re not.** used f
3210: 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  or in-memory dat
3220: 61 62 61 73 65 73 2e 29 20 20 54 68 65 20 66 6f  abases.)  The fo
3230: 6c 6c 6f 77 69 6e 67 20 69 6e 66 6f 72 6d 61 74  llowing informat
3240: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 74 6f 0a  ion is added to.
3250: 2a 2a 20 74 68 65 20 65 6e 64 20 6f 66 20 65 76  ** the end of ev
3260: 65 72 79 20 45 58 54 52 41 20 62 6c 6f 63 6b 20  ery EXTRA block 
3270: 66 6f 72 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61  for in-memory da
3280: 74 61 62 61 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54  tabases..**.** T
3290: 68 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  his information 
32a0: 63 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20  could have been 
32b0: 61 64 64 65 64 20 64 69 72 65 63 74 6c 79 20 74  added directly t
32c0: 6f 20 74 68 65 20 50 67 48 64 72 20 73 74 72 75  o the PgHdr stru
32d0: 63 74 75 72 65 2e 0a 2a 2a 20 42 75 74 20 74 68  cture..** But th
32e0: 65 6e 20 69 74 20 77 6f 75 6c 64 20 74 61 6b 65  en it would take
32f0: 20 75 70 20 61 6e 20 65 78 74 72 61 20 38 20 62   up an extra 8 b
3300: 79 74 65 73 20 6f 66 20 73 74 6f 72 61 67 65 20  ytes of storage 
3310: 6f 6e 20 65 76 65 72 79 20 50 67 48 64 72 0a 2a  on every PgHdr.*
3320: 2a 20 65 76 65 6e 20 66 6f 72 20 64 69 73 6b 2d  * even for disk-
3330: 62 61 73 65 64 20 64 61 74 61 62 61 73 65 73 2e  based databases.
3340: 20 20 53 70 6c 69 74 74 69 6e 67 20 69 74 20 6f    Splitting it o
3350: 75 74 20 73 61 76 65 73 20 38 20 62 79 74 65 73  ut saves 8 bytes
3360: 2e 20 20 54 68 69 73 0a 2a 2a 20 69 73 20 6f 6e  .  This.** is on
3370: 6c 79 20 61 20 73 61 76 69 6e 67 73 20 6f 66 20  ly a savings of 
3380: 30 2e 38 25 20 62 75 74 20 74 68 6f 73 65 20 70  0.8% but those p
3390: 65 72 63 65 6e 74 61 67 65 73 20 61 64 64 20 75  ercentages add u
33a0: 70 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  p..*/.typedef st
33b0: 72 75 63 74 20 50 67 48 69 73 74 6f 72 79 20 50  ruct PgHistory P
33c0: 67 48 69 73 74 6f 72 79 3b 0a 73 74 72 75 63 74  gHistory;.struct
33d0: 20 50 67 48 69 73 74 6f 72 79 20 7b 0a 20 20 75   PgHistory {.  u
33e0: 38 20 2a 70 4f 72 69 67 3b 20 20 20 20 20 2f 2a  8 *pOrig;     /*
33f0: 20 4f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 74   Original page t
3400: 65 78 74 2e 20 20 52 65 73 74 6f 72 65 20 74 6f  ext.  Restore to
3410: 20 74 68 69 73 20 6f 6e 20 61 20 66 75 6c 6c 20   this on a full 
3420: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 38  rollback */.  u8
3430: 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
3440: 54 65 78 74 20 61 73 20 69 74 20 77 61 73 20 61  Text as it was a
3450: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20  t the beginning 
3460: 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  of the current s
3470: 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 50 67  tatement */.  Pg
3480: 48 64 72 20 2a 70 4e 65 78 74 53 74 6d 74 2c 20  Hdr *pNextStmt, 
3490: 2a 70 50 72 65 76 53 74 6d 74 3b 20 20 2f 2a 20  *pPrevStmt;  /* 
34a0: 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e  List of pages in
34b0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
34c0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
34d0: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
34e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
34f0: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
3500: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
3510: 6c 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41  l */.};../*.** A
3520: 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f 72 20   macro used for 
3530: 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63 6f 64  invoking the cod
3540: 65 63 20 69 66 20 74 68 65 72 65 20 69 73 20 6f  ec if there is o
3550: 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  ne.*/.#ifdef SQL
3560: 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a 23 20  ITE_HAS_CODEC.# 
3570: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3580: 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78 43  D,N,X) if( P->xC
3590: 6f 64 65 63 21 3d 30 20 29 7b 20 50 2d 3e 78 43  odec!=0 ){ P->xC
35a0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
35b0: 67 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 20 64 65  g,D,N,X); }.# de
35c0: 66 69 6e 65 20 43 4f 44 45 43 32 28 50 2c 44 2c  fine CODEC2(P,D,
35d0: 4e 2c 58 29 20 28 28 63 68 61 72 2a 29 28 50 2d  N,X) ((char*)(P-
35e0: 3e 78 43 6f 64 65 63 21 3d 30 3f 50 2d 3e 78 43  >xCodec!=0?P->xC
35f0: 6f 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72  odec(P->pCodecAr
3600: 67 2c 44 2c 4e 2c 58 29 3a 44 29 29 0a 23 65 6c  g,D,N,X):D)).#el
3610: 73 65 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  se.# define CODE
3620: 43 31 28 50 2c 44 2c 4e 2c 58 29 20 2f 2a 20 4e  C1(P,D,N,X) /* N
3630: 4f 2d 4f 50 20 2a 2f 0a 23 20 64 65 66 69 6e 65  O-OP */.# define
3640: 20 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29   CODEC2(P,D,N,X)
3650: 20 28 28 63 68 61 72 2a 29 44 29 0a 23 65 6e 64   ((char*)D).#end
3660: 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72  if../*.** Conver
3670: 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61  t a pointer to a
3680: 20 50 67 48 64 72 20 69 6e 74 6f 20 61 20 70 6f   PgHdr into a po
3690: 69 6e 74 65 72 20 74 6f 20 69 74 73 20 64 61 74  inter to its dat
36a0: 61 0a 2a 2a 20 61 6e 64 20 62 61 63 6b 20 61 67  a.** and back ag
36b0: 61 69 6e 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ain..*/.#define 
36c0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 50 29  PGHDR_TO_DATA(P)
36d0: 20 20 20 20 28 28 50 29 2d 3e 70 44 61 74 61 29      ((P)->pData)
36e0: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
36f0: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
3700: 6f 69 64 2a 29 26 28 28 47 29 5b 31 5d 29 29 0a  oid*)&((G)[1])).
3710: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
3720: 5f 48 49 53 54 28 50 2c 50 47 52 29 20 20 5c 0a  _HIST(P,PGR)  \.
3730: 20 20 20 20 20 20 20 20 20 20 20 20 28 28 50 67              ((Pg
3740: 48 69 73 74 6f 72 79 2a 29 26 28 28 63 68 61 72  History*)&((char
3750: 2a 29 28 26 28 50 29 5b 31 5d 29 29 5b 28 50 47  *)(&(P)[1]))[(PG
3760: 52 29 2d 3e 6e 45 78 74 72 61 5d 29 0a 0a 2f 2a  R)->nExtra])../*
3770: 0a 2a 2a 20 41 20 6f 70 65 6e 20 70 61 67 65 20  .** A open page 
3780: 63 61 63 68 65 20 69 73 20 61 6e 20 69 6e 73 74  cache is an inst
3790: 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c  ance of the foll
37a0: 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65 2e  owing structure.
37b0: 0a 2a 2a 0a 2a 2a 20 50 61 67 65 72 2e 65 72 72  .**.** Pager.err
37c0: 43 6f 64 65 20 6d 61 79 20 62 65 20 73 65 74 20  Code may be set 
37d0: 74 6f 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c  to SQLITE_IOERR,
37e0: 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c   SQLITE_CORRUPT,
37f0: 20 6f 72 0a 2a 2a 20 6f 72 20 53 51 4c 49 54 45   or.** or SQLITE
3800: 5f 46 55 4c 4c 2e 20 4f 6e 63 65 20 6f 6e 65 20  _FULL. Once one 
3810: 6f 66 20 74 68 65 20 66 69 72 73 74 20 74 68 72  of the first thr
3820: 65 65 20 65 72 72 6f 72 73 20 6f 63 63 75 72 73  ee errors occurs
3830: 2c 20 69 74 20 70 65 72 73 69 73 74 73 0a 2a 2a  , it persists.**
3840: 20 61 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64   and is returned
3850: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 20 6f   as the result o
3860: 66 20 65 76 65 72 79 20 6d 61 6a 6f 72 20 70 61  f every major pa
3870: 67 65 72 20 41 50 49 20 63 61 6c 6c 2e 20 20 54  ger API call.  T
3880: 68 65 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  he.** SQLITE_FUL
3890: 4c 20 72 65 74 75 72 6e 20 63 6f 64 65 20 69 73  L return code is
38a0: 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
38b0: 65 6e 74 2e 20 49 74 20 70 65 72 73 69 73 74 73  ent. It persists
38c0: 20 6f 6e 6c 79 20 75 6e 74 69 6c 20 74 68 65 0a   only until the.
38d0: 2a 2a 20 6e 65 78 74 20 73 75 63 63 65 73 73 66  ** next successf
38e0: 75 6c 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20 70  ul rollback is p
38f0: 65 72 66 6f 72 6d 65 64 20 6f 6e 20 74 68 65 20  erformed on the 
3900: 70 61 67 65 72 20 63 61 63 68 65 2e 20 41 6c 73  pager cache. Als
3910: 6f 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 46 55 4c  o,.** SQLITE_FUL
3920: 4c 20 64 6f 65 73 20 6e 6f 74 20 61 66 66 65 63  L does not affec
3930: 74 20 74 68 65 20 73 71 6c 69 74 65 33 50 61 67  t the sqlite3Pag
3940: 65 72 47 65 74 28 29 20 61 6e 64 20 73 71 6c 69  erGet() and sqli
3950: 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29  te3PagerLookup()
3960: 0a 2a 2a 20 41 50 49 73 2c 20 74 68 65 79 20 6d  .** APIs, they m
3970: 61 79 20 73 74 69 6c 6c 20 62 65 20 75 73 65 64  ay still be used
3980: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 0a 2a   successfully..*
3990: 2f 0a 73 74 72 75 63 74 20 50 61 67 65 72 20 7b  /.struct Pager {
39a0: 0a 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  .  sqlite3_vfs *
39b0: 70 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 2f  pVfs;          /
39c0: 2a 20 4f 53 20 66 75 6e 63 74 69 6f 6e 73 20 74  * OS functions t
39d0: 6f 20 75 73 65 20 66 6f 72 20 49 4f 20 2a 2f 0a  o use for IO */.
39e0: 20 20 75 38 20 6a 6f 75 72 6e 61 6c 4f 70 65 6e    u8 journalOpen
39f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3a00: 20 54 72 75 65 20 69 66 20 6a 6f 75 72 6e 61 6c   True if journal
3a10: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
3a20: 73 20 69 73 20 76 61 6c 69 64 20 2a 2f 0a 20 20  s is valid */.  
3a30: 75 38 20 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  u8 journalStarte
3a40: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  d;          /* T
3a50: 72 75 65 20 69 66 20 68 65 61 64 65 72 20 6f 66  rue if header of
3a60: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
3a70: 65 64 20 2a 2f 0a 20 20 75 38 20 75 73 65 4a 6f  ed */.  u8 useJo
3a80: 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20  urnal;          
3a90: 20 20 20 20 2f 2a 20 55 73 65 20 61 20 72 6f 6c      /* Use a rol
3aa0: 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6f 6e  lback journal on
3ab0: 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a 20 20   this file */.  
3ac0: 75 38 20 6e 6f 52 65 61 64 6c 6f 63 6b 3b 20 20  u8 noReadlock;  
3ad0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
3ae0: 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20 74 6f 20  o not bother to 
3af0: 6f 62 74 61 69 6e 20 72 65 61 64 6c 6f 63 6b 73  obtain readlocks
3b00: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 4f 70 65   */.  u8 stmtOpe
3b10: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
3b20: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65    /* True if the
3b30: 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62 6a 6f   statement subjo
3b40: 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 2a 2f  urnal is open */
3b50: 0a 20 20 75 38 20 73 74 6d 74 49 6e 55 73 65 3b  .  u8 stmtInUse;
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3b70: 2a 20 54 72 75 65 20 77 65 20 61 72 65 20 69 6e  * True we are in
3b80: 20 61 20 73 74 61 74 65 6d 65 6e 74 20 73 75 62   a statement sub
3b90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a 2f 0a 20  transaction */. 
3ba0: 20 75 38 20 73 74 6d 74 41 75 74 6f 6f 70 65 6e   u8 stmtAutoopen
3bb0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
3bc0: 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75 72 6e 61  Open stmt journa
3bd0: 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a 6f 75 72  l when main jour
3be0: 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64 2a 2f 0a  nal is opened*/.
3bf0: 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20 20 20 20    u8 noSync;    
3c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3c10: 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20 74 68 65   Do not sync the
3c20: 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74 72 75 65   journal if true
3c30: 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c 53 79 6e   */.  u8 fullSyn
3c40: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
3c50: 20 20 2f 2a 20 44 6f 20 65 78 74 72 61 20 73 79    /* Do extra sy
3c60: 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ncs of the journ
3c70: 61 6c 20 66 6f 72 20 72 6f 62 75 73 74 6e 65 73  al for robustnes
3c80: 73 20 2a 2f 0a 20 20 75 38 20 73 79 6e 63 5f 66  s */.  u8 sync_f
3c90: 6c 61 67 73 3b 20 20 20 20 20 20 20 20 20 20 20  lags;           
3ca0: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 53 59 4e     /* One of SYN
3cb0: 43 5f 4e 4f 52 4d 41 4c 20 6f 72 20 53 59 4e 43  C_NORMAL or SYNC
3cc0: 5f 46 55 4c 4c 20 2a 2f 0a 20 20 75 38 20 73 74  _FULL */.  u8 st
3cd0: 61 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ate;            
3ce0: 20 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f         /* PAGER_
3cf0: 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c  UNLOCK, _SHARED,
3d00: 20 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e   _RESERVED, etc.
3d10: 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46 69 6c   */.  u8 tempFil
3d20: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
3d30: 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 20 69    /* zFilename i
3d40: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  s a temporary fi
3d50: 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61 64 4f  le */.  u8 readO
3d60: 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  nly;            
3d70: 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f 72 20      /* True for 
3d80: 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74 61  a read-only data
3d90: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e 65 65  base */.  u8 nee
3da0: 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  dSync;          
3db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3dc0: 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73 20 6e   an fsync() is n
3dd0: 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a 6f 75  eeded on the jou
3de0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72  rnal */.  u8 dir
3df0: 74 79 43 61 63 68 65 3b 20 20 20 20 20 20 20 20  tyCache;        
3e00: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3e10: 20 63 61 63 68 65 64 20 70 61 67 65 73 20 68 61   cached pages ha
3e20: 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a 20 20  ve changed */.  
3e30: 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  u8 alwaysRollbac
3e40: 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44  k;          /* D
3e50: 69 73 61 62 6c 65 20 44 6f 6e 74 52 6f 6c 6c 62  isable DontRollb
3e60: 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c 20 70 61  ack() for all pa
3e70: 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d 65 6d 44  ges */.  u8 memD
3e80: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b;              
3e90: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
3ea0: 69 6e 68 69 62 69 74 20 61 6c 6c 20 66 69 6c 65  inhibit all file
3eb0: 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20 73 65 74   I/O */.  u8 set
3ec0: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
3ed0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3ee0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
3ef0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
3f00: 6a 72 6e 6c 20 2a 2f 0a 20 20 75 38 20 64 6f 4e  jrnl */.  u8 doN
3f10: 6f 74 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20  otSync;         
3f20: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f30: 2e 20 57 68 69 6c 65 20 74 72 75 65 2c 20 64 6f  . While true, do
3f40: 20 6e 6f 74 20 73 70 69 6c 6c 20 74 68 65 20 63   not spill the c
3f50: 61 63 68 65 20 2a 2f 0a 20 20 75 38 20 65 78 63  ache */.  u8 exc
3f60: 6c 75 73 69 76 65 4d 6f 64 65 3b 20 20 20 20 20  lusiveMode;     
3f70: 20 20 20 20 20 20 2f 2a 20 42 6f 6f 6c 65 61 6e        /* Boolean
3f80: 2e 20 54 72 75 65 20 69 66 20 6c 6f 63 6b 69 6e  . True if lockin
3f90: 67 5f 6d 6f 64 65 3d 3d 45 58 43 4c 55 53 49 56  g_mode==EXCLUSIV
3fa0: 45 20 2a 2f 0a 20 20 75 38 20 63 68 61 6e 67 65  E */.  u8 change
3fb0: 43 6f 75 6e 74 44 6f 6e 65 3b 20 20 20 20 20 20  CountDone;      
3fc0: 20 20 20 2f 2a 20 53 65 74 20 61 66 74 65 72 20     /* Set after 
3fd0: 69 6e 63 72 65 6d 65 6e 74 69 6e 67 20 74 68 65  incrementing the
3fe0: 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 20   change-counter 
3ff0: 2a 2f 0a 20 20 75 33 32 20 76 66 73 46 6c 61 67  */.  u32 vfsFlag
4000: 73 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s;              
4010: 20 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 73 71   /* Flags for sq
4020: 6c 69 74 65 33 5f 76 66 73 2e 78 4f 70 65 6e 28  lite3_vfs.xOpen(
4030: 29 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6f  ) */.  int errCo
4040: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  de;             
4050: 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76     /* One of sev
4060: 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72  eral kinds of er
4070: 72 6f 72 73 20 2a 2f 0a 20 20 69 6e 74 20 64 62  rors */.  int db
4080: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
4090: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
40a0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
40b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6f 72  file */.  int or
40c0: 69 67 44 62 53 69 7a 65 3b 20 20 20 20 20 20 20  igDbSize;       
40d0: 20 20 20 20 20 20 2f 2a 20 64 62 53 69 7a 65 20        /* dbSize 
40e0: 62 65 66 6f 72 65 20 74 68 65 20 63 75 72 72 65  before the curre
40f0: 6e 74 20 63 68 61 6e 67 65 20 2a 2f 0a 20 20 69  nt change */.  i
4100: 6e 74 20 73 74 6d 74 53 69 7a 65 3b 20 20 20 20  nt stmtSize;    
4110: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
4120: 7a 65 20 6f 66 20 64 61 74 61 62 61 73 65 20 28  ze of database (
4130: 69 6e 20 70 61 67 65 73 29 20 61 74 20 73 74 6d  in pages) at stm
4140: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
4150: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
4160: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
4170: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
4180: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
4190: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
41a0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
41b0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
41c0: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
41d0: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
41e0: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
41f0: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
4200: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
4210: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
4220: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
4230: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
4240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4250: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
4260: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
4270: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
4280: 20 69 6e 74 20 70 61 67 65 53 69 7a 65 3b 20 20   int pageSize;  
4290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
42a0: 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  Number of bytes 
42b0: 69 6e 20 61 20 70 61 67 65 20 2a 2f 0a 20 20 69  in a page */.  i
42c0: 6e 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20  nt nPage;       
42d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f             /* To
42e0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e  tal number of in
42f0: 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 2a 2f  -memory pages */
4300: 0a 20 20 69 6e 74 20 6e 52 65 66 3b 20 20 20 20  .  int nRef;    
4310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4320: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  * Number of in-m
4330: 65 6d 6f 72 79 20 70 61 67 65 73 20 77 69 74 68  emory pages with
4340: 20 50 67 48 64 72 2e 6e 52 65 66 3e 30 20 2a 2f   PgHdr.nRef>0 */
4350: 0a 20 20 69 6e 74 20 6d 78 50 61 67 65 3b 20 20  .  int mxPage;  
4360: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4370: 2a 20 4d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  * Maximum number
4380: 20 6f 66 20 70 61 67 65 73 20 74 6f 20 68 6f 6c   of pages to hol
4390: 64 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  d in cache */.  
43a0: 50 67 6e 6f 20 6d 78 50 67 6e 6f 3b 20 20 20 20  Pgno mxPgno;    
43b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d              /* M
43c0: 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65 64 20 73  aximum allowed s
43d0: 69 7a 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ize of the datab
43e0: 61 73 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20  ase */.  Bitvec 
43f0: 2a 70 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *pInJournal;    
4400: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20       /* One bit 
4410: 66 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e  for each page in
4420: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
4430: 6c 65 20 2a 2f 0a 20 20 42 69 74 76 65 63 20 2a  le */.  Bitvec *
4440: 70 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  pInStmt;        
4450: 20 20 20 20 2f 2a 20 4f 6e 65 20 62 69 74 20 66      /* One bit f
4460: 6f 72 20 65 61 63 68 20 70 61 67 65 20 69 6e 20  or each page in 
4470: 74 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  the database */.
4480: 20 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d    char *zFilenam
4490: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e;            /*
44a0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
44b0: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
44c0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20  char *zJournal; 
44d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
44e0: 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
44f0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  al file */.  cha
4500: 72 20 2a 7a 44 69 72 65 63 74 6f 72 79 3b 20 20  r *zDirectory;  
4510: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 69 72 65           /* Dire
4520: 63 74 6f 72 79 20 68 6f 6c 64 20 64 61 74 61 62  ctory hold datab
4530: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
4540: 66 69 6c 65 73 20 2a 2f 0a 20 20 63 68 61 72 20  files */.  char 
4550: 2a 7a 53 74 6d 74 4a 72 6e 6c 3b 20 20 20 20 20  *zStmtJrnl;     
4560: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4570: 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
4580: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
4590: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
45a0: 66 64 2c 20 2a 6a 66 64 3b 20 20 20 20 20 2f 2a  fd, *jfd;     /*
45b0: 20 46 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   File descriptor
45c0: 73 20 66 6f 72 20 64 61 74 61 62 61 73 65 20 61  s for database a
45d0: 6e 64 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  nd journal */.  
45e0: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 73 74  sqlite3_file *st
45f0: 66 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 46  fd;         /* F
4600: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 66  ile descriptor f
4610: 6f 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  or the statement
4620: 20 73 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20   subjournal*/.  
4630: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
4640: 73 79 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50  syHandler;  /* P
4650: 6f 69 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65  ointer to sqlite
4660: 2e 62 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a  .busyHandler */.
4670: 20 20 50 61 67 65 72 4c 72 75 4c 69 73 74 20 6c    PagerLruList l
4680: 72 75 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ru;           /*
4690: 20 4c 52 55 20 6c 69 73 74 20 6f 66 20 66 72 65   LRU list of fre
46a0: 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50 67 48  e pages */.  PgH
46b0: 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20  dr *pAll;       
46c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74           /* List
46d0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
46e0: 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74 3b  .  PgHdr *pStmt;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
4700: 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73 20  * List of pages 
4710: 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  in the statement
4720: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
4730: 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b 20   PgHdr *pDirty; 
4740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4750: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 64 69 72 74  List of all dirt
4760: 79 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 36 34  y pages */.  i64
4770: 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20 20   journalOff;    
4780: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
4790: 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74 20  ent byte offset 
47a0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
47b0: 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f 75  ile */.  i64 jou
47c0: 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20 20  rnalHdr;        
47d0: 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66 66       /* Byte off
47e0: 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73 20  set to previous 
47f0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2a  journal header *
4800: 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72 4f  /.  i64 stmtHdrO
4810: 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ff;             
4820: 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61 6c  /* First journal
4830: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
4840: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 2a  this statement *
4850: 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73 75  /.  i64 stmtCksu
4860: 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  m;              
4870: 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68 65  /* cksumInit whe
4880: 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20  n statement was 
4890: 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 36 34  started */.  i64
48a0: 20 73 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20   stmtJSize;     
48b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
48c0: 20 6f 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73   of journal at s
48d0: 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20  tmt_begin() */. 
48e0: 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65 3b   int sectorSize;
48f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
4900: 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20 73  Assumed sector s
4910: 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ize during rollb
4920: 61 63 6b 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  ack */.#ifdef SQ
4930: 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
4940: 6e 48 69 74 2c 20 6e 4d 69 73 73 3b 20 20 20 20  nHit, nMiss;    
4950: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 63 68 65          /* Cache
4960: 20 68 69 74 73 20 61 6e 64 20 6d 69 73 73 69 6e   hits and missin
4970: 67 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 61 64  g */.  int nRead
4980: 2c 20 6e 57 72 69 74 65 3b 20 20 20 20 20 20 20  , nWrite;       
4990: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 70     /* Database p
49a0: 61 67 65 73 20 72 65 61 64 2f 77 72 69 74 74 65  ages read/writte
49b0: 6e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 76 6f  n */.#endif.  vo
49c0: 69 64 20 28 2a 78 44 65 73 74 72 75 63 74 6f 72  id (*xDestructor
49d0: 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20  )(DbPage*,int); 
49e0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
49f0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
4a00: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
4a10: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 44  d (*xReiniter)(D
4a20: 62 50 61 67 65 2a 2c 69 6e 74 29 3b 20 20 20 2f  bPage*,int);   /
4a30: 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74  * Call this rout
4a40: 69 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69  ine when reloadi
4a50: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 23 69 66 64  ng pages */.#ifd
4a60: 65 66 20 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f  ef SQLITE_HAS_CO
4a70: 44 45 43 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43  DEC.  void *(*xC
4a80: 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
4a90: 2a 2c 50 67 6e 6f 2c 69 6e 74 29 3b 20 2f 2a 20  *,Pgno,int); /* 
4aa0: 52 6f 75 74 69 6e 65 20 66 6f 72 20 65 6e 2f 64  Routine for en/d
4ab0: 65 63 6f 64 69 6e 67 20 64 61 74 61 20 2a 2f 0a  ecoding data */.
4ac0: 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72    void *pCodecAr
4ad0: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  g;            /*
4ae0: 20 46 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20   First argument 
4af0: 74 6f 20 78 43 6f 64 65 63 28 29 20 2a 2f 0a 23  to xCodec() */.#
4b00: 65 6e 64 69 66 0a 20 20 69 6e 74 20 6e 48 61 73  endif.  int nHas
4b10: 68 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  h;              
4b20: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
4b30: 68 65 20 70 61 67 65 72 20 68 61 73 68 20 74 61  he pager hash ta
4b40: 62 6c 65 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ble */.  PgHdr *
4b50: 2a 61 48 61 73 68 3b 20 20 20 20 20 20 20 20 20  *aHash;         
4b60: 20 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61 62       /* Hash tab
4b70: 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20 6e  le to map page n
4b80: 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20 2a  umber to PgHdr *
4b90: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
4ba0: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
4bb0: 4e 41 47 45 4d 45 4e 54 0a 20 20 50 61 67 65 72  NAGEMENT.  Pager
4bc0: 20 2a 70 4e 65 78 74 3b 20 20 20 20 20 20 20 20   *pNext;        
4bd0: 20 20 20 20 20 20 20 2f 2a 20 44 6f 75 62 6c 79         /* Doubly
4be0: 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20   linked list of 
4bf0: 70 61 67 65 72 73 20 6f 6e 20 77 68 69 63 68 20  pagers on which 
4c00: 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 72 65  */.  Pager *pPre
4c10: 76 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  v;              
4c20: 20 2f 2a 20 73 71 6c 69 74 65 33 5f 72 65 6c 65   /* sqlite3_rele
4c30: 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20 77 69 6c  ase_memory() wil
4c40: 6c 20 77 6f 72 6b 20 2a 2f 0a 20 20 69 6e 74 20  l work */.  int 
4c50: 69 49 6e 55 73 65 4d 4d 3b 20 20 20 20 20 20 20  iInUseMM;       
4c60: 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 7a          /* Non-z
4c70: 65 72 6f 20 69 66 20 75 6e 61 76 61 69 6c 61 62  ero if unavailab
4c80: 6c 65 20 74 6f 20 4d 4d 20 2a 2f 0a 20 20 69 6e  le to MM */.  in
4c90: 74 20 69 49 6e 55 73 65 44 42 3b 20 20 20 20 20  t iInUseDB;     
4ca0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 6e            /* Non
4cb0: 2d 7a 65 72 6f 20 69 66 20 69 6e 20 73 71 6c 69  -zero if in sqli
4cc0: 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65 6d 6f  te3_release_memo
4cd0: 72 79 28 29 20 2a 2f 0a 23 65 6e 64 69 66 0a 20  ry() */.#endif. 
4ce0: 20 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65   char *pTmpSpace
4cf0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4d00: 50 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62  Pager.pageSize b
4d10: 79 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f  ytes of space fo
4d20: 72 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63  r tmp use */.  c
4d30: 68 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31  har dbFileVers[1
4d40: 36 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68  6];        /* Ch
4d50: 61 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64  anges whenever d
4d60: 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
4d70: 6e 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  nges */.};../*.*
4d80: 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  * The following 
4d90: 67 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73  global variables
4da0: 20 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75   hold counters u
4db0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69  sed for.** testi
4dc0: 6e 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79  ng purposes only
4dd0: 2e 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c  .  These variabl
4de0: 65 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20  es do not exist 
4df0: 69 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74  in.** a non-test
4e00: 69 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73  ing build.  Thes
4e10: 65 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20  e variables are 
4e20: 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e  not thread-safe.
4e30: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
4e40: 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74  E_TEST.int sqlit
4e50: 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
4e60: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a  count = 0;    /*
4e70: 20 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20   Number of full 
4e80: 70 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20  pages read from 
4e90: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ea0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f  3_pager_writedb_
4eb0: 63 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20  count = 0;   /* 
4ec0: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4ed0: 61 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20  ages written to 
4ee0: 44 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  DB */.int sqlite
4ef0: 33 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63  3_pager_writej_c
4f00: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4f10: 4e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  Number of pages 
4f20: 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e  written to journ
4f30: 61 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  al */.int sqlite
4f40: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
4f50: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4f60: 4e 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20  Number of cache 
4f70: 70 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23  pages freed */.#
4f80: 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e   define PAGER_IN
4f90: 43 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65  CR(v)  v++.#else
4fa0: 0a 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f  .# define PAGER_
4fb0: 49 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a  INCR(v).#endif..
4fc0: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
4fd0: 69 6e 67 20 76 61 72 69 61 62 6c 65 20 70 6f 69  ing variable poi
4fe0: 6e 74 73 20 74 6f 20 74 68 65 20 68 65 61 64 20  nts to the head 
4ff0: 6f 66 20 61 20 64 6f 75 62 6c 65 2d 6c 69 6e 6b  of a double-link
5000: 65 64 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  ed list.** of al
5010: 6c 20 70 61 67 65 72 73 20 74 68 61 74 20 61 72  l pagers that ar
5020: 65 20 65 6c 69 67 69 62 6c 65 20 66 6f 72 20 70  e eligible for p
5030: 61 67 65 20 73 74 65 61 6c 69 6e 67 20 62 79 20  age stealing by 
5040: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 5f 72  the.** sqlite3_r
5050: 65 6c 65 61 73 65 5f 6d 65 6d 6f 72 79 28 29 20  elease_memory() 
5060: 69 6e 74 65 72 66 61 63 65 2e 20 20 41 63 63 65  interface.  Acce
5070: 73 73 20 74 6f 20 74 68 69 73 20 6c 69 73 74 20  ss to this list 
5080: 69 73 0a 2a 2a 20 70 72 6f 74 65 63 74 65 64 20  is.** protected 
5090: 62 79 20 74 68 65 20 53 51 4c 49 54 45 5f 4d 55  by the SQLITE_MU
50a0: 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 20  TEX_STATIC_MEM2 
50b0: 6d 75 74 65 78 2e 0a 2a 2f 0a 23 69 66 64 65 66  mutex..*/.#ifdef
50c0: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
50d0: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
50e0: 0a 73 74 61 74 69 63 20 50 61 67 65 72 20 2a 73  .static Pager *s
50f0: 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 20  qlite3PagerList 
5100: 3d 20 30 3b 0a 73 74 61 74 69 63 20 50 61 67 65  = 0;.static Page
5110: 72 4c 72 75 4c 69 73 74 20 73 71 6c 69 74 65 33  rLruList sqlite3
5120: 4c 72 75 50 61 67 65 4c 69 73 74 20 3d 20 7b 30  LruPageList = {0
5130: 2c 20 30 2c 20 30 7d 3b 0a 23 65 6e 64 69 66 0a  , 0, 0};.#endif.
5140: 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20  ../*.** Journal 
5150: 66 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68  files begin with
5160: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
5170: 61 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68  agic string.  Th
5180: 65 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62  e data.** was ob
5190: 74 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76  tained from /dev
51a0: 2f 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20  /random.  It is 
51b0: 75 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73  used only as a s
51c0: 61 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a  anity check..**.
51d0: 2a 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e  ** Since version
51e0: 20 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72   2.8.0, the jour
51f0: 6e 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61  nal format conta
5200: 69 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73  ins additional s
5210: 61 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e  anity.** checkin
5220: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20  g information.  
5230: 49 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69  If the power fai
5240: 6c 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75  ls while the jou
5250: 72 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a  rnal is begin.**
5260: 20 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72   written, semi-r
5270: 61 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61  andom garbage da
5280: 74 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20  ta might appear 
5290: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a  in the journal.*
52a0: 2a 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77  * file after pow
52b0: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20  er is restored. 
52c0: 20 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69   If an attempt i
52d0: 73 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74  s then made.** t
52e0: 6f 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e  o roll the journ
52f0: 61 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74  al back, the dat
5300: 61 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63  abase could be c
5310: 6f 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61  orrupted.  The a
5320: 64 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e  dditional.** san
5330: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74  ity checking dat
5340: 61 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20  a is an attempt 
5350: 74 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20  to discover the 
5360: 67 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a  garbage in the.*
5370: 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67  * journal and ig
5380: 6e 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54  nore it..**.** T
5390: 68 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  he sanity checki
53a0: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66  ng information f
53b0: 6f 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e  or the new journ
53c0: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73  al format consis
53d0: 74 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69  ts.** of a 32-bi
53e0: 74 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61  t checksum on ea
53f0: 63 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  ch page of data.
5400: 20 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63    The checksum c
5410: 6f 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68  overs both.** th
5420: 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e  e page number an
5430: 64 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61  d the pPager->pa
5440: 67 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20  geSize bytes of 
5450: 64 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67  data for the pag
5460: 65 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d  e..** This cksum
5470: 20 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20   is initialized 
5480: 74 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64  to a 32-bit rand
5490: 6f 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70  om value that ap
54a0: 70 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  pears in the.** 
54b0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67  journal file rig
54c0: 68 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61  ht after the hea
54d0: 64 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d  der.  The random
54e0: 20 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20   initializer is 
54f0: 69 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65  important,.** be
5500: 63 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61  cause garbage da
5510: 74 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ta that appears 
5520: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
5530: 6a 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c  journal is likel
5540: 79 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77  y.** data that w
5550: 61 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72  as once in other
5560: 20 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65   files that have
5570: 20 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65   now been delete
5580: 64 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61  d.  If the.** ga
5590: 72 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20  rbage data came 
55a0: 66 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65  from an obsolete
55b0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
55c0: 68 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67  he checksums mig
55d0: 68 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74  ht.** be correct
55e0: 2e 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61  .  But by initia
55f0: 6c 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b  lizing the check
5600: 73 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61  sum to random va
5610: 6c 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20  lue which.** is 
5620: 64 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76  different for ev
5630: 65 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20  ery journal, we 
5640: 6d 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69  minimize that ri
5650: 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  sk..*/.static co
5660: 6e 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61  nst unsigned cha
5670: 72 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  r aJournalMagic[
5680: 5d 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78  ] = {.  0xd9, 0x
5690: 64 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20  d5, 0x05, 0xf9, 
56a0: 30 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33  0x20, 0xa1, 0x63
56b0: 2c 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a  , 0xd7,.};../*.*
56c0: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
56d0: 65 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20  e header and of 
56e0: 65 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65  each page in the
56f0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65   journal is dete
5700: 72 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65  rmined.** by the
5710: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f   following macro
5720: 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f  s..*/.#define JO
5730: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
5740: 65 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70  er)  ((pPager->p
5750: 61 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f  ageSize) + 8)../
5760: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5770: 20 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72   header size for
5780: 20 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20   this pager. In 
5790: 74 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73  the future, this
57a0: 20 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74   could be.** set
57b0: 20 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72   to some value r
57c0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73  ead from the dis
57d0: 6b 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68  k controller. Th
57e0: 65 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63  e important.** c
57f0: 68 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73  haracteristic is
5800: 20 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20   that it is the 
5810: 73 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64  same size as a d
5820: 69 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23  isk sector..*/.#
5830: 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48  define JOURNAL_H
5840: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70  DR_SZ(pPager) (p
5850: 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
5860: 65 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  e)../*.** The ma
5870: 63 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75  cro MEMDB is tru
5880: 65 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c  e if we are deal
5890: 69 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d  ing with an in-m
58a0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
58b0: 2a 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73  ** We do this as
58c0: 20 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74   a macro so that
58d0: 20 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f   if the SQLITE_O
58e0: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63  MIT_MEMORYDB mac
58f0: 72 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68  ro is set,.** th
5900: 65 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42  e value of MEMDB
5910: 20 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74   will be a const
5920: 61 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70  ant and the comp
5930: 69 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69  iler will optimi
5940: 7a 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74  ze.** out code t
5950: 68 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20  hat would never 
5960: 65 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64  execute..*/.#ifd
5970: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
5980: 45 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65  EMORYDB.# define
5990: 20 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23   MEMDB 0.#else.#
59a0: 20 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50   define MEMDB pP
59b0: 61 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64  ager->memDb.#end
59c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  if../*.** Page n
59d0: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
59e0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
59f0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
5a00: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
5a10: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
5a20: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
5a30: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
5a40: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
5a50: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
5a60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
5a70: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
5a80: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
5a90: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
5aa0: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
5ab0: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
5ac0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
5ad0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
5ae0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
5af0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
5b00: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
5b10: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
5b20: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
5b30: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
5b40: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
5b50: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
5b60: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
5b70: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
5b80: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
5b90: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
5ba0: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
5bb0: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
5bc0: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
5bd0: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
5be0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
5bf0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
5c00: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
5c10: 2a 2a 20 54 68 65 20 70 61 67 65 72 45 6e 74 65  ** The pagerEnte
5c20: 72 28 29 20 61 6e 64 20 70 61 67 65 72 4c 65 61  r() and pagerLea
5c30: 76 65 28 29 20 72 6f 75 74 69 6e 65 73 20 61 63  ve() routines ac
5c40: 71 75 69 72 65 20 61 6e 64 20 72 65 6c 65 61 73  quire and releas
5c50: 65 0a 2a 2a 20 61 20 6d 75 74 65 78 20 6f 6e 20  e.** a mutex on 
5c60: 65 61 63 68 20 70 61 67 65 72 2e 20 20 54 68 65  each pager.  The
5c70: 20 6d 75 74 65 78 20 69 73 20 72 65 63 75 72 73   mutex is recurs
5c80: 69 76 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ive..**.** This 
5c90: 69 73 20 61 20 73 70 65 63 69 61 6c 2d 70 75 72  is a special-pur
5ca0: 70 6f 73 65 20 6d 75 74 65 78 2e 20 20 49 74 20  pose mutex.  It 
5cb0: 6f 6e 6c 79 20 70 72 6f 76 69 64 65 73 20 6d 75  only provides mu
5cc0: 74 75 61 6c 20 65 78 63 6c 75 73 69 6f 6e 0a 2a  tual exclusion.*
5cd0: 2a 20 62 65 74 77 65 65 6e 20 74 68 65 20 42 74  * between the Bt
5ce0: 72 65 65 20 61 6e 64 20 74 68 65 20 4d 65 6d 6f  ree and the Memo
5cf0: 72 79 20 4d 61 6e 61 67 65 6d 65 6e 74 20 73 71  ry Management sq
5d00: 6c 69 74 65 33 5f 72 65 6c 65 61 73 65 5f 6d 65  lite3_release_me
5d10: 6d 6f 72 79 28 29 0a 2a 2a 20 66 75 6e 63 74 69  mory().** functi
5d20: 6f 6e 2e 20 20 49 74 20 64 6f 65 73 20 6e 6f 74  on.  It does not
5d30: 20 70 72 65 76 65 6e 74 2c 20 66 6f 72 20 65 78   prevent, for ex
5d40: 61 6d 70 6c 65 2c 20 74 77 6f 20 42 74 72 65 65  ample, two Btree
5d50: 73 20 66 72 6f 6d 20 61 63 63 65 73 73 69 6e 67  s from accessing
5d60: 0a 2a 2a 20 74 68 65 20 73 61 6d 65 20 70 61 67  .** the same pag
5d70: 65 72 20 61 74 20 74 68 65 20 73 61 6d 65 20 74  er at the same t
5d80: 69 6d 65 2e 20 20 4f 74 68 65 72 20 67 65 6e 65  ime.  Other gene
5d90: 72 61 6c 2d 70 75 72 70 6f 73 65 20 6d 75 74 65  ral-purpose mute
5da0: 78 65 73 20 69 6e 0a 2a 2a 20 74 68 65 20 62 74  xes in.** the bt
5db0: 72 65 65 20 6c 61 79 65 72 20 68 61 6e 64 6c 65  ree layer handle
5dc0: 20 74 68 61 74 20 63 68 6f 72 65 2e 0a 2a 2f 0a   that chore..*/.
5dd0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
5de0: 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41  ABLE_MEMORY_MANA
5df0: 47 45 4d 45 4e 54 0a 20 20 73 74 61 74 69 63 20  GEMENT.  static 
5e00: 76 6f 69 64 20 70 61 67 65 72 45 6e 74 65 72 28  void pagerEnter(
5e10: 50 61 67 65 72 20 2a 70 29 7b 0a 20 20 20 20 70  Pager *p){.    p
5e20: 2d 3e 69 49 6e 55 73 65 44 42 2b 2b 3b 0a 20 20  ->iInUseDB++;.  
5e30: 20 20 69 66 28 20 70 2d 3e 69 49 6e 55 73 65 4d    if( p->iInUseM
5e40: 4d 20 26 26 20 70 2d 3e 69 49 6e 55 73 65 44 42  M && p->iInUseDB
5e50: 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==1 ){.      sql
5e60: 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
5e70: 78 3b 0a 20 20 20 20 20 20 6d 75 74 65 78 20 3d  x;.      mutex =
5e80: 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
5e90: 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
5ea0: 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
5eb0: 20 20 20 20 20 20 70 2d 3e 69 49 6e 55 73 65 44        p->iInUseD
5ec0: 42 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c  B = 0;.      sql
5ed0: 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
5ee0: 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 20 20 70  (mutex);.      p
5ef0: 2d 3e 69 49 6e 55 73 65 44 42 20 3d 20 31 3b 0a  ->iInUseDB = 1;.
5f00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75        sqlite3_mu
5f10: 74 65 78 5f 6c 65 61 76 65 28 6d 75 74 65 78 29  tex_leave(mutex)
5f20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
5f30: 72 74 28 20 70 2d 3e 69 49 6e 55 73 65 4d 4d 3d  rt( p->iInUseMM=
5f40: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 73 74 61 74  =0 );.  }.  stat
5f50: 69 63 20 76 6f 69 64 20 70 61 67 65 72 4c 65 61  ic void pagerLea
5f60: 76 65 28 50 61 67 65 72 20 2a 70 29 7b 0a 20 20  ve(Pager *p){.  
5f70: 20 20 70 2d 3e 69 49 6e 55 73 65 44 42 2d 2d 3b    p->iInUseDB--;
5f80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e  .    assert( p->
5f90: 69 49 6e 55 73 65 44 42 3e 3d 30 20 29 3b 0a 20  iInUseDB>=0 );. 
5fa0: 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
5fb0: 65 20 70 61 67 65 72 45 6e 74 65 72 28 58 29 0a  e pagerEnter(X).
5fc0: 23 20 64 65 66 69 6e 65 20 70 61 67 65 72 4c 65  # define pagerLe
5fd0: 61 76 65 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f  ave(X).#endif../
5fe0: 2a 0a 2a 2a 20 41 64 64 20 70 61 67 65 20 70 50  *.** Add page pP
5ff0: 67 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  g to the end of 
6000: 74 68 65 20 6c 69 6e 6b 65 64 20 6c 69 73 74 20  the linked list 
6010: 6d 61 6e 61 67 65 64 20 62 79 20 73 74 72 75 63  managed by struc
6020: 74 75 72 65 0a 2a 2a 20 70 4c 69 73 74 20 28 70  ture.** pList (p
6030: 50 67 20 62 65 63 6f 6d 65 73 20 74 68 65 20 6c  Pg becomes the l
6040: 61 73 74 20 65 6e 74 72 79 20 69 6e 20 74 68 65  ast entry in the
6050: 20 6c 69 73 74 20 2d 20 74 68 65 20 6d 6f 73 74   list - the most
6060: 20 72 65 63 65 6e 74 6c 79 20 0a 2a 2a 20 75 73   recently .** us
6070: 65 64 29 2e 20 41 72 67 75 6d 65 6e 74 20 70 4c  ed). Argument pL
6080: 69 6e 6b 20 73 68 6f 75 6c 64 20 70 6f 69 6e 74  ink should point
6090: 20 74 6f 20 65 69 74 68 65 72 20 70 50 67 2d 3e   to either pPg->
60a0: 66 72 65 65 20 6f 72 20 70 50 67 2d 3e 67 66 72  free or pPg->gfr
60b0: 65 65 2c 0a 2a 2a 20 64 65 70 65 6e 64 69 6e 67  ee,.** depending
60c0: 20 6f 6e 20 77 68 65 74 68 65 72 20 70 50 67 20   on whether pPg 
60d0: 69 73 20 62 65 69 6e 67 20 61 64 64 65 64 20 74  is being added t
60e0: 6f 20 74 68 65 20 70 61 67 65 72 2d 73 70 65 63  o the pager-spec
60f0: 69 66 69 63 20 6f 72 0a 2a 2a 20 67 6c 6f 62 61  ific or.** globa
6100: 6c 20 4c 52 55 20 6c 69 73 74 2e 0a 2a 2f 0a 73  l LRU list..*/.s
6110: 74 61 74 69 63 20 76 6f 69 64 20 6c 69 73 74 41  tatic void listA
6120: 64 64 28 50 61 67 65 72 4c 72 75 4c 69 73 74 20  dd(PagerLruList 
6130: 2a 70 4c 69 73 74 2c 20 50 61 67 65 72 4c 72 75  *pList, PagerLru
6140: 4c 69 6e 6b 20 2a 70 4c 69 6e 6b 2c 20 50 67 48  Link *pLink, PgH
6150: 64 72 20 2a 70 50 67 29 7b 0a 20 20 70 4c 69 6e  dr *pPg){.  pLin
6160: 6b 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  k->pNext = 0;.  
6170: 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 70  pLink->pPrev = p
6180: 4c 69 73 74 2d 3e 70 4c 61 73 74 3b 0a 0a 23 69  List->pLast;..#i
6190: 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
61a0: 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45  LE_MEMORY_MANAGE
61b0: 4d 45 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c  MENT.  assert(pL
61c0: 69 6e 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20  ink==&pPg->free 
61d0: 7c 7c 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e  || pLink==&pPg->
61e0: 67 66 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74  gfree);.  assert
61f0: 28 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66  (pLink==&pPg->gf
6200: 72 65 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73  ree || pList!=&s
6210: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6220: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  t);.#endif..  if
6230: 28 20 70 4c 69 73 74 2d 3e 70 4c 61 73 74 20 29  ( pList->pLast )
6240: 7b 0a 20 20 20 20 69 6e 74 20 69 4f 66 66 20 3d  {.    int iOff =
6250: 20 28 63 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d   (char *)pLink -
6260: 20 28 63 68 61 72 20 2a 29 70 50 67 3b 0a 20 20   (char *)pPg;.  
6270: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
6280: 70 4c 61 73 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pLastLink = (Pag
6290: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
62a0: 75 38 20 2a 29 70 4c 69 73 74 2d 3e 70 4c 61 73  u8 *)pList->pLas
62b0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
62c0: 4c 61 73 74 4c 69 6e 6b 2d 3e 70 4e 65 78 74 20  LastLink->pNext 
62d0: 3d 20 70 50 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a  = pPg;.  }else{.
62e0: 20 20 20 20 61 73 73 65 72 74 28 21 70 4c 69 73      assert(!pLis
62f0: 74 2d 3e 70 46 69 72 73 74 29 3b 0a 20 20 20 20  t->pFirst);.    
6300: 70 4c 69 73 74 2d 3e 70 46 69 72 73 74 20 3d 20  pList->pFirst = 
6310: 70 50 67 3b 0a 20 20 7d 0a 0a 20 20 70 4c 69 73  pPg;.  }..  pLis
6320: 74 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a  t->pLast = pPg;.
6330: 20 20 69 66 28 20 21 70 4c 69 73 74 2d 3e 70 46    if( !pList->pF
6340: 69 72 73 74 53 79 6e 63 65 64 20 26 26 20 70 50  irstSynced && pP
6350: 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
6360: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 70 46 69  {.    pList->pFi
6370: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b  rstSynced = pPg;
6380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  .  }.}../*.** Re
6390: 6d 6f 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68  move pPg from th
63a0: 65 20 6c 69 73 74 20 6d 61 6e 61 67 65 64 20 62  e list managed b
63b0: 79 20 74 68 65 20 73 74 72 75 63 74 75 72 65 20  y the structure 
63c0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 4c  pointed to by pL
63d0: 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 41 72 67 75 6d  ist..**.** Argum
63e0: 65 6e 74 20 70 4c 69 6e 6b 20 73 68 6f 75 6c 64  ent pLink should
63f0: 20 70 6f 69 6e 74 20 74 6f 20 65 69 74 68 65 72   point to either
6400: 20 70 50 67 2d 3e 66 72 65 65 20 6f 72 20 70 50   pPg->free or pP
6410: 67 2d 3e 67 66 72 65 65 2c 20 64 65 70 65 6e 64  g->gfree, depend
6420: 69 6e 67 20 0a 2a 2a 20 6f 6e 20 77 68 65 74 68  ing .** on wheth
6430: 65 72 20 70 50 67 20 69 73 20 62 65 69 6e 67 20  er pPg is being 
6440: 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 61 67  added to the pag
6450: 65 72 2d 73 70 65 63 69 66 69 63 20 6f 72 20 67  er-specific or g
6460: 6c 6f 62 61 6c 20 4c 52 55 20 6c 69 73 74 2e 0a  lobal LRU list..
6470: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
6480: 69 73 74 52 65 6d 6f 76 65 28 50 61 67 65 72 4c  istRemove(PagerL
6490: 72 75 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 50  ruList *pList, P
64a0: 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 70 4c 69  agerLruLink *pLi
64b0: 6e 6b 2c 20 50 67 48 64 72 20 2a 70 50 67 29 7b  nk, PgHdr *pPg){
64c0: 0a 20 20 69 6e 74 20 69 4f 66 66 20 3d 20 28 63  .  int iOff = (c
64d0: 68 61 72 20 2a 29 70 4c 69 6e 6b 20 2d 20 28 63  har *)pLink - (c
64e0: 68 61 72 20 2a 29 70 50 67 3b 0a 0a 23 69 66 64  har *)pPg;..#ifd
64f0: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
6500: 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45  _MEMORY_MANAGEME
6510: 4e 54 0a 20 20 61 73 73 65 72 74 28 70 4c 69 6e  NT.  assert(pLin
6520: 6b 3d 3d 26 70 50 67 2d 3e 66 72 65 65 20 7c 7c  k==&pPg->free ||
6530: 20 70 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66   pLink==&pPg->gf
6540: 72 65 65 29 3b 0a 20 20 61 73 73 65 72 74 28 70  ree);.  assert(p
6550: 4c 69 6e 6b 3d 3d 26 70 50 67 2d 3e 67 66 72 65  Link==&pPg->gfre
6560: 65 20 7c 7c 20 70 4c 69 73 74 21 3d 26 73 71 6c  e || pList!=&sql
6570: 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 29  ite3LruPageList)
6580: 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20  ;.#endif..  if( 
6590: 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 46 69 72  pPg==pList->pFir
65a0: 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  st ){.    pList-
65b0: 3e 70 46 69 72 73 74 20 3d 20 70 4c 69 6e 6b 2d  >pFirst = pLink-
65c0: 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66  >pNext;.  }.  if
65d0: 28 20 70 50 67 3d 3d 70 4c 69 73 74 2d 3e 70 4c  ( pPg==pList->pL
65e0: 61 73 74 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  ast ){.    pList
65f0: 2d 3e 70 4c 61 73 74 20 3d 20 70 4c 69 6e 6b 2d  ->pLast = pLink-
6600: 3e 70 50 72 65 76 3b 0a 20 20 7d 0a 20 20 69 66  >pPrev;.  }.  if
6610: 28 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 20 29  ( pLink->pPrev )
6620: 7b 0a 20 20 20 20 50 61 67 65 72 4c 72 75 4c 69  {.    PagerLruLi
6630: 6e 6b 20 2a 70 50 72 65 76 4c 69 6e 6b 20 3d 20  nk *pPrevLink = 
6640: 28 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a 29  (PagerLruLink *)
6650: 28 26 28 28 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e  (&((u8 *)pLink->
6660: 70 50 72 65 76 29 5b 69 4f 66 66 5d 29 3b 0a 20  pPrev)[iOff]);. 
6670: 20 20 20 70 50 72 65 76 4c 69 6e 6b 2d 3e 70 4e     pPrevLink->pN
6680: 65 78 74 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65  ext = pLink->pNe
6690: 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c  xt;.  }.  if( pL
66a0: 69 6e 6b 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  ink->pNext ){.  
66b0: 20 20 50 61 67 65 72 4c 72 75 4c 69 6e 6b 20 2a    PagerLruLink *
66c0: 70 4e 65 78 74 4c 69 6e 6b 20 3d 20 28 50 61 67  pNextLink = (Pag
66d0: 65 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28  erLruLink *)(&((
66e0: 75 38 20 2a 29 70 4c 69 6e 6b 2d 3e 70 4e 65 78  u8 *)pLink->pNex
66f0: 74 29 5b 69 4f 66 66 5d 29 3b 0a 20 20 20 20 70  t)[iOff]);.    p
6700: 4e 65 78 74 4c 69 6e 6b 2d 3e 70 50 72 65 76 20  NextLink->pPrev 
6710: 3d 20 70 4c 69 6e 6b 2d 3e 70 50 72 65 76 3b 0a  = pLink->pPrev;.
6720: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 70    }.  if( pPg==p
6730: 4c 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63  List->pFirstSync
6740: 65 64 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20  ed ){.    PgHdr 
6750: 2a 70 20 3d 20 70 4c 69 6e 6b 2d 3e 70 4e 65 78  *p = pLink->pNex
6760: 74 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20  t;.    while( p 
6770: 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29  && p->needSync )
6780: 7b 0a 20 20 20 20 20 20 50 61 67 65 72 4c 72 75  {.      PagerLru
6790: 4c 69 6e 6b 20 2a 70 4c 20 3d 20 28 50 61 67 65  Link *pL = (Page
67a0: 72 4c 72 75 4c 69 6e 6b 20 2a 29 28 26 28 28 75  rLruLink *)(&((u
67b0: 38 20 2a 29 70 29 5b 69 4f 66 66 5d 29 3b 0a 20  8 *)p)[iOff]);. 
67c0: 20 20 20 20 20 70 20 3d 20 70 4c 2d 3e 70 4e 65       p = pL->pNe
67d0: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c  xt;.    }.    pL
67e0: 69 73 74 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ist->pFirstSynce
67f0: 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20 70 4c  d = p;.  }..  pL
6800: 69 6e 6b 2d 3e 70 4e 65 78 74 20 3d 20 70 4c 69  ink->pNext = pLi
6810: 6e 6b 2d 3e 70 50 72 65 76 20 3d 20 30 3b 0a 7d  nk->pPrev = 0;.}
6820: 0a 0a 2f 2a 20 0a 2a 2a 20 41 64 64 20 70 61 67  ../* .** Add pag
6830: 65 20 70 50 67 20 74 6f 20 74 68 65 20 6c 69 73  e pPg to the lis
6840: 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73 20  t of free pages 
6850: 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 20 49  for the pager. I
6860: 66 20 0a 2a 2a 20 6d 65 6d 6f 72 79 2d 6d 61 6e  f .** memory-man
6870: 61 67 65 6d 65 6e 74 20 69 73 20 65 6e 61 62 6c  agement is enabl
6880: 65 64 2c 20 61 6c 73 6f 20 61 64 64 20 74 68 65  ed, also add the
6890: 20 70 61 67 65 20 74 6f 20 74 68 65 20 67 6c 6f   page to the glo
68a0: 62 61 6c 20 0a 2a 2a 20 6c 69 73 74 20 6f 66 20  bal .** list of 
68b0: 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f 0a 73  free pages..*/.s
68c0: 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75 4c 69  tatic void lruLi
68d0: 73 74 41 64 64 28 50 67 48 64 72 20 2a 70 50 67  stAdd(PgHdr *pPg
68e0: 29 7b 0a 20 20 6c 69 73 74 41 64 64 28 26 70 50  ){.  listAdd(&pP
68f0: 67 2d 3e 70 50 61 67 65 72 2d 3e 6c 72 75 2c 20  g->pPager->lru, 
6900: 26 70 50 67 2d 3e 66 72 65 65 2c 20 70 50 67 29  &pPg->free, pPg)
6910: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
6920: 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
6930: 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
6940: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6d 65 6d  pPg->pPager->mem
6950: 44 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  Db ){.    sqlite
6960: 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28 73 71  3_mutex_enter(sq
6970: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f  lite3_mutex_allo
6980: 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58 5f 53  c(SQLITE_MUTEX_S
6990: 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20 20 20  TATIC_LRU));.   
69a0: 20 6c 69 73 74 41 64 64 28 26 73 71 6c 69 74 65   listAdd(&sqlite
69b0: 33 4c 72 75 50 61 67 65 4c 69 73 74 2c 20 26 70  3LruPageList, &p
69c0: 50 67 2d 3e 67 66 72 65 65 2c 20 70 50 67 29 3b  Pg->gfree, pPg);
69d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
69e0: 65 78 5f 6c 65 61 76 65 28 73 71 6c 69 74 65 33  ex_leave(sqlite3
69f0: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6a00: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6a10: 5f 4c 52 55 29 29 3b 0a 20 20 7d 0a 23 65 6e 64  _LRU));.  }.#end
6a20: 69 66 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 52 65 6d  if.}../* .** Rem
6a30: 6f 76 65 20 70 61 67 65 20 70 50 67 20 66 72 6f  ove page pPg fro
6a40: 6d 20 74 68 65 20 6c 69 73 74 20 6f 66 20 66 72  m the list of fr
6a50: 65 65 20 70 61 67 65 73 20 66 6f 72 20 74 68 65  ee pages for the
6a60: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 67 65   associated page
6a70: 72 2e 0a 2a 2a 20 49 66 20 6d 65 6d 6f 72 79 2d  r..** If memory-
6a80: 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65 6e  management is en
6a90: 61 62 6c 65 64 2c 20 61 6c 73 6f 20 72 65 6d 6f  abled, also remo
6aa0: 76 65 20 70 50 67 20 66 72 6f 6d 20 74 68 65 20  ve pPg from the 
6ab0: 67 6c 6f 62 61 6c 20 6c 69 73 74 0a 2a 2a 20 6f  global list.** o
6ac0: 66 20 66 72 65 65 20 70 61 67 65 73 2e 0a 2a 2f  f free pages..*/
6ad0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6ae0: 4c 69 73 74 52 65 6d 6f 76 65 28 50 67 48 64 72  ListRemove(PgHdr
6af0: 20 2a 70 50 67 29 7b 0a 20 20 6c 69 73 74 52 65   *pPg){.  listRe
6b00: 6d 6f 76 65 28 26 70 50 67 2d 3e 70 50 61 67 65  move(&pPg->pPage
6b10: 72 2d 3e 6c 72 75 2c 20 26 70 50 67 2d 3e 66 72  r->lru, &pPg->fr
6b20: 65 65 2c 20 70 50 67 29 3b 0a 23 69 66 64 65 66  ee, pPg);.#ifdef
6b30: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
6b40: 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
6b50: 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 70 50 61  .  if( !pPg->pPa
6b60: 67 65 72 2d 3e 6d 65 6d 44 62 20 29 7b 0a 20 20  ger->memDb ){.  
6b70: 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
6b80: 65 6e 74 65 72 28 73 71 6c 69 74 65 33 5f 6d 75  enter(sqlite3_mu
6b90: 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
6ba0: 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
6bb0: 55 29 29 3b 0a 20 20 20 20 6c 69 73 74 52 65 6d  U));.    listRem
6bc0: 6f 76 65 28 26 73 71 6c 69 74 65 33 4c 72 75 50  ove(&sqlite3LruP
6bd0: 61 67 65 4c 69 73 74 2c 20 26 70 50 67 2d 3e 67  ageList, &pPg->g
6be0: 66 72 65 65 2c 20 70 50 67 29 3b 0a 20 20 20 20  free, pPg);.    
6bf0: 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
6c00: 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65  ave(sqlite3_mute
6c10: 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
6c20: 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29  UTEX_STATIC_LRU)
6c30: 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a  );.  }.#endif.}.
6c40: 0a 2f 2a 20 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ./* .** This fun
6c50: 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
6c60: 6a 75 73 74 20 61 66 74 65 72 20 74 68 65 20 6e  just after the n
6c70: 65 65 64 53 79 6e 63 20 66 6c 61 67 20 68 61 73  eedSync flag has
6c80: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 0a 2a 2a   been cleared.**
6c90: 20 66 72 6f 6d 20 61 6c 6c 20 70 61 67 65 73 20   from all pages 
6ca0: 6d 61 6e 61 67 65 64 20 62 79 20 70 50 61 67 65  managed by pPage
6cb0: 72 20 28 75 73 75 61 6c 6c 79 20 62 65 63 61 75  r (usually becau
6cc0: 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  se the journal f
6cd0: 69 6c 65 0a 2a 2a 20 68 61 73 20 6a 75 73 74 20  ile.** has just 
6ce0: 62 65 65 6e 20 73 79 6e 63 65 64 29 2e 20 49 74  been synced). It
6cf0: 20 75 70 64 61 74 65 73 20 74 68 65 20 70 50 61   updates the pPa
6d00: 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53  ger->lru.pFirstS
6d10: 79 6e 63 65 64 20 76 61 72 69 61 62 6c 65 0a 2a  ynced variable.*
6d20: 2a 20 61 6e 64 2c 20 69 66 20 6d 65 6d 6f 72 79  * and, if memory
6d30: 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20 65  -management is e
6d40: 6e 61 62 6c 65 64 2c 20 74 68 65 20 73 71 6c 69  nabled, the sqli
6d50: 74 65 33 4c 72 75 50 61 67 65 4c 69 73 74 2e 70  te3LruPageList.p
6d60: 46 69 72 73 74 53 79 6e 63 65 64 0a 2a 2a 20 76  FirstSynced.** v
6d70: 61 72 69 61 62 6c 65 20 61 6c 73 6f 2e 0a 2a 2f  ariable also..*/
6d80: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c 72 75  .static void lru
6d90: 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63  ListSetFirstSync
6da0: 65 64 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ed(Pager *pPager
6db0: 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6c 72 75  ){.  pPager->lru
6dc0: 2e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  .pFirstSynced = 
6dd0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6de0: 73 74 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54  st;.#ifdef SQLIT
6df0: 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
6e00: 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28  MANAGEMENT.  if(
6e10: 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
6e20: 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 3b  ){.    PgHdr *p;
6e30: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74  .    sqlite3_mut
6e40: 65 78 5f 65 6e 74 65 72 28 73 71 6c 69 74 65 33  ex_enter(sqlite3
6e50: 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c  _mutex_alloc(SQL
6e60: 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49 43  ITE_MUTEX_STATIC
6e70: 5f 4c 52 55 29 29 3b 0a 20 20 20 20 66 6f 72 28  _LRU));.    for(
6e80: 70 3d 73 71 6c 69 74 65 33 4c 72 75 50 61 67 65  p=sqlite3LruPage
6e90: 4c 69 73 74 2e 70 46 69 72 73 74 3b 20 70 20 26  List.pFirst; p &
6ea0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 3b 20 70  & p->needSync; p
6eb0: 3d 70 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 29  =p->gfree.pNext)
6ec0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 70 3d 3d  ;.    assert(p==
6ed0: 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
6ee0: 73 74 53 79 6e 63 65 64 20 7c 7c 20 70 3d 3d 73  stSynced || p==s
6ef0: 71 6c 69 74 65 33 4c 72 75 50 61 67 65 4c 69 73  qlite3LruPageLis
6f00: 74 2e 70 46 69 72 73 74 53 79 6e 63 65 64 29 3b  t.pFirstSynced);
6f10: 0a 20 20 20 20 73 71 6c 69 74 65 33 4c 72 75 50  .    sqlite3LruP
6f20: 61 67 65 4c 69 73 74 2e 70 46 69 72 73 74 53 79  ageList.pFirstSy
6f30: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 73 71  nced = p;.    sq
6f40: 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61 76  lite3_mutex_leav
6f50: 65 28 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f  e(sqlite3_mutex_
6f60: 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54  alloc(SQLITE_MUT
6f70: 45 58 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b  EX_STATIC_LRU));
6f80: 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
6f90: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
6fa0: 20 69 66 20 70 61 67 65 20 2a 70 50 67 20 68 61   if page *pPg ha
6fb0: 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
6fc0: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 73 74  ritten to the st
6fd0: 61 74 65 6d 65 6e 74 0a 2a 2a 20 6a 6f 75 72 6e  atement.** journ
6fe0: 61 6c 20 28 6f 72 20 73 74 61 74 65 6d 65 6e 74  al (or statement
6ff0: 20 73 6e 61 70 73 68 6f 74 20 68 61 73 20 62 65   snapshot has be
7000: 65 6e 20 63 72 65 61 74 65 64 2c 20 69 66 20 2a  en created, if *
7010: 70 50 67 20 69 73 20 70 61 72 74 0a 2a 2a 20 6f  pPg is part.** o
7020: 66 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  f an in-memory d
7030: 61 74 61 62 61 73 65 29 2e 0a 2a 2f 0a 73 74 61  atabase)..*/.sta
7040: 74 69 63 20 69 6e 74 20 70 61 67 65 49 6e 53 74  tic int pageInSt
7050: 61 74 65 6d 65 6e 74 28 50 67 48 64 72 20 2a 70  atement(PgHdr *p
7060: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
7070: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
7080: 65 72 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  er;.  if( MEMDB 
7090: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 50 47  ){.    return PG
70a0: 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
70b0: 20 70 50 61 67 65 72 29 2d 3e 69 6e 53 74 6d 74   pPager)->inStmt
70c0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
70d0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 42 69 74  eturn sqlite3Bit
70e0: 76 65 63 54 65 73 74 28 70 50 61 67 65 72 2d 3e  vecTest(pPager->
70f0: 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67  pInStmt, pPg->pg
7100: 6e 6f 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  no);.  }.}../*.*
7110: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73 69 7a  * Change the siz
7120: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68  e of the pager h
7130: 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e 2e 20  ash table to N. 
7140: 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70 6f 77   N must be a pow
7150: 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a 2a 2f  er.** of two..*/
7160: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
7170: 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68 5f 74  er_resize_hash_t
7180: 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50 61 67  able(Pager *pPag
7190: 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20 50 67  er, int N){.  Pg
71a0: 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a 70 50  Hdr **aHash, *pP
71b0: 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e 3e 30  g;.  assert( N>0
71c0: 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d 3d 30   && (N&(N-1))==0
71d0: 20 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54   );.#ifdef SQLIT
71e0: 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f 4c 49  E_MALLOC_SOFT_LI
71f0: 4d 49 54 0a 20 20 69 66 28 20 4e 2a 73 69 7a 65  MIT.  if( N*size
7200: 6f 66 28 61 48 61 73 68 5b 30 5d 29 3e 53 51 4c  of(aHash[0])>SQL
7210: 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53 4f 46 54 5f  ITE_MALLOC_SOFT_
7220: 4c 49 4d 49 54 20 29 7b 0a 20 20 20 20 4e 20 3d  LIMIT ){.    N =
7230: 20 53 51 4c 49 54 45 5f 4d 41 4c 4c 4f 43 5f 53   SQLITE_MALLOC_S
7240: 4f 46 54 5f 4c 49 4d 49 54 2f 73 69 7a 65 6f 66  OFT_LIMIT/sizeof
7250: 28 61 48 61 73 68 5b 30 5d 29 3b 0a 20 20 7d 0a  (aHash[0]);.  }.
7260: 20 20 69 66 28 20 4e 3d 3d 70 50 61 67 65 72 2d    if( N==pPager-
7270: 3e 6e 48 61 73 68 20 29 20 72 65 74 75 72 6e 3b  >nHash ) return;
7280: 0a 23 65 6e 64 69 66 0a 20 20 70 61 67 65 72 4c  .#endif.  pagerL
7290: 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
72a0: 73 71 6c 69 74 65 33 46 61 75 6c 74 42 65 6e 69  sqlite3FaultBeni
72b0: 67 6e 28 53 51 4c 49 54 45 5f 46 41 55 4c 54 49  gn(SQLITE_FAULTI
72c0: 4e 4a 45 43 54 4f 52 5f 4d 41 4c 4c 4f 43 2c 20  NJECTOR_MALLOC, 
72d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 21 3d 30  pPager->aHash!=0
72e0: 29 3b 0a 20 20 61 48 61 73 68 20 3d 20 73 71 6c  );.  aHash = sql
72f0: 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28 20  ite3MallocZero( 
7300: 73 69 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29  sizeof(aHash[0])
7310: 2a 4e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 46  *N );.  sqlite3F
7320: 61 75 6c 74 42 65 6e 69 67 6e 28 53 51 4c 49 54  aultBenign(SQLIT
7330: 45 5f 46 41 55 4c 54 49 4e 4a 45 43 54 4f 52 5f  E_FAULTINJECTOR_
7340: 4d 41 4c 4c 4f 43 2c 20 30 29 3b 0a 20 20 70 61  MALLOC, 0);.  pa
7350: 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
7360: 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d 3d 30  ;.  if( aHash==0
7370: 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69 6c 75   ){.    /* Failu
7380: 72 65 20 74 6f 20 72 65 68 61 73 68 20 69 73 20  re to rehash is 
7390: 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20 20 49  not an error.  I
73a0: 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65 72 66  t is only a perf
73b0: 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a 2f 0a  ormance hit. */.
73c0: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
73d0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
73e0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
73f0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
7400: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
7410: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
7420: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
7430: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
7440: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
7450: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
7460: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
7470: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7480: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
7490: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
74a0: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
74b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
74c0: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
74d0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
74e0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
74f0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
7500: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
7510: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
7520: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
7530: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
7540: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
7550: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
7560: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
7570: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
7580: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
7590: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
75a0: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
75b0: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
75c0: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
75d0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
75e0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
75f0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
7600: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
7610: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
7620: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
7630: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
7640: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
7650: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
7660: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
7670: 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 66  (sqlite3_file *f
7680: 64 2c 20 69 36 34 20 6f 66 66 73 65 74 2c 20 75  d, i64 offset, u
7690: 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73  32 *pRes){.  uns
76a0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
76b0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c  ;.  int rc = sql
76c0: 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61  ite3OsRead(fd, a
76d0: 63 2c 20 73 69 7a 65 6f 66 28 61 63 29 2c 20 6f  c, sizeof(ac), o
76e0: 66 66 73 65 74 29 3b 0a 20 20 69 66 28 20 72 63  ffset);.  if( rc
76f0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
7700: 20 20 20 2a 70 52 65 73 20 3d 20 73 71 6c 69 74     *pRes = sqlit
7710: 65 33 47 65 74 34 62 79 74 65 28 61 63 29 3b 0a  e3Get4byte(ac);.
7720: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
7730: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
7740: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
7750: 20 69 6e 74 6f 20 61 20 73 74 72 69 6e 67 20 62   into a string b
7760: 75 66 66 65 72 20 69 6e 20 62 69 67 2d 65 6e 64  uffer in big-end
7770: 69 61 6e 20 62 79 74 65 20 6f 72 64 65 72 2e 0a  ian byte order..
7780: 2a 2f 0a 23 64 65 66 69 6e 65 20 70 75 74 33 32  */.#define put32
7790: 62 69 74 73 28 41 2c 42 29 20 20 73 71 6c 69 74  bits(A,B)  sqlit
77a0: 65 33 50 75 74 34 62 79 74 65 28 28 75 38 2a 29  e3Put4byte((u8*)
77b0: 41 2c 42 29 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  A,B)../*.** Writ
77c0: 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  e a 32-bit integ
77d0: 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65  er into the give
77e0: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
77f0: 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  r.  Return SQLIT
7800: 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65  E_OK.** on succe
7810: 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63  ss or an error c
7820: 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ode is something
7830: 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a   goes wrong..*/.
7840: 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65  static int write
7850: 33 32 62 69 74 73 28 73 71 6c 69 74 65 33 5f 66  32bits(sqlite3_f
7860: 69 6c 65 20 2a 66 64 2c 20 69 36 34 20 6f 66 66  ile *fd, i64 off
7870: 73 65 74 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  set, u32 val){. 
7880: 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20 70   char ac[4];.  p
7890: 75 74 33 32 62 69 74 73 28 61 63 2c 20 76 61 6c  ut32bits(ac, val
78a0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
78b0: 74 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61  te3OsWrite(fd, a
78c0: 63 2c 20 34 2c 20 6f 66 66 73 65 74 29 3b 0a 7d  c, 4, offset);.}
78d0: 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 66 69 6c 65 20  ../*.** If file 
78e0: 70 46 64 20 69 73 20 6f 70 65 6e 2c 20 63 61 6c  pFd is open, cal
78f0: 6c 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  l sqlite3OsUnloc
7900: 6b 28 29 20 6f 6e 20 69 74 2e 0a 2a 2f 0a 73 74  k() on it..*/.st
7910: 61 74 69 63 20 69 6e 74 20 6f 73 55 6e 6c 6f 63  atic int osUnloc
7920: 6b 28 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a  k(sqlite3_file *
7930: 70 46 64 2c 20 69 6e 74 20 65 4c 6f 63 6b 29 7b  pFd, int eLock){
7940: 0a 20 20 69 66 28 20 21 70 46 64 2d 3e 70 4d 65  .  if( !pFd->pMe
7950: 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72 65 74  thods ){.    ret
7960: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
7970: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
7980: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 70 46 64 2c  te3OsUnlock(pFd,
7990: 20 65 4c 6f 63 6b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   eLock);.}../*.*
79a0: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
79b0: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
79c0: 65 72 20 6f 72 20 6e 6f 74 20 74 68 65 20 61 74  er or not the at
79d0: 6f 6d 69 63 2d 77 72 69 74 65 20 6f 70 74 69 6d  omic-write optim
79e0: 69 7a 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20 62  ization.** can b
79f0: 65 20 75 73 65 64 20 77 69 74 68 20 74 68 69 73  e used with this
7a00: 20 70 61 67 65 72 2e 20 54 68 65 20 6f 70 74 69   pager. The opti
7a10: 6d 69 7a 61 74 69 6f 6e 20 63 61 6e 20 62 65 20  mization can be 
7a20: 75 73 65 64 20 69 66 3a 0a 2a 2a 0a 2a 2a 20 20  used if:.**.**  
7a30: 28 61 29 20 74 68 65 20 76 61 6c 75 65 20 72 65  (a) the value re
7a40: 74 75 72 6e 65 64 20 62 79 20 4f 73 44 65 76 69  turned by OsDevi
7a50: 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69 63  ceCharacteristic
7a60: 73 28 29 20 69 6e 64 69 63 61 74 65 73 20 74 68  s() indicates th
7a70: 61 74 0a 2a 2a 20 20 20 20 20 20 61 20 64 61 74  at.**      a dat
7a80: 61 62 61 73 65 20 70 61 67 65 20 6d 61 79 20 62  abase page may b
7a90: 65 20 77 72 69 74 74 65 6e 20 61 74 6f 6d 69 63  e written atomic
7aa0: 61 6c 6c 79 2c 20 61 6e 64 0a 2a 2a 20 20 28 62  ally, and.**  (b
7ab0: 29 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  ) the value retu
7ac0: 72 6e 65 64 20 62 79 20 4f 73 53 65 63 74 6f 72  rned by OsSector
7ad0: 53 69 7a 65 28 29 20 69 73 20 6c 65 73 73 20 74  Size() is less t
7ae0: 68 61 6e 20 6f 72 20 65 71 75 61 6c 0a 2a 2a 20  han or equal.** 
7af0: 20 20 20 20 20 74 6f 20 74 68 65 20 70 61 67 65       to the page
7b00: 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   size..**.** If 
7b10: 74 68 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  the optimization
7b20: 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 2c   cannot be used,
7b30: 20 30 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20   0 is returned. 
7b40: 49 66 20 69 74 20 63 61 6e 20 62 65 20 75 73 65  If it can be use
7b50: 64 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 76  d,.** then the v
7b60: 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73  alue returned is
7b70: 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   the size of the
7b80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77 68   journal file wh
7b90: 65 6e 20 69 74 0a 2a 2a 20 63 6f 6e 74 61 69 6e  en it.** contain
7ba0: 73 20 72 6f 6c 6c 62 61 63 6b 20 64 61 74 61 20  s rollback data 
7bb0: 66 6f 72 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  for exactly one 
7bc0: 70 61 67 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  page..*/.#ifdef 
7bd0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54  SQLITE_ENABLE_AT
7be0: 4f 4d 49 43 5f 57 52 49 54 45 0a 73 74 61 74 69  OMIC_WRITE.stati
7bf0: 63 20 69 6e 74 20 6a 72 6e 6c 42 75 66 66 65 72  c int jrnlBuffer
7c00: 53 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  Size(Pager *pPag
7c10: 65 72 29 7b 0a 20 20 69 6e 74 20 64 63 3b 20 20  er){.  int dc;  
7c20: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 76 69           /* Devi
7c30: 63 65 20 63 68 61 72 61 63 74 65 72 69 73 74 69  ce characteristi
7c40: 63 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 65 63  cs */.  int nSec
7c50: 74 6f 72 3b 20 20 20 20 20 20 2f 2a 20 53 65 63  tor;      /* Sec
7c60: 74 6f 72 20 73 69 7a 65 20 2a 2f 0a 20 20 69 6e  tor size */.  in
7c70: 74 20 6e 50 61 67 65 3b 20 20 20 20 20 20 20 20  t nPage;        
7c80: 2f 2a 20 50 61 67 65 20 73 69 7a 65 20 2a 2f 0a  /* Page size */.
7c90: 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a    sqlite3_file *
7ca0: 66 64 20 3d 20 70 50 61 67 65 72 2d 3e 66 64 3b  fd = pPager->fd;
7cb0: 0a 0a 20 20 69 66 28 20 66 64 2d 3e 70 4d 65 74  ..  if( fd->pMet
7cc0: 68 6f 64 73 20 29 7b 0a 20 20 20 20 64 63 20 3d  hods ){.    dc =
7cd0: 20 73 71 6c 69 74 65 33 4f 73 44 65 76 69 63 65   sqlite3OsDevice
7ce0: 43 68 61 72 61 63 74 65 72 69 73 74 69 63 73 28  Characteristics(
7cf0: 66 64 29 3b 0a 20 20 20 20 6e 53 65 63 74 6f 72  fd);.    nSector
7d00: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74   = sqlite3OsSect
7d10: 6f 72 53 69 7a 65 28 66 64 29 3b 0a 20 20 20 20  orSize(fd);.    
7d20: 6e 50 61 67 65 20 3d 20 70 50 61 67 65 72 2d 3e  nPage = pPager->
7d30: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 0a 20  pageSize;.  }.. 
7d40: 20 61 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49   assert(SQLITE_I
7d50: 4f 43 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d  OCAP_ATOMIC512==
7d60: 28 35 31 32 3e 3e 38 29 29 3b 0a 20 20 61 73 73  (512>>8));.  ass
7d70: 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43 41 50  ert(SQLITE_IOCAP
7d80: 5f 41 54 4f 4d 49 43 36 34 4b 3d 3d 28 36 35 35  _ATOMIC64K==(655
7d90: 33 36 3e 3e 38 29 29 3b 0a 0a 20 20 69 66 28 20  36>>8));..  if( 
7da0: 21 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 7c 7c  !fd->pMethods ||
7db0: 20 28 64 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   (dc&(SQLITE_IOC
7dc0: 41 50 5f 41 54 4f 4d 49 43 7c 28 6e 50 61 67 65  AP_ATOMIC|(nPage
7dd0: 3e 3e 38 29 29 26 26 6e 53 65 63 74 6f 72 3c 3d  >>8))&&nSector<=
7de0: 6e 50 61 67 65 29 20 29 7b 0a 20 20 20 20 72 65  nPage) ){.    re
7df0: 74 75 72 6e 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  turn JOURNAL_HDR
7e00: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 4a 4f  _SZ(pPager) + JO
7e10: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
7e20: 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  er);.  }.  retur
7e30: 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  n 0;.}.#endif../
7e40: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
7e50: 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  on should be cal
7e60: 6c 65 64 20 77 68 65 6e 20 61 6e 20 65 72 72 6f  led when an erro
7e70: 72 20 6f 63 63 75 72 73 20 77 69 74 68 69 6e 20  r occurs within 
7e80: 74 68 65 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64  the pager.** cod
7e90: 65 2e 20 54 68 65 20 66 69 72 73 74 20 61 72 67  e. The first arg
7ea0: 75 6d 65 6e 74 20 69 73 20 61 20 70 6f 69 6e 74  ument is a point
7eb0: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 72 20  er to the pager 
7ec0: 73 74 72 75 63 74 75 72 65 2c 20 74 68 65 0a 2a  structure, the.*
7ed0: 2a 20 73 65 63 6f 6e 64 20 74 68 65 20 65 72 72  * second the err
7ee0: 6f 72 2d 63 6f 64 65 20 61 62 6f 75 74 20 74 6f  or-code about to
7ef0: 20 62 65 20 72 65 74 75 72 6e 65 64 20 62 79 20   be returned by 
7f00: 61 20 70 61 67 65 72 20 41 50 49 20 66 75 6e 63  a pager API func
7f10: 74 69 6f 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61  tion. .** The va
7f20: 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69 73 20  lue returned is 
7f30: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 65  a copy of the se
7f40: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f  cond argument to
7f50: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20   this function. 
7f60: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 73 65  .**.** If the se
7f70: 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73  cond argument is
7f80: 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53   SQLITE_IOERR, S
7f90: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f  QLITE_CORRUPT, o
7fa0: 72 20 53 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a  r SQLITE_FULL.**
7fb0: 20 74 68 65 20 65 72 72 6f 72 20 62 65 63 6f 6d   the error becom
7fc0: 65 73 20 70 65 72 73 69 73 74 65 6e 74 2e 20 55  es persistent. U
7fd0: 6e 74 69 6c 20 74 68 65 20 70 65 72 73 69 73 74  ntil the persist
7fe0: 65 6e 20 65 72 72 6f 72 20 69 73 20 63 6c 65 61  en error is clea
7ff0: 72 65 64 2c 0a 2a 2a 20 73 75 62 73 65 71 75 65  red,.** subseque
8000: 6e 74 20 41 50 49 20 63 61 6c 6c 73 20 6f 6e 20  nt API calls on 
8010: 74 68 69 73 20 50 61 67 65 72 20 77 69 6c 6c 20  this Pager will 
8020: 69 6d 6d 65 64 69 61 74 65 6c 79 20 72 65 74 75  immediately retu
8030: 72 6e 20 74 68 65 20 73 61 6d 65 20 0a 2a 2a 20  rn the same .** 
8040: 65 72 72 6f 72 20 63 6f 64 65 2e 0a 2a 2a 0a 2a  error code..**.*
8050: 2a 20 41 20 70 65 72 73 69 73 74 65 6e 74 20 65  * A persistent e
8060: 72 72 6f 72 20 69 6e 64 69 63 61 74 65 73 20 74  rror indicates t
8070: 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  hat the contents
8080: 20 6f 66 20 74 68 65 20 70 61 67 65 72 2d 63 61   of the pager-ca
8090: 63 68 65 20 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62  che .** cannot b
80a0: 65 20 74 72 75 73 74 65 64 2e 20 54 68 69 73 20  e trusted. This 
80b0: 73 74 61 74 65 20 63 61 6e 20 62 65 20 63 6c 65  state can be cle
80c0: 61 72 65 64 20 62 79 20 63 6f 6d 70 6c 65 74 65  ared by complete
80d0: 6c 79 20 64 69 73 63 61 72 64 69 6e 67 20 0a 2a  ly discarding .*
80e0: 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  * the contents o
80f0: 66 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  f the pager-cach
8100: 65 2e 20 49 66 20 61 20 74 72 61 6e 73 61 63 74  e. If a transact
8110: 69 6f 6e 20 77 61 73 20 61 63 74 69 76 65 20 77  ion was active w
8120: 68 65 6e 0a 2a 2a 20 74 68 65 20 70 65 72 73 69  hen.** the persi
8130: 73 74 65 6e 74 20 65 72 72 6f 72 20 6f 63 63 75  stent error occu
8140: 72 65 64 2c 20 74 68 65 6e 20 74 68 65 20 72 6f  red, then the ro
8150: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 6d  llback journal m
8160: 61 79 20 6e 65 65 64 0a 2a 2a 20 74 6f 20 62 65  ay need.** to be
8170: 20 72 65 70 6c 61 79 65 64 2e 0a 2a 2f 0a 73 74   replayed..*/.st
8180: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
8190: 75 6e 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  unlock(Pager *pP
81a0: 61 67 65 72 29 3b 0a 73 74 61 74 69 63 20 69 6e  ager);.static in
81b0: 74 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61  t pager_error(Pa
81c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
81d0: 20 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20   rc){.  int rc2 
81e0: 3d 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61  = rc & 0xff;.  a
81f0: 73 73 65 72 74 28 0a 20 20 20 20 20 20 20 70 50  ssert(.       pP
8200: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3d 3d 53  ager->errCode==S
8210: 51 4c 49 54 45 5f 46 55 4c 4c 20 7c 7c 0a 20 20  QLITE_FULL ||.  
8220: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72       pPager->err
8230: 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  Code==SQLITE_OK 
8240: 7c 7c 0a 20 20 20 20 20 20 20 28 70 50 61 67 65  ||.       (pPage
8250: 72 2d 3e 65 72 72 43 6f 64 65 20 26 20 30 78 66  r->errCode & 0xf
8260: 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  f)==SQLITE_IOERR
8270: 0a 20 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20  .  );.  if(.    
8280: 72 63 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c  rc2==SQLITE_FULL
8290: 20 7c 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c   ||.    rc2==SQL
82a0: 49 54 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20  ITE_IOERR ||.   
82b0: 20 72 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52   rc2==SQLITE_COR
82c0: 52 55 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50  RUPT.  ){.    pP
82d0: 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20  ager->errCode = 
82e0: 72 63 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  rc;.    if( pPag
82f0: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
8300: 5f 55 4e 4c 4f 43 4b 20 26 26 20 70 50 61 67 65  _UNLOCK && pPage
8310: 72 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  r->nRef==0 ){.  
8320: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
8330: 67 65 72 20 69 73 20 61 6c 72 65 61 64 79 20 75  ger is already u
8340: 6e 6c 6f 63 6b 65 64 2c 20 63 61 6c 6c 20 70 61  nlocked, call pa
8350: 67 65 72 5f 75 6e 6c 6f 63 6b 28 29 20 6e 6f 77  ger_unlock() now
8360: 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 63 6c 65   to.      ** cle
8370: 61 72 20 74 68 65 20 65 72 72 6f 72 20 73 74 61  ar the error sta
8380: 74 65 20 61 6e 64 20 65 6e 73 75 72 65 20 74 68  te and ensure th
8390: 61 74 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  at the pager-cac
83a0: 68 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20  he is .      ** 
83b0: 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79  completely empty
83c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
83d0: 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50   pager_unlock(pP
83e0: 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
83f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
8400: 0a 2f 2a 0a 2a 2a 20 49 66 20 53 51 4c 49 54 45  ./*.** If SQLITE
8410: 5f 43 48 45 43 4b 5f 50 41 47 45 53 20 69 73 20  _CHECK_PAGES is 
8420: 64 65 66 69 6e 65 64 20 74 68 65 6e 20 77 65 20  defined then we 
8430: 64 6f 20 73 6f 6d 65 20 73 61 6e 69 74 79 20 63  do some sanity c
8440: 68 65 63 6b 69 6e 67 0a 2a 2a 20 6f 6e 20 74 68  hecking.** on th
8450: 65 20 63 61 63 68 65 20 75 73 69 6e 67 20 61 20  e cache using a 
8460: 68 61 73 68 20 66 75 6e 63 74 69 6f 6e 2e 20 20  hash function.  
8470: 54 68 69 73 20 69 73 20 75 73 65 64 20 66 6f 72  This is used for
8480: 20 74 65 73 74 69 6e 67 0a 2a 2a 20 61 6e 64 20   testing.** and 
8490: 64 65 62 75 67 67 69 6e 67 20 6f 6e 6c 79 2e 0a  debugging only..
84a0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
84b0: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2f 2a 0a  _CHECK_PAGES./*.
84c0: 2a 2a 20 52 65 74 75 72 6e 20 61 20 33 32 2d 62  ** Return a 32-b
84d0: 69 74 20 68 61 73 68 20 6f 66 20 74 68 65 20 70  it hash of the p
84e0: 61 67 65 20 64 61 74 61 20 66 6f 72 20 70 50 61  age data for pPa
84f0: 67 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  ge..*/.static u3
8500: 32 20 70 61 67 65 72 5f 64 61 74 61 68 61 73 68  2 pager_datahash
8510: 28 69 6e 74 20 6e 42 79 74 65 2c 20 75 6e 73 69  (int nByte, unsi
8520: 67 6e 65 64 20 63 68 61 72 20 2a 70 44 61 74 61  gned char *pData
8530: 29 7b 0a 20 20 75 33 32 20 68 61 73 68 20 3d 20  ){.  u32 hash = 
8540: 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  0;.  int i;.  fo
8550: 72 28 69 3d 30 3b 20 69 3c 6e 42 79 74 65 3b 20  r(i=0; i<nByte; 
8560: 69 2b 2b 29 7b 0a 20 20 20 20 68 61 73 68 20 3d  i++){.    hash =
8570: 20 28 68 61 73 68 2a 31 30 33 39 29 20 2b 20 70   (hash*1039) + p
8580: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
8590: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 73 74  eturn hash;.}.st
85a0: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70  atic u32 pager_p
85b0: 61 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70  agehash(PgHdr *p
85c0: 50 61 67 65 29 7b 0a 20 20 72 65 74 75 72 6e 20  Page){.  return 
85d0: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 70  pager_datahash(p
85e0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
85f0: 67 65 53 69 7a 65 2c 20 0a 20 20 20 20 20 20 20  geSize, .       
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8610: 20 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20   (unsigned char 
8620: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
8630: 70 50 61 67 65 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pPage));.}../*.*
8640: 2a 20 54 68 65 20 43 48 45 43 4b 5f 50 41 47 45  * The CHECK_PAGE
8650: 20 6d 61 63 72 6f 20 74 61 6b 65 73 20 61 20 50   macro takes a P
8660: 67 48 64 72 2a 20 61 73 20 61 6e 20 61 72 67 75  gHdr* as an argu
8670: 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49 54 45 5f  ment. If SQLITE_
8680: 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a 2a 20 69  CHECK_PAGES.** i
8690: 73 20 64 65 66 69 6e 65 64 2c 20 61 6e 64 20 4e  s defined, and N
86a0: 44 45 42 55 47 20 69 73 20 6e 6f 74 20 64 65 66  DEBUG is not def
86b0: 69 6e 65 64 2c 20 61 6e 20 61 73 73 65 72 74 28  ined, an assert(
86c0: 29 20 73 74 61 74 65 6d 65 6e 74 20 63 68 65 63  ) statement chec
86d0: 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70  ks.** that the p
86e0: 61 67 65 20 69 73 20 65 69 74 68 65 72 20 64 69  age is either di
86f0: 72 74 79 20 6f 72 20 73 74 69 6c 6c 20 6d 61 74  rty or still mat
8700: 63 68 65 73 20 74 68 65 20 63 61 6c 63 75 6c 61  ches the calcula
8710: 74 65 64 20 70 61 67 65 2d 68 61 73 68 2e 0a 2a  ted page-hash..*
8720: 2f 0a 23 64 65 66 69 6e 65 20 43 48 45 43 4b 5f  /.#define CHECK_
8730: 50 41 47 45 28 78 29 20 63 68 65 63 6b 50 61 67  PAGE(x) checkPag
8740: 65 28 78 29 0a 73 74 61 74 69 63 20 76 6f 69 64  e(x).static void
8750: 20 63 68 65 63 6b 50 61 67 65 28 50 67 48 64 72   checkPage(PgHdr
8760: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
8770: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
8780: 50 61 67 65 72 3b 0a 20 20 61 73 73 65 72 74 28  Pager;.  assert(
8790: 20 21 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20   !pPg->pageHash 
87a0: 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  || pPager->errCo
87b0: 64 65 20 7c 7c 20 4d 45 4d 44 42 20 7c 7c 20 70  de || MEMDB || p
87c0: 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20 0a 20 20  Pg->dirty || .  
87d0: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
87e0: 68 3d 3d 70 61 67 65 72 5f 70 61 67 65 68 61 73  h==pager_pagehas
87f0: 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a 23 65 6c  h(pPg) );.}..#el
8800: 73 65 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72  se.#define pager
8810: 5f 64 61 74 61 68 61 73 68 28 58 2c 59 29 20 20  _datahash(X,Y)  
8820: 30 0a 23 64 65 66 69 6e 65 20 70 61 67 65 72 5f  0.#define pager_
8830: 70 61 67 65 68 61 73 68 28 58 29 20 20 30 0a 23  pagehash(X)  0.#
8840: 64 65 66 69 6e 65 20 43 48 45 43 4b 5f 50 41 47  define CHECK_PAG
8850: 45 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  E(x).#endif../*.
8860: 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20  ** When this is 
8870: 63 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e  called the journ
8880: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
8890: 72 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65  r pPager must be
88a0: 20 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61   open..** The ma
88b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
88c0: 65 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66  e name is read f
88d0: 72 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74  rom the end of t
88e0: 68 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20  he file and .** 
88f0: 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d  written into mem
8900: 6f 72 79 20 73 75 70 70 6c 69 65 64 20 62 79 20  ory supplied by 
8910: 74 68 65 20 63 61 6c 6c 65 72 2e 20 0a 2a 2a 0a  the caller. .**.
8920: 2a 2a 20 7a 4d 61 73 74 65 72 20 6d 75 73 74 20  ** zMaster must 
8930: 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65  point to a buffe
8940: 72 20 6f 66 20 61 74 20 6c 65 61 73 74 20 6e 4d  r of at least nM
8950: 61 73 74 65 72 20 62 79 74 65 73 20 61 6c 6c 6f  aster bytes allo
8960: 63 61 74 65 64 20 62 79 0a 2a 2a 20 74 68 65 20  cated by.** the 
8970: 63 61 6c 6c 65 72 2e 20 54 68 69 73 20 73 68 6f  caller. This sho
8980: 75 6c 64 20 62 65 20 73 71 6c 69 74 65 33 5f 76  uld be sqlite3_v
8990: 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 20  fs.mxPathname+1 
89a0: 28 74 6f 20 65 6e 73 75 72 65 20 74 68 65 72 65  (to ensure there
89b0: 20 69 73 0a 2a 2a 20 65 6e 6f 75 67 68 20 73 70   is.** enough sp
89c0: 61 63 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ace to write the
89d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
89e0: 6e 61 6d 65 29 2e 20 49 66 20 74 68 65 20 6d 61  name). If the ma
89f0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  ster journal.** 
8a00: 6e 61 6d 65 20 69 6e 20 74 68 65 20 6a 6f 75 72  name in the jour
8a10: 6e 61 6c 20 69 73 20 6c 6f 6e 67 65 72 20 74 68  nal is longer th
8a20: 61 6e 20 6e 4d 61 73 74 65 72 20 62 79 74 65 73  an nMaster bytes
8a30: 20 28 69 6e 63 6c 75 64 69 6e 67 20 61 0a 2a 2a   (including a.**
8a40: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 29   nul-terminator)
8a50: 2c 20 74 68 65 6e 20 74 68 69 73 20 69 73 20 68  , then this is h
8a60: 61 6e 64 6c 65 64 20 61 73 20 69 66 20 6e 6f 20  andled as if no 
8a70: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  master journal n
8a80: 61 6d 65 0a 2a 2a 20 77 65 72 65 20 70 72 65 73  ame.** were pres
8a90: 65 6e 74 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  ent in the journ
8aa0: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f 20  al..**.** If no 
8ab0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8ac0: 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65 73  ile name is pres
8ad0: 65 6e 74 20 7a 4d 61 73 74 65 72 5b 30 5d 20 69  ent zMaster[0] i
8ae0: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
8af0: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
8b00: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
8b10: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
8b20: 75 72 6e 61 6c 28 73 71 6c 69 74 65 33 5f 66 69  urnal(sqlite3_fi
8b30: 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20  le *pJrnl, char 
8b40: 2a 7a 4d 61 73 74 65 72 2c 20 69 6e 74 20 6e 4d  *zMaster, int nM
8b50: 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  aster){.  int rc
8b60: 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69  ;.  u32 len;.  i
8b70: 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b  64 szJ;.  u32 ck
8b80: 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  sum;.  int i;.  
8b90: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d  unsigned char aM
8ba0: 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75  agic[8]; /* A bu
8bb0: 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65  ffer to hold the
8bc0: 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f   magic header */
8bd0: 0a 0a 20 20 7a 4d 61 73 74 65 72 5b 30 5d 20 3d  ..  zMaster[0] =
8be0: 20 27 5c 30 27 3b 0a 0a 20 20 72 63 20 3d 20 73   '\0';..  rc = s
8bf0: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
8c00: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
8c10: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8c20: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
8c30: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
8c40: 3d 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72  = read32bits(pJr
8c50: 6e 6c 2c 20 73 7a 4a 2d 31 36 2c 20 26 6c 65 6e  nl, szJ-16, &len
8c60: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
8c70: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
8c80: 72 63 3b 0a 0a 20 20 69 66 28 20 6c 65 6e 3e 3d  rc;..  if( len>=
8c90: 6e 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 72  nMaster ){.    r
8ca0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
8cb0: 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61  .  }..  rc = rea
8cc0: 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 73  d32bits(pJrnl, s
8cd0: 7a 4a 2d 31 32 2c 20 26 63 6b 73 75 6d 29 3b 0a  zJ-12, &cksum);.
8ce0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8cf0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
8d00: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
8d10: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 61 4d  OsRead(pJrnl, aM
8d20: 61 67 69 63 2c 20 38 2c 20 73 7a 4a 2d 38 29 3b  agic, 8, szJ-8);
8d30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8d40: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
8d50: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
8d60: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
8d70: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
8d80: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
8d90: 6c 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 2c  l, zMaster, len,
8da0: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
8db0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
8dc0: 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
8dd0: 72 63 3b 0a 20 20 7d 0a 20 20 7a 4d 61 73 74 65  rc;.  }.  zMaste
8de0: 72 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 0a  r[len] = '\0';..
8df0: 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20    /* See if the 
8e00: 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73  checksum matches
8e10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
8e20: 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f  nal name */.  fo
8e30: 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b  r(i=0; i<len; i+
8e40: 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d  +){.    cksum -=
8e50: 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 20   zMaster[i];.   
8e60: 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20 29 7b  }.  if( cksum ){
8e70: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 63  .    /* If the c
8e80: 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27 74 20  hecksum doesn't 
8e90: 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f 6e 65  add up, then one
8ea0: 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68 65 20   or more of the 
8eb0: 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20 20 20  disk sectors.   
8ec0: 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   ** containing t
8ed0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
8ee0: 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 63 6f  l filename is co
8ef0: 72 72 75 70 74 65 64 2e 20 54 68 69 73 20 6d 65  rrupted. This me
8f00: 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66 69 6e  ans.    ** defin
8f10: 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63 6b 2c  itely roll back,
8f20: 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72 6e 20   so just return 
8f30: 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20 72 65  SQLITE_OK and re
8f40: 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20 20 20  port a (nul).   
8f50: 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75 72 6e   ** master-journ
8f60: 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20 20 20  al filename..   
8f70: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 5b   */.    zMaster[
8f80: 30 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20  0] = '\0';.  }. 
8f90: 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49    .  return SQLI
8fa0: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
8fb0: 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Seek the journal
8fc0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
8fd0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
8fe0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65  tor boundary whe
8ff0: 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  re a.** journal 
9000: 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65  header may be re
9010: 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50  ad or written. P
9020: 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ager.journalOff 
9030: 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a  is updated with.
9040: 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20  ** the new seek 
9050: 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e  offset..**.** i.
9060: 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73  e for a sector s
9070: 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a  ize of 512:.**.*
9080: 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20  * Input Offset  
9090: 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70              Outp
90a0: 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d  ut Offset.** ---
90b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
90d0: 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20  ----.** 0       
90e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90f0: 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20    0.** 512      
9100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9110: 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20   512.** 100     
9120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9130: 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20    512.** 2000   
9140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9150: 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73     2048.** .*/.s
9160: 74 61 74 69 63 20 76 6f 69 64 20 73 65 65 6b 4a  tatic void seekJ
9170: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
9180: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
9190: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
91a0: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
91b0: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
91c0: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
91d0: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
91e0: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
91f0: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
9200: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
9210: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
9220: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
9230: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
9240: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
9250: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
9260: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
9270: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
9280: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
9290: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
92a0: 66 73 65 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  fset;.}../*.** T
92b0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
92c0: 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68 65  must be open whe
92d0: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
92e0: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
92f0: 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a  nal.** header (J
9300: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79  OURNAL_HDR_SZ by
9310: 74 65 73 29 20 69 73 20 77 72 69 74 74 65 6e 20  tes) is written 
9320: 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
9330: 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20   file at the.** 
9340: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
9350: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d  ..**.** The form
9360: 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e  at for the journ
9370: 61 6c 20 68 65 61 64 65 72 20 69 73 20 61 73 20  al header is as 
9380: 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20  follows:.** - 8 
9390: 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69 64 65  bytes: Magic ide
93a0: 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c  ntifying journal
93b0: 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20   format..** - 4 
93c0: 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66  bytes: Number of
93d0: 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72   records in jour
93e0: 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79  nal, or -1 no-sy
93f0: 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a  nc mode is on..*
9400: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52 61 6e  * - 4 bytes: Ran
9410: 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65 64 20  dom number used 
9420: 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e 0a 2a  for page hash..*
9430: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49 6e 69  * - 4 bytes: Ini
9440: 74 69 61 6c 20 64 61 74 61 62 61 73 65 20 70 61  tial database pa
9450: 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34  ge count..** - 4
9460: 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72 20 73   bytes: Sector s
9470: 69 7a 65 20 75 73 65 64 20 62 79 20 74 68 65 20  ize used by the 
9480: 70 72 6f 63 65 73 73 20 74 68 61 74 20 77 72 6f  process that wro
9490: 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e  te this journal.
94a0: 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64  .** .** Followed
94b0: 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52   by (JOURNAL_HDR
94c0: 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65 73 20  _SZ - 24) bytes 
94d0: 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63 65 2e  of unused space.
94e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
94f0: 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50  riteJournalHdr(P
9500: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
9510: 20 63 68 61 72 20 7a 48 65 61 64 65 72 5b 73 69   char zHeader[si
9520: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9530: 69 63 29 2b 31 36 5d 3b 0a 20 20 69 6e 74 20 72  ic)+16];.  int r
9540: 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  c;..  if( pPager
9550: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20  ->stmtHdrOff==0 
9560: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
9570: 74 6d 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67  tmtHdrOff = pPag
9580: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
9590: 20 20 7d 0a 0a 20 20 73 65 65 6b 4a 6f 75 72 6e    }..  seekJourn
95a0: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
95b0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
95c0: 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  Hdr = pPager->jo
95d0: 75 72 6e 61 6c 4f 66 66 3b 0a 0a 20 20 6d 65 6d  urnalOff;..  mem
95e0: 63 70 79 28 7a 48 65 61 64 65 72 2c 20 61 4a 6f  cpy(zHeader, aJo
95f0: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
9600: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
9610: 29 29 3b 0a 0a 20 20 2f 2a 20 0a 20 20 2a 2a 20  ));..  /* .  ** 
9620: 57 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 46  Write the nRec F
9630: 69 65 6c 64 20 2d 20 74 68 65 20 6e 75 6d 62 65  ield - the numbe
9640: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
9650: 73 20 74 68 61 74 20 66 6f 6c 6c 6f 77 20 74 68  s that follow th
9660: 69 73 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  is.  ** journal 
9670: 68 65 61 64 65 72 2e 20 4e 6f 72 6d 61 6c 6c 79  header. Normally
9680: 2c 20 7a 65 72 6f 20 69 73 20 77 72 69 74 74 65  , zero is writte
9690: 6e 20 74 6f 20 74 68 69 73 20 76 61 6c 75 65 20  n to this value 
96a0: 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 20 20  at this time..  
96b0: 2a 2a 20 41 66 74 65 72 20 74 68 65 20 72 65 63  ** After the rec
96c0: 6f 72 64 73 20 61 72 65 20 61 64 64 65 64 20 74  ords are added t
96d0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 28 61  o the journal (a
96e0: 6e 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73  nd the journal s
96f0: 79 6e 63 65 64 2c 20 0a 20 20 2a 2a 20 69 66 20  ynced, .  ** if 
9700: 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
9710: 65 29 2c 20 74 68 65 20 7a 65 72 6f 20 69 73 20  e), the zero is 
9720: 6f 76 65 72 77 72 69 74 74 65 6e 20 77 69 74 68  overwritten with
9730: 20 74 68 65 20 74 72 75 65 20 6e 75 6d 62 65 72   the true number
9740: 0a 20 20 2a 2a 20 6f 66 20 72 65 63 6f 72 64 73  .  ** of records
9750: 20 28 73 65 65 20 73 79 6e 63 4a 6f 75 72 6e 61   (see syncJourna
9760: 6c 28 29 29 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  l())..  **.  ** 
9770: 41 20 66 61 73 74 65 72 20 61 6c 74 65 72 6e 61  A faster alterna
9780: 74 69 76 65 20 69 73 20 74 6f 20 77 72 69 74 65  tive is to write
9790: 20 30 78 46 46 46 46 46 46 46 46 20 74 6f 20 74   0xFFFFFFFF to t
97a0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 2e 20 57  he nRec field. W
97b0: 68 65 6e 0a 20 20 2a 2a 20 72 65 61 64 69 6e 67  hen.  ** reading
97c0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 69   the journal thi
97d0: 73 20 76 61 6c 75 65 20 74 65 6c 6c 73 20 53 51  s value tells SQ
97e0: 4c 69 74 65 20 74 6f 20 61 73 73 75 6d 65 20 74  Lite to assume t
97f0: 68 61 74 20 74 68 65 0a 20 20 2a 2a 20 72 65 73  hat the.  ** res
9800: 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
9810: 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 76   file contains v
9820: 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f 72 64  alid page record
9830: 73 2e 20 54 68 69 73 20 61 73 73 75 6d 70 74 69  s. This assumpti
9840: 6f 6e 0a 20 20 2a 2a 20 69 73 20 64 61 6e 67 65  on.  ** is dange
9850: 72 6f 75 73 2c 20 61 73 20 69 66 20 61 20 66 61  rous, as if a fa
9860: 69 6c 75 72 65 20 6f 63 63 75 72 65 64 20 77 68  ilure occured wh
9870: 69 6c 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20  ilst writing to 
9880: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  the journal.  **
9890: 20 66 69 6c 65 20 69 74 20 6d 61 79 20 63 6f 6e   file it may con
98a0: 74 61 69 6e 20 73 6f 6d 65 20 67 61 72 62 61 67  tain some garbag
98b0: 65 20 64 61 74 61 2e 20 54 68 65 72 65 20 61 72  e data. There ar
98c0: 65 20 74 77 6f 20 73 63 65 6e 61 72 69 6f 73 0a  e two scenarios.
98d0: 20 20 2a 2a 20 77 68 65 72 65 20 74 68 69 73 20    ** where this 
98e0: 72 69 73 6b 20 63 61 6e 20 62 65 20 69 67 6e 6f  risk can be igno
98f0: 72 65 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  red:.  **.  **  
9900: 20 2a 20 57 68 65 6e 20 74 68 65 20 70 61 67 65   * When the page
9910: 72 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20  r is in no-sync 
9920: 6d 6f 64 65 2e 20 43 6f 72 72 75 70 74 69 6f 6e  mode. Corruption
9930: 20 63 61 6e 20 66 6f 6c 6c 6f 77 20 61 0a 20 20   can follow a.  
9940: 2a 2a 20 20 20 20 20 70 6f 77 65 72 20 66 61 69  **     power fai
9950: 6c 75 72 65 20 69 6e 20 74 68 69 73 20 63 61 73  lure in this cas
9960: 65 20 61 6e 79 77 61 79 2e 0a 20 20 2a 2a 0a 20  e anyway..  **. 
9970: 20 2a 2a 20 20 20 2a 20 57 68 65 6e 20 74 68 65   **   * When the
9980: 20 53 51 4c 49 54 45 5f 49 4f 43 41 50 5f 53 41   SQLITE_IOCAP_SA
9990: 46 45 5f 41 50 50 45 4e 44 20 66 6c 61 67 20 69  FE_APPEND flag i
99a0: 73 20 73 65 74 2e 20 54 68 69 73 20 67 75 61 72  s set. This guar
99b0: 61 6e 74 65 65 73 0a 20 20 2a 2a 20 20 20 20 20  antees.  **     
99c0: 74 68 61 74 20 67 61 72 62 61 67 65 20 64 61 74  that garbage dat
99d0: 61 20 69 73 20 6e 65 76 65 72 20 61 70 70 65 6e  a is never appen
99e0: 64 65 64 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ded to the journ
99f0: 61 6c 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20  al file..  */.  
9a00: 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 66  assert(pPager->f
9a10: 64 2d 3e 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61  d->pMethods||pPa
9a20: 67 65 72 2d 3e 6e 6f 53 79 6e 63 29 3b 0a 20 20  ger->noSync);.  
9a30: 69 66 28 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53  if( (pPager->noS
9a40: 79 6e 63 29 20 0a 20 20 20 7c 7c 20 28 73 71 6c  ync) .   || (sql
9a50: 69 74 65 33 4f 73 44 65 76 69 63 65 43 68 61 72  ite3OsDeviceChar
9a60: 61 63 74 65 72 69 73 74 69 63 73 28 70 50 61 67  acteristics(pPag
9a70: 65 72 2d 3e 66 64 29 26 53 51 4c 49 54 45 5f 49  er->fd)&SQLITE_I
9a80: 4f 43 41 50 5f 53 41 46 45 5f 41 50 50 45 4e 44  OCAP_SAFE_APPEND
9a90: 29 20 0a 20 20 29 7b 0a 20 20 20 20 70 75 74 33  ) .  ){.    put3
9aa0: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9ab0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9ac0: 67 69 63 29 5d 2c 20 30 78 66 66 66 66 66 66 66  gic)], 0xfffffff
9ad0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
9ae0: 20 70 75 74 33 32 62 69 74 73 28 26 7a 48 65 61   put32bits(&zHea
9af0: 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72  der[sizeof(aJour
9b00: 6e 61 6c 4d 61 67 69 63 29 5d 2c 20 30 29 3b 0a  nalMagic)], 0);.
9b10: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 72 61    }..  /* The ra
9b20: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
9b30: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
9b40: 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e    sqlite3Randomn
9b50: 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65  ess(sizeof(pPage
9b60: 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26  r->cksumInit), &
9b70: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
9b80: 74 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73 28  t);.  put32bits(
9b90: 26 7a 48 65 61 64 65 72 5b 73 69 7a 65 6f 66 28  &zHeader[sizeof(
9ba0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 34  aJournalMagic)+4
9bb0: 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  ], pPager->cksum
9bc0: 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54 68 65 20  Init);.  /* The 
9bd0: 69 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65  initial database
9be0: 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75 74 33 32   size */.  put32
9bf0: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
9c00: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
9c10: 69 63 29 2b 38 5d 2c 20 70 50 61 67 65 72 2d 3e  ic)+8], pPager->
9c20: 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a 20 54 68  dbSize);.  /* Th
9c30: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
9c40: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
9c50: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70 75 74 33  rocess */.  put3
9c60: 32 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73  2bits(&zHeader[s
9c70: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
9c80: 67 69 63 29 2b 31 32 5d 2c 20 70 50 61 67 65 72  gic)+12], pPager
9c90: 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20  ->sectorSize);. 
9ca0: 20 49 4f 54 52 41 43 45 28 28 22 4a 48 44 52 20   IOTRACE(("JHDR 
9cb0: 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22 2c 20 70  %p %lld %d\n", p
9cc0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
9cd0: 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69 7a 65 6f  ournalHdr, sizeo
9ce0: 66 28 7a 48 65 61 64 65 72 29 29 29 0a 20 20 72  f(zHeader))).  r
9cf0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
9d00: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
9d10: 7a 48 65 61 64 65 72 2c 20 73 69 7a 65 6f 66 28  zHeader, sizeof(
9d20: 7a 48 65 61 64 65 72 29 2c 70 50 61 67 65 72 2d  zHeader),pPager-
9d30: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20  >journalOff);.  
9d40: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9d50: 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44  ff += JOURNAL_HD
9d60: 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20  R_SZ(pPager);.. 
9d70: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
9d80: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
9d90: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
9da0: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
9db0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
9dc0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
9dd0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
9de0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
9df0: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
9e00: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
9e10: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
9e20: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
9e30: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
9e40: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
9e50: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9e60: 4f 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e  OsWrite(pPager->
9e70: 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 2c 20  jfd, "\000", 1, 
9e80: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9e90: 66 66 2d 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ff-1);.  }.  ret
9ea0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9eb0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
9ec0: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
9ed0: 68 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c  hen this is call
9ee0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65  ed. A journal he
9ef0: 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f  ader file.** (JO
9f00: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74  URNAL_HDR_SZ byt
9f10: 65 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d  es) is read from
9f20: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63   the current loc
9f30: 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75  ation in the jou
9f40: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65  rnal.** file. Se
9f50: 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65  e comments above
9f60: 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a   function writeJ
9f70: 6f 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20  ournalHdr() for 
9f80: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
9f90: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
9fa0: 68 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a  header format..*
9fb0: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64  *.** If the head
9fc0: 65 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65  er is read succe
9fd0: 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69  ssfully, *nRec i
9fe0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d  s set to the num
9ff0: 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72  ber of.** page r
a000: 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67  ecords following
a010: 20 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64   this header and
a020: 20 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20   *dbSize is set 
a030: 74 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  to the size of t
a040: 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62  he.** database b
a050: 65 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61  efore the transa
a060: 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20  ction began, in 
a070: 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61  pages. Also, pPa
a080: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a  ger->cksumInit.*
a090: 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
a0a0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
a0b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  the journal head
a0c0: 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73  er. SQLITE_OK is
a0d0: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20   returned.** in 
a0e0: 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a  this case..**.**
a0f0: 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
a100: 68 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65  header file appe
a110: 61 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70  ars to be corrup
a120: 74 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45  ted, SQLITE_DONE
a130: 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20   is.** returned 
a140: 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64  and *nRec and *d
a150: 62 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65  bSize are not se
a160: 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48  t.  If JOURNAL_H
a170: 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63  DR_SZ bytes.** c
a180: 61 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72  annot be read fr
a190: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
a1a0: 69 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  ile an error cod
a1b0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
a1c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
a1d0: 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50  dJournalHdr(.  P
a1e0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20  ager *pPager, . 
a1f0: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65   i64 journalSize
a200: 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20  ,.  u32 *pNRec, 
a210: 0a 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a  .  u32 *pDbSize.
a220: 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75  ){.  int rc;.  u
a230: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
a240: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
a250: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
a260: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
a270: 20 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 0a    i64 jrnlOff;..
a280: 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72    seekJournalHdr
a290: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
a2a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a2b0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
a2c0: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
a2d0: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
a2e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
a2f0: 45 3b 0a 20 20 7d 0a 20 20 6a 72 6e 6c 4f 66 66  E;.  }.  jrnlOff
a300: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
a310: 61 6c 4f 66 66 3b 0a 0a 20 20 72 63 20 3d 20 73  alOff;..  rc = s
a320: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50 61  qlite3OsRead(pPa
a330: 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63  ger->jfd, aMagic
a340: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
a350: 2c 20 6a 72 6e 6c 4f 66 66 29 3b 0a 20 20 69 66  , jrnlOff);.  if
a360: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
a370: 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20 73  ;.  jrnlOff += s
a380: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 3b 0a 0a  izeof(aMagic);..
a390: 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61    if( memcmp(aMa
a3a0: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
a3b0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
a3c0: 63 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  c))!=0 ){.    re
a3d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a3e0: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65  ;.  }..  rc = re
a3f0: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
a400: 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 70  >jfd, jrnlOff, p
a410: 4e 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20  NRec);.  if( rc 
a420: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
a430: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
a440: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6a 72 6e  pPager->jfd, jrn
a450: 6c 4f 66 66 2b 34 2c 20 26 70 50 61 67 65 72 2d  lOff+4, &pPager-
a460: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 69  >cksumInit);.  i
a470: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a480: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
a490: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
a4a0: 64 2c 20 6a 72 6e 6c 4f 66 66 2b 38 2c 20 70 44  d, jrnlOff+8, pD
a4b0: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
a4c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
a4d0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
a4e0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
a4f0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
a500: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
a510: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
a520: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
a530: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
a540: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
a550: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
a560: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
a570: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
a580: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
a590: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
a5a0: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
a5b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
a5c0: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
a5d0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
a5e0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
a5f0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
a600: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
a610: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
a620: 72 65 61 64 33 32 62 69 74 73 28 70 50 61 67 65  read32bits(pPage
a630: 72 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2b  r->jfd, jrnlOff+
a640: 31 32 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  12, (u32 *)&pPag
a650: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
a660: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
a670: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
a680: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
a690: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
a6a0: 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e  Pager);.  return
a6b0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 0a   SQLITE_OK;.}...
a6c0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20  /*.** Write the 
a6d0: 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72 20  supplied master 
a6e0: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74  journal name int
a6f0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
a700: 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20  le for pager.** 
a710: 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63 75  pPager at the cu
a720: 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20  rrent location. 
a730: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
a740: 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65 20  al name must be 
a750: 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e  the last.** thin
a760: 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20 6a  g written to a j
a770: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20  ournal file. If 
a780: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
a790: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
a7a0: 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  the.** journal f
a7b0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69  ile descriptor i
a7c0: 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74 68  s advanced to th
a7d0: 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f  e next sector bo
a7e0: 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a  undary before.**
a7f0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72 69   anything is wri
a800: 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74  tten. The format
a810: 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62   is:.**.** + 4 b
a820: 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50  ytes: PAGER_MJ_P
a830: 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65  GNO..** + N byte
a840: 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73  s: length of mas
a850: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
a860: 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  ..** + 4 bytes: 
a870: 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20  N.** + 4 bytes: 
a880: 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e  Master journal n
a890: 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a  ame checksum..**
a8a0: 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f 75   + 8 bytes: aJou
a8b0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a  rnalMagic[]..**.
a8c0: 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f  ** The master jo
a8d0: 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63 6b  urnal page check
a8e0: 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20 6f  sum is the sum o
a8f0: 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20 74  f the bytes in t
a900: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  he master.** jou
a910: 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  rnal name..**.**
a920: 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73 20 61   If zMaster is a
a930: 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20 28 6f   NULL pointer (o
a940: 63 63 75 72 73 20 66 6f 72 20 61 20 73 69 6e 67  ccurs for a sing
a950: 6c 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e  le database tran
a960: 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20 74 68  saction), .** th
a970: 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e 6f 2d  is call is a no-
a980: 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  op..*/.static in
a990: 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  t writeMasterJou
a9a0: 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
a9b0: 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  er, const char *
a9c0: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
a9d0: 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a  rc;.  int len; .
a9e0: 20 20 69 6e 74 20 69 3b 20 0a 20 20 69 36 34 20    int i; .  i64 
a9f0: 6a 72 6e 6c 4f 66 66 3b 0a 20 20 75 33 32 20 63  jrnlOff;.  u32 c
aa00: 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63 68 61 72  ksum = 0;.  char
aa10: 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28 61 4a 6f   zBuf[sizeof(aJo
aa20: 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32 2a 34 5d  urnalMagic)+2*4]
aa30: 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65  ;..  if( !zMaste
aa40: 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74  r || pPager->set
aa50: 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e 20 53  Master) return S
aa60: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67  QLITE_OK;.  pPag
aa70: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
aa80: 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c  1;..  len = strl
aa90: 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66  en(zMaster);.  f
aaa0: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
aab0: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b  ++){.    cksum +
aac0: 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20  = zMaster[i];.  
aad0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75  }..  /* If in fu
aae0: 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64  ll-sync mode, ad
aaf0: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
ab00: 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65  t disk sector be
ab10: 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a  fore writing.  *
ab20: 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * the master jou
ab30: 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20  rnal name. This 
ab40: 69 73 20 69 6e 20 63 61 73 65 20 74 68 65 20 70  is in case the p
ab50: 72 65 76 69 6f 75 73 20 70 61 67 65 20 77 72 69  revious page wri
ab60: 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65  tten to.  ** the
ab70: 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72   journal has alr
ab80: 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64  eady been synced
ab90: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
aba0: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b  ger->fullSync ){
abb0: 0a 20 20 20 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  .    seekJournal
abc0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  Hdr(pPager);.  }
abd0: 0a 20 20 6a 72 6e 6c 4f 66 66 20 3d 20 70 50 61  .  jrnlOff = pPa
abe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
abf0: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
ac00: 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30  alOff += (len+20
ac10: 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65  );..  rc = write
ac20: 33 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a  32bits(pPager->j
ac30: 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20 50 41 47  fd, jrnlOff, PAG
ac40: 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65  ER_MJ_PGNO(pPage
ac50: 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  r));.  if( rc!=S
ac60: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
ac70: 6e 20 72 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20  n rc;.  jrnlOff 
ac80: 2b 3d 20 34 3b 0a 0a 20 20 72 63 20 3d 20 73 71  += 4;..  rc = sq
ac90: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61  lite3OsWrite(pPa
aca0: 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
acb0: 72 2c 20 6c 65 6e 2c 20 6a 72 6e 6c 4f 66 66 29  r, len, jrnlOff)
acc0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
acd0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
ace0: 63 3b 0a 20 20 6a 72 6e 6c 4f 66 66 20 2b 3d 20  c;.  jrnlOff += 
acf0: 6c 65 6e 3b 0a 0a 20 20 70 75 74 33 32 62 69 74  len;..  put32bit
ad00: 73 28 7a 42 75 66 2c 20 6c 65 6e 29 3b 0a 20 20  s(zBuf, len);.  
ad10: 70 75 74 33 32 62 69 74 73 28 26 7a 42 75 66 5b  put32bits(&zBuf[
ad20: 34 5d 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 6d 65  4], cksum);.  me
ad30: 6d 63 70 79 28 26 7a 42 75 66 5b 38 5d 2c 20 61  mcpy(&zBuf[8], a
ad40: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69  JournalMagic, si
ad50: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
ad60: 69 63 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ic));.  rc = sql
ad70: 69 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67  ite3OsWrite(pPag
ad80: 65 72 2d 3e 6a 66 64 2c 20 7a 42 75 66 2c 20 38  er->jfd, zBuf, 8
ad90: 2b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  +sizeof(aJournal
ada0: 4d 61 67 69 63 29 2c 20 6a 72 6e 6c 4f 66 66 29  Magic), jrnlOff)
adb0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
adc0: 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e  Sync = !pPager->
add0: 6e 6f 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e  noSync;.  return
ade0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64   rc;.}../*.** Ad
adf0: 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61  d or remove a pa
ae00: 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74  ge from the list
ae10: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68   of all pages th
ae20: 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a  at are in the.**
ae30: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ae40: 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61  al..**.** The Pa
ae50: 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70 61  ger keeps a sepa
ae60: 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67  rate list of pag
ae70: 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72 72  es that are curr
ae80: 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20  ently in.** the 
ae90: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
aea0: 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20 74  l.  This helps t
aeb0: 68 65 20 73 71 6c 69 74 65 33 50 61 67 65 72 53  he sqlite3PagerS
aec0: 74 6d 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72  tmtCommit().** r
aed0: 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20  outine run MUCH 
aee0: 66 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63  faster for the c
aef0: 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
af00: 20 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a   there are many.
af10: 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f  ** pages in memo
af20: 72 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65  ry but only a fe
af30: 77 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61  w are in the sta
af40: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a  tement journal..
af50: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
af60: 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
af70: 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29  list(PgHdr *pPg)
af80: 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
af90: 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
afa0: 0a 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48  .  PgHistory *pH
afb0: 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
afc0: 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
afd0: 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44  ;.  assert( MEMD
afe0: 42 20 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73  B );.  if( !pHis
aff0: 74 2d 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20  t->inStmt ){.   
b000: 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
b010: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
b020: 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74  pHist->pNextStmt
b030: 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70  ==0 );.    if( p
b040: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a  Pager->pStmt ){.
b050: 20 20 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48        PGHDR_TO_H
b060: 49 53 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d  IST(pPager->pStm
b070: 74 2c 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65  t, pPager)->pPre
b080: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20  vStmt = pPg;.   
b090: 20 7d 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e   }.    pHist->pN
b0a0: 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72  extStmt = pPager
b0b0: 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61  ->pStmt;.    pPa
b0c0: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
b0d0: 3b 0a 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53  ;.    pHist->inS
b0e0: 74 6d 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a  tmt = 1;.  }.}..
b0f0: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67  /*.** Find a pag
b100: 65 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61  e in the hash ta
b110: 62 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61  ble given its pa
b120: 67 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75  ge number.  Retu
b130: 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20  rn.** a pointer 
b140: 74 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e  to the page or N
b150: 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64  ULL if not found
b160: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
b170: 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  r *pager_lookup(
b180: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
b190: 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
b1a0: 64 72 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61  dr *p;.  if( pPa
b1b0: 67 65 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20  ger->aHash==0 ) 
b1c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20  return 0;.  p = 
b1d0: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67  pPager->aHash[pg
b1e0: 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
b1f0: 61 73 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65  ash-1)];.  while
b200: 28 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d  ( p && p->pgno!=
b210: 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20  pgno ){.    p = 
b220: 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  p->pNextHash;.  
b230: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
b240: 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 74 68 65  ./*.** Clear the
b250: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
b260: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
b270: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
b280: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
b290: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
b2a0: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
b2b0: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
b2c0: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
b2d0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
b2e0: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
b2f0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
b300: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
b310: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
b320: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
b330: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
b340: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
b350: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
b360: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
b370: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28  g, *pNext;.  if(
b380: 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
b390: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
b3a0: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
b3b0: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
b3c0: 74 29 7b 0a 20 20 20 20 49 4f 54 52 41 43 45 28  t){.    IOTRACE(
b3d0: 28 22 50 47 46 52 45 45 20 25 70 20 25 64 5c 6e  ("PGFREE %p %d\n
b3e0: 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
b3f0: 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50 41 47 45  pgno));.    PAGE
b400: 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
b410: 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f 75 6e  ager_pgfree_coun
b420: 74 29 3b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t);.    pNext = 
b430: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
b440: 20 20 20 6c 72 75 4c 69 73 74 52 65 6d 6f 76 65     lruListRemove
b450: 28 70 50 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  (pPg);.    sqlit
b460: 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70 44 61  e3_free(pPg->pDa
b470: 74 61 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ta);.    sqlite3
b480: 5f 66 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a  _free(pPg);.  }.
b490: 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72 2d    assert(pPager-
b4a0: 3e 6c 72 75 2e 70 46 69 72 73 74 3d 3d 30 29 3b  >lru.pFirst==0);
b4b0: 0a 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72  .  assert(pPager
b4c0: 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79 6e 63  ->lru.pFirstSync
b4d0: 65 64 3d 3d 30 29 3b 0a 20 20 61 73 73 65 72 74  ed==0);.  assert
b4e0: 28 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 4c 61  (pPager->lru.pLa
b4f0: 73 74 3d 3d 30 29 3b 0a 20 20 70 50 61 67 65 72  st==0);.  pPager
b500: 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  ->pStmt = 0;.  p
b510: 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b  Pager->pAll = 0;
b520: 0a 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  .  pPager->pDirt
b530: 79 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  y = 0;.  pPager-
b540: 3e 6e 48 61 73 68 20 3d 20 30 3b 0a 20 20 73 71  >nHash = 0;.  sq
b550: 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65  lite3_free(pPage
b560: 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70 50 61  r->aHash);.  pPa
b570: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
b580: 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 20    pPager->aHash 
b590: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
b5a0: 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  Ref = 0;.}../*.*
b5b0: 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74  * Unlock the dat
b5c0: 61 62 61 73 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a  abase file. .**.
b5d0: 2a 2a 20 49 66 20 74 68 65 20 70 61 67 65 72 20  ** If the pager 
b5e0: 69 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20  is currently in 
b5f0: 65 72 72 6f 72 20 73 74 61 74 65 2c 20 64 69 73  error state, dis
b600: 63 61 72 64 20 74 68 65 20 63 6f 6e 74 65 6e 74  card the content
b610: 73 20 6f 66 20 0a 2a 2a 20 74 68 65 20 63 61 63  s of .** the cac
b620: 68 65 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  he and reset the
b630: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
b640: 20 69 6e 74 65 72 6e 61 6c 20 73 74 61 74 65 2e   internal state.
b650: 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20   If there is.** 
b660: 61 6e 20 6f 70 65 6e 20 6a 6f 75 72 6e 61 6c 2d  an open journal-
b670: 66 69 6c 65 2c 20 74 68 65 6e 20 74 68 65 20 6e  file, then the n
b680: 65 78 74 20 74 69 6d 65 20 61 20 73 68 61 72 65  ext time a share
b690: 64 2d 6c 6f 63 6b 20 69 73 20 6f 62 74 61 69 6e  d-lock is obtain
b6a0: 65 64 0a 2a 2a 20 6f 6e 20 74 68 65 20 70 61 67  ed.** on the pag
b6b0: 65 72 20 66 69 6c 65 20 28 62 79 20 74 68 69 73  er file (by this
b6c0: 20 6f 72 20 61 6e 79 20 6f 74 68 65 72 20 70 72   or any other pr
b6d0: 6f 63 65 73 73 29 2c 20 69 74 20 77 69 6c 6c 20  ocess), it will 
b6e0: 62 65 0a 2a 2a 20 74 72 65 61 74 65 64 20 61 73  be.** treated as
b6f0: 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 61   a hot-journal a
b700: 6e 64 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  nd rolled back..
b710: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
b720: 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65  ager_unlock(Page
b730: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66  r *pPager){.  if
b740: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
b750: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
b760: 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20  if( !MEMDB ){.  
b770: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
b780: 66 64 2d 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a  fd->pMethods ){.
b790: 20 20 20 20 20 20 20 20 6f 73 55 6e 6c 6f 63 6b          osUnlock
b7a0: 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  (pPager->fd, NO_
b7b0: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
b7c0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
b7d0: 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ize = -1;.      
b7e0: 49 4f 54 52 41 43 45 28 28 22 55 4e 4c 4f 43 4b  IOTRACE(("UNLOCK
b7f0: 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
b800: 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 50 61  ..      /* If Pa
b810: 67 65 72 2e 65 72 72 43 6f 64 65 20 69 73 20 73  ger.errCode is s
b820: 65 74 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  et, the contents
b830: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 63 61   of the pager ca
b840: 63 68 65 20 63 61 6e 6e 6f 74 20 62 65 0a 20 20  che cannot be.  
b850: 20 20 20 20 2a 2a 20 74 72 75 73 74 65 64 2e 20      ** trusted. 
b860: 4e 6f 77 20 74 68 61 74 20 74 68 65 20 70 61 67  Now that the pag
b870: 65 72 20 66 69 6c 65 20 69 73 20 75 6e 6c 6f 63  er file is unloc
b880: 6b 65 64 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74  ked, the content
b890: 73 20 6f 66 20 74 68 65 0a 20 20 20 20 20 20 2a  s of the.      *
b8a0: 2a 20 63 61 63 68 65 20 63 61 6e 20 62 65 20 64  * cache can be d
b8b0: 69 73 63 61 72 64 65 64 20 61 6e 64 20 74 68 65  iscarded and the
b8c0: 20 65 72 72 6f 72 20 63 6f 64 65 20 73 61 66 65   error code safe
b8d0: 6c 79 20 63 6c 65 61 72 65 64 2e 0a 20 20 20 20  ly cleared..    
b8e0: 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70    */.      if( p
b8f0: 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
b900: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
b910: 2d 3e 65 72 72 43 6f 64 65 20 3d 20 53 51 4c 49  ->errCode = SQLI
b920: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 70  TE_OK;.        p
b930: 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
b940: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
b950: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
b960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b970: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50 61  lite3OsClose(pPa
b980: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
b990: 20 20 20 20 20 20 73 71 6c 69 74 65 33 42 69 74        sqlite3Bit
b9a0: 76 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65  vecDestroy(pPage
b9b0: 72 2d 3e 70 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->pInStmt);.   
b9c0: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70         pPager->p
b9d0: 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  InStmt = 0;.    
b9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
b9f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ba00: 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20 20 20  lOpen ){.       
ba10: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
ba20: 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  e(pPager->jfd);.
ba30: 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
ba40: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
ba50: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  0;.          sql
ba60: 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72 6f  ite3BitvecDestro
ba70: 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75  y(pPager->pInJou
ba80: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  rnal);.         
ba90: 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
baa0: 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  nal = 0;.       
bab0: 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
bac0: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
bad0: 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
bae0: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
baf0: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bb00: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
bb10: 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
bb20: 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
bb30: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   0;.        pPag
bb40: 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
bb50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
bb60: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
bb70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
bb80: 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 21 4d 45    }..    if( !ME
bb90: 4d 44 42 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65  MDB || pPager->e
bba0: 72 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f  rrCode==SQLITE_O
bbb0: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
bbc0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
bbd0: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 70  _UNLOCK;.      p
bbe0: 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
bbf0: 6e 74 44 6f 6e 65 20 3d 20 30 3b 0a 20 20 20 20  ntDone = 0;.    
bc00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
bc10: 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62 61 63  xecute a rollbac
bc20: 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  k if a transacti
bc30: 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61 6e 64  on is active and
bc40: 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a 2a 20   unlock the .** 
bc50: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49  database file. I
bc60: 66 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  f the pager has 
bc70: 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65 64 20  already entered 
bc80: 74 68 65 20 65 72 72 6f 72 20 73 74 61 74 65 2c  the error state,
bc90: 20 0a 2a 2a 20 64 6f 20 6e 6f 74 20 61 74 74 65   .** do not atte
bca0: 6d 70 74 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  mpt the rollback
bcb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bcc0: 20 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52   pagerUnlockAndR
bcd0: 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
bce0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  ){.  assert( p->
bcf0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
bd00: 45 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72  ERVED || p->jour
bd10: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
bd20: 69 66 28 20 70 2d 3e 65 72 72 43 6f 64 65 3d 3d  if( p->errCode==
bd30: 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 70 2d 3e  SQLITE_OK && p->
bd40: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
bd50: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
bd60: 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
bd70: 6b 28 70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65  k(p);.  }.  page
bd80: 72 5f 75 6e 6c 6f 63 6b 28 70 29 3b 0a 20 20 61  r_unlock(p);.  a
bd90: 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f 64  ssert( p->errCod
bda0: 65 20 7c 7c 20 21 70 2d 3e 6a 6f 75 72 6e 61 6c  e || !p->journal
bdb0: 4f 70 65 6e 20 7c 7c 20 28 70 2d 3e 65 78 63 6c  Open || (p->excl
bdc0: 75 73 69 76 65 4d 6f 64 65 26 26 21 70 2d 3e 6a  usiveMode&&!p->j
bdd0: 6f 75 72 6e 61 6c 4f 66 66 29 20 29 3b 0a 20 20  ournalOff) );.  
bde0: 61 73 73 65 72 74 28 20 70 2d 3e 65 72 72 43 6f  assert( p->errCo
bdf0: 64 65 20 7c 7c 20 21 70 2d 3e 73 74 6d 74 4f 70  de || !p->stmtOp
be00: 65 6e 20 7c 7c 20 70 2d 3e 65 78 63 6c 75 73 69  en || p->exclusi
be10: 76 65 4d 6f 64 65 20 29 3b 0a 7d 0a 0a 2f 2a 0a  veMode );.}../*.
be20: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
be30: 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74 69  ends a transacti
be40: 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74 69  on.  A transacti
be50: 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20 65  on is ended by e
be60: 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d 49  ither.** a COMMI
be70: 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b 2e  T or a ROLLBACK.
be80: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73  .**.** When this
be90: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
bea0: 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68 61  ed, the pager ha
beb0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
bec0: 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61  le open and.** a
bed0: 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
bee0: 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
bef0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
bf00: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
bf10: 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20 64  release.** the d
bf20: 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64  atabase lock and
bf30: 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52   acquires a SHAR
bf40: 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70  ED lock in its p
bf50: 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73 0a  lace if that is.
bf60: 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69 61  ** the appropria
bf70: 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e 20  te thing to do. 
bf80: 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20 75   Release locks u
bf90: 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f 70  sually is approp
bfa0: 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73 73  riate,.** unless
bfb0: 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c 75   we are in exclu
bfc0: 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64 65  sive access mode
bfd0: 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73 20   or unless this 
bfe0: 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54 20  is a .** COMMIT 
bff0: 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f 4c  AND BEGIN or ROL
c000: 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e 20  LBACK AND BEGIN 
c010: 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  operation..**.**
c020: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
c030: 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c 65  e is either dele
c040: 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65 64  ted or truncated
c050: 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f  ..**.** TODO: Co
c060: 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74  nsider keeping t
c070: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
c080: 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61  open for tempora
c090: 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a  ry databases..**
c0a0: 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65   This might give
c0b0: 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69   a performance i
c0c0: 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69  mprovement on wi
c0d0: 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e  ndows where open
c0e0: 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73  ing.** a file is
c0f0: 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70   an expensive op
c100: 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  eration..*/.stat
c110: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e 64  ic int pager_end
c120: 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61 67  _transaction(Pag
c130: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
c140: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
c150: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
c160: 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51 4c  .  int rc2 = SQL
c170: 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74  ITE_OK;.  assert
c180: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
c190: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
c1a0: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
c1b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
c1c0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
c1d0: 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f  lite3PagerStmtCo
c1e0: 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
c1f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
c200: 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72 2d  Open && !pPager-
c210: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29  >exclusiveMode )
c220: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
c230: 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 73 74 66  lose(pPager->stf
c240: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
c250: 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20  stmtOpen = 0;.  
c260: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
c270: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
c280: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
c290: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a 20 20  xclusiveMode .  
c2a0: 20 20 20 20 20 20 20 20 26 26 20 28 72 63 20 3d          && (rc =
c2b0: 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61   sqlite3OsTrunca
c2c0: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
c2d0: 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  0))==SQLITE_OK )
c2e0: 7b 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  {;.      pPager-
c2f0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
c300: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c310: 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20  ournalStarted = 
c320: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
c330: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
c340: 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  se(pPager->jfd);
c350: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  .      pPager->j
c360: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
c370: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
c380: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
c390: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
c3a0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
c3b0: 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a  pVfs, pPager->zJ
c3c0: 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20  ournal, 0);.    
c3d0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
c3e0: 6c 69 74 65 33 42 69 74 76 65 63 44 65 73 74 72  lite3BitvecDestr
c3f0: 6f 79 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f  oy(pPager->pInJo
c400: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 70 50 61 67  urnal);.    pPag
c410: 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->pInJournal =
c420: 20 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d   0;.    for(pPg=
c430: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
c440: 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
c450: 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67  tAll){.      pPg
c460: 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
c470: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
c480: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
c490: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
c4a0: 20 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79        pPg->alway
c4b0: 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23  sRollback = 0;.#
c4c0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
c4d0: 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
c4e0: 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
c4f0: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
c500: 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
c510: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
c520: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
c530: 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
c540: 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
c550: 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  >nRec = 0;.  }el
c560: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
c570: 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
c580: 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73  al==0 );.    ass
c590: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
c5a0: 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
c5b0: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
c5c0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66  ==0 );.  }..  if
c5d0: 28 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  ( !pPager->exclu
c5e0: 73 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20  siveMode ){.    
c5f0: 72 63 32 20 3d 20 6f 73 55 6e 6c 6f 63 6b 28 70  rc2 = osUnlock(p
c600: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
c610: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 70 50 61  D_LOCK);.    pPa
c620: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
c630: 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 7d 65 6c  ER_SHARED;.  }el
c640: 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  se if( pPager->s
c650: 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e 43  tate==PAGER_SYNC
c660: 45 44 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  ED ){.    pPager
c670: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
c680: 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 20  EXCLUSIVE;.  }. 
c690: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
c6a0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
c6b0: 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
c6c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
c6d0: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 6c 72 75 4c  Sync = 0;.  lruL
c6e0: 69 73 74 53 65 74 46 69 72 73 74 53 79 6e 63 65  istSetFirstSynce
c6f0: 64 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  d(pPager);.  pPa
c700: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31  ger->dbSize = -1
c710: 3b 0a 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d  ;..  return (rc=
c720: 3d 53 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72  =SQLITE_OK?rc2:r
c730: 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  c);.}../*.** Com
c740: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
c750: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
c760: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
c770: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
c780: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
c790: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
c7a0: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
c7b0: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
c7c0: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
c7d0: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
c7e0: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
c7f0: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
c800: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
c810: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
c820: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
c830: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
c840: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
c850: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
c860: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
c870: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
c880: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
c890: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
c8a0: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
c8b0: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
c8c0: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
c8d0: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
c8e0: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
c8f0: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
c900: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
c910: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
c920: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
c930: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
c940: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
c950: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
c960: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
c970: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
c980: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
c990: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
c9a0: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
c9b0: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
c9c0: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
c9d0: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
c9e0: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
c9f0: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
ca00: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
ca10: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
ca20: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
ca30: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
ca40: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
ca50: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
ca60: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
ca70: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
ca80: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
ca90: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
caa0: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
cab0: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
cac0: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
cad0: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
cae0: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
caf0: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
cb00: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
cb10: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
cb20: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
cb30: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
cb40: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
cb50: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
cb60: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
cb70: 6f 6e 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b  onst u8 *aData){
cb80: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
cb90: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
cba0: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
cbb0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
cbc0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
cbd0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
cbe0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
cbf0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
cc00: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
cc10: 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
cc20: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76  tion */.static v
cc30: 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67  oid makeClean(Pg
cc40: 48 64 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65  Hdr*);../*.** Re
cc50: 61 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65  ad a single page
cc60: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
cc70: 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e  l file opened on
cc80: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
cc90: 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61  .** jfd.  Playba
cca0: 63 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65  ck this one page
ccb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b  ..**.** If useCk
ccc0: 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20  sum==0 it means 
ccd0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65  this journal doe
cce0: 73 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73  s not use checks
ccf0: 75 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a  ums.  Checksums.
cd00: 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20  ** are not used 
cd10: 69 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  in statement jou
cd20: 72 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74  rnals because st
cd30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73  atement journals
cd40: 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20   do not.** need 
cd50: 74 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72  to survive power
cd60: 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74   failures..*/.st
cd70: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70  atic int pager_p
cd80: 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65  layback_one_page
cd90: 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  (.  Pager *pPage
cda0: 72 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  r, .  sqlite3_fi
cdb0: 6c 65 20 2a 6a 66 64 2c 0a 20 20 69 36 34 20 6f  le *jfd,.  i64 o
cdc0: 66 66 73 65 74 2c 0a 20 20 69 6e 74 20 75 73 65  ffset,.  int use
cdd0: 43 6b 73 75 6d 0a 29 7b 0a 20 20 69 6e 74 20 72  Cksum.){.  int r
cde0: 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  c;.  PgHdr *pPg;
cdf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce00: 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e     /* An existin
ce10: 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61  g page in the ca
ce20: 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  che */.  Pgno pg
ce30: 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  no;             
ce40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61         /* The pa
ce50: 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70  ge number of a p
ce60: 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a  age in journal *
ce70: 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20  /.  u32 cksum;  
ce80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce90: 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73    /* Checksum us
cea0: 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68  ed for sanity ch
ceb0: 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 2a  ecking */.  u8 *
cec0: 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70 50  aData = (u8 *)pP
ced0: 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 3b  ager->pTmpSpace;
cee0: 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61     /* Temp stora
cef0: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
cf00: 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d 20  ..  /* useCksum 
cf10: 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20 66  should be true f
cf20: 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75 72  or the main jour
cf30: 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66 6f  nal and false fo
cf40: 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74  r.  ** statement
cf50: 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72 69   journals.  Veri
cf60: 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73 20  fy that this is 
cf70: 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65 0a  always the case.
cf80: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 6a    */.  assert( j
cf90: 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d 20  fd == (useCksum 
cfa0: 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a 20  ? pPager->jfd : 
cfb0: 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29 3b  pPager->stfd) );
cfc0: 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74 61  .  assert( aData
cfd0: 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   );..  rc = read
cfe0: 33 32 62 69 74 73 28 6a 66 64 2c 20 6f 66 66 73  32bits(jfd, offs
cff0: 65 74 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69 66  et, &pgno);.  if
d000: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
d010: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72  ) return rc;.  r
d020: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
d030: 64 28 6a 66 64 2c 20 61 44 61 74 61 2c 20 70 50  d(jfd, aData, pP
d040: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20  ager->pageSize, 
d050: 6f 66 66 73 65 74 2b 34 29 3b 0a 20 20 69 66 28  offset+4);.  if(
d060: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
d070: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50   return rc;.  pP
d080: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
d090: 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   += pPager->page
d0a0: 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20  Size + 4;..  /* 
d0b0: 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  Sanity checking 
d0c0: 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68  on the page.  Th
d0d0: 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72  is is more impor
d0e0: 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67  tant that I orig
d0f0: 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75  inally.  ** thou
d100: 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72  ght.  If a power
d110: 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20   failure occurs 
d120: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
d130: 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74  l is being writt
d140: 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c  en,.  ** it coul
d150: 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20  d cause invalid 
d160: 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74  data to be writt
d170: 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  en into the jour
d180: 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f  nal.  We need to
d190: 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69  .  ** detect thi
d1a0: 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28  s invalid data (
d1b0: 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62  with high probab
d1c0: 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72  ility) and ignor
d1d0: 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  e it..  */.  if(
d1e0: 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f   pgno==0 || pgno
d1f0: 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28  ==PAGER_MJ_PGNO(
d200: 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72  pPager) ){.    r
d210: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
d220: 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e  E;.  }.  if( pgn
d230: 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67  o>(unsigned)pPag
d240: 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
d250: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
d260: 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73  OK;.  }.  if( us
d270: 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63  eCksum ){.    rc
d280: 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66   = read32bits(jf
d290: 64 2c 20 6f 66 66 73 65 74 2b 70 50 61 67 65 72  d, offset+pPager
d2a0: 2d 3e 70 61 67 65 53 69 7a 65 2b 34 2c 20 26 63  ->pageSize+4, &c
d2b0: 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72  ksum);.    if( r
d2c0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  c ) return rc;. 
d2d0: 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
d2e0: 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
d2f0: 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  if( pager_cksum(
d300: 70 50 61 67 65 72 2c 20 61 44 61 74 61 29 21 3d  pPager, aData)!=
d310: 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20 20 20 72  cksum ){.      r
d320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
d330: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  E;.    }.  }..  
d340: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
d350: 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
d360: 45 52 56 45 44 20 7c 7c 20 70 50 61 67 65 72 2d  ERVED || pPager-
d370: 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
d380: 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20 20 2f 2a  CLUSIVE );..  /*
d390: 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69 73   If the pager is
d3a0: 20 69 6e 20 52 45 53 45 52 56 45 44 20 73 74 61   in RESERVED sta
d3b0: 74 65 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  te, then there m
d3c0: 75 73 74 20 62 65 20 61 20 63 6f 70 79 20 6f 66  ust be a copy of
d3d0: 20 74 68 69 73 0a 20 20 2a 2a 20 70 61 67 65 20   this.  ** page 
d3e0: 69 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  in the pager cac
d3f0: 68 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  he. In this case
d400: 20 6a 75 73 74 20 75 70 64 61 74 65 20 74 68 65   just update the
d410: 20 70 61 67 65 72 20 63 61 63 68 65 2c 0a 20 20   pager cache,.  
d420: 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61 74 61 62  ** not the datab
d430: 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ase file. The pa
d440: 67 65 20 69 73 20 6c 65 66 74 20 6d 61 72 6b 65  ge is left marke
d450: 64 20 64 69 72 74 79 20 69 6e 20 74 68 69 73 20  d dirty in this 
d460: 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  case..  **.  ** 
d470: 41 6e 20 65 78 63 65 70 74 69 6f 6e 20 74 6f 20  An exception to 
d480: 74 68 65 20 61 62 6f 76 65 20 72 75 6c 65 3a 20  the above rule: 
d490: 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
d4a0: 69 73 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f  is in no-sync mo
d4b0: 64 65 0a 20 20 2a 2a 20 61 6e 64 20 61 20 70 61  de.  ** and a pa
d4c0: 67 65 20 69 73 20 6d 6f 76 65 64 20 64 75 72 69  ge is moved duri
d4d0: 6e 67 20 61 6e 20 69 6e 63 72 65 6d 65 6e 74 61  ng an incrementa
d4e0: 6c 20 76 61 63 75 75 6d 20 74 68 65 6e 20 74 68  l vacuum then th
d4f0: 65 20 70 61 67 65 20 6d 61 79 0a 20 20 2a 2a 20  e page may.  ** 
d500: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 70 61  not be in the pa
d510: 67 65 72 20 63 61 63 68 65 2e 20 4c 61 74 65 72  ger cache. Later
d520: 3a 20 69 66 20 61 20 6d 61 6c 6c 6f 63 28 29 20  : if a malloc() 
d530: 6f 72 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  or IO error occu
d540: 72 73 0a 20 20 2a 2a 20 64 75 72 69 6e 67 20 61  rs.  ** during a
d550: 20 4d 6f 76 65 70 61 67 65 28 29 20 63 61 6c 6c   Movepage() call
d560: 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 20  , then the page 
d570: 6d 61 79 20 6e 6f 74 20 62 65 20 69 6e 20 74 68  may not be in th
d580: 65 20 63 61 63 68 65 0a 20 20 2a 2a 20 65 69 74  e cache.  ** eit
d590: 68 65 72 2e 20 53 6f 20 74 68 65 20 63 6f 6e 64  her. So the cond
d5a0: 69 74 69 6f 6e 20 64 65 73 63 72 69 62 65 64 20  ition described 
d5b0: 69 6e 20 74 68 65 20 61 62 6f 76 65 20 70 61 72  in the above par
d5c0: 61 67 72 61 70 68 20 69 73 20 6e 6f 74 0a 20 20  agraph is not.  
d5d0: 2a 2a 20 61 73 73 65 72 74 28 29 61 62 6c 65 2e  ** assert()able.
d5e0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e  .  **.  ** If in
d5f0: 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65   EXCLUSIVE state
d600: 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65  , then we update
d610: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
d620: 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20   if it exists.  
d630: 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20  ** and the main 
d640: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
d650: 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f  s then marked no
d660: 74 20 64 69 72 74 79 2e 0a 20 20 2a 2a 0a 20 20  t dirty..  **.  
d670: 2a 2a 20 54 69 63 6b 65 74 20 23 31 31 37 31 3a  ** Ticket #1171:
d680: 20 20 54 68 65 20 73 74 61 74 65 6d 65 6e 74 20    The statement 
d690: 6a 6f 75 72 6e 61 6c 20 6d 69 67 68 74 20 63 6f  journal might co
d6a0: 6e 74 61 69 6e 20 70 61 67 65 20 63 6f 6e 74 65  ntain page conte
d6b0: 6e 74 20 74 68 61 74 20 69 73 0a 20 20 2a 2a 20  nt that is.  ** 
d6c0: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74  different from t
d6d0: 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20  he page content 
d6e0: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
d6f0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  the transaction.
d700: 0a 20 20 2a 2a 20 54 68 69 73 20 6f 63 63 75 72  .  ** This occur
d710: 73 20 77 68 65 6e 20 61 20 70 61 67 65 20 69 73  s when a page is
d720: 20 63 68 61 6e 67 65 64 20 70 72 69 6f 72 20 74   changed prior t
d730: 6f 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 61  o the start of a
d740: 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20   statement.  ** 
d750: 74 68 65 6e 20 63 68 61 6e 67 65 64 20 61 67 61  then changed aga
d760: 69 6e 20 77 69 74 68 69 6e 20 74 68 65 20 73 74  in within the st
d770: 61 74 65 6d 65 6e 74 2e 20 20 57 68 65 6e 20 72  atement.  When r
d780: 6f 6c 6c 69 6e 67 20 62 61 63 6b 20 73 75 63 68  olling back such
d790: 20 61 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e   a.  ** statemen
d7a0: 74 20 77 65 20 6d 75 73 74 20 6e 6f 74 20 77 72  t we must not wr
d7b0: 69 74 65 20 74 6f 20 74 68 65 20 6f 72 69 67 69  ite to the origi
d7c0: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 75 6e 6c  nal database unl
d7d0: 65 73 73 20 77 65 20 6b 6e 6f 77 0a 20 20 2a 2a  ess we know.  **
d7e0: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 74 68 61   for certain tha
d7f0: 74 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20  t original page 
d800: 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 73 79 6e  contents are syn
d810: 63 65 64 20 69 6e 74 6f 20 74 68 65 20 6d 61 69  ced into the mai
d820: 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  n rollback.  ** 
d830: 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77  journal.  Otherw
d840: 69 73 65 2c 20 61 20 70 6f 77 65 72 20 6c 6f 73  ise, a power los
d850: 73 20 6d 69 67 68 74 20 6c 65 61 76 65 20 6d 6f  s might leave mo
d860: 64 69 66 69 65 64 20 64 61 74 61 20 69 6e 20 74  dified data in t
d870: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
d880: 20 66 69 6c 65 20 77 69 74 68 6f 75 74 20 61 6e   file without an
d890: 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20 72 6f   entry in the ro
d8a0: 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20 74  llback journal t
d8b0: 68 61 74 20 63 61 6e 0a 20 20 2a 2a 20 72 65 73  hat can.  ** res
d8c0: 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61 73  tore the databas
d8d0: 65 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  e to its origina
d8e0: 6c 20 66 6f 72 6d 2e 20 20 54 77 6f 20 63 6f 6e  l form.  Two con
d8f0: 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62 65 0a  ditions must be.
d900: 20 20 2a 2a 20 6d 65 74 20 62 65 66 6f 72 65 20    ** met before 
d910: 77 72 69 74 69 6e 67 20 74 6f 20 74 68 65 20 64  writing to the d
d920: 61 74 61 62 61 73 65 20 66 69 6c 65 73 2e 20 28  atabase files. (
d930: 31 29 20 74 68 65 20 64 61 74 61 62 61 73 65 20  1) the database 
d940: 6d 75 73 74 20 62 65 0a 20 20 2a 2a 20 6c 6f 63  must be.  ** loc
d950: 6b 65 64 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f  ked.  (2) we kno
d960: 77 20 74 68 61 74 20 74 68 65 20 6f 72 69 67 69  w that the origi
d970: 6e 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74  nal page content
d980: 20 69 73 20 66 75 6c 6c 79 20 73 79 6e 63 65 64   is fully synced
d990: 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 6d 61 69  .  ** in the mai
d9a0: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
d9b0: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
d9c0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
d9d0: 65 20 6f 72 20 65 6c 73 65 0a 20 20 2a 2a 20 74  e or else.  ** t
d9e0: 68 65 20 70 61 67 65 20 69 73 20 6d 61 72 6b 65  he page is marke
d9f0: 64 20 61 73 20 6e 65 65 64 53 79 6e 63 3d 3d 30  d as needSync==0
da00: 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70  ..  */.  pPg = p
da10: 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
da20: 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 50 41 47  er, pgno);.  PAG
da30: 45 52 54 52 41 43 45 34 28 22 50 4c 41 59 42 41  ERTRACE4("PLAYBA
da40: 43 4b 20 25 64 20 70 61 67 65 20 25 64 20 68 61  CK %d page %d ha
da50: 73 68 28 25 30 38 78 29 5c 6e 22 2c 0a 20 20 20  sh(%08x)\n",.   
da60: 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45              PAGE
da70: 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67 6e  RID(pPager), pgn
da80: 6f 2c 20 70 61 67 65 72 5f 64 61 74 61 68 61 73  o, pager_datahas
da90: 68 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  h(pPager->pageSi
daa0: 7a 65 2c 20 61 44 61 74 61 29 29 3b 0a 20 20 69  ze, aData));.  i
dab0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
dac0: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
dad0: 45 20 26 26 20 28 70 50 67 3d 3d 30 20 7c 7c 20  E && (pPg==0 || 
dae0: 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
daf0: 29 20 29 7b 0a 20 20 20 20 69 36 34 20 6f 66 66  ) ){.    i64 off
db00: 73 65 74 20 3d 20 28 70 67 6e 6f 2d 31 29 2a 28  set = (pgno-1)*(
db10: 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65  i64)pPager->page
db20: 53 69 7a 65 3b 0a 20 20 20 20 72 63 20 3d 20 73  Size;.    rc = s
db30: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
db40: 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c  ager->fd, aData,
db50: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
db60: 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20 20  e, offset);.    
db70: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
db80: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
db90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
dba0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
dbb0: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
dbc0: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
dbd0: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
dbe0: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
dbf0: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
dc00: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
dc10: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
dc20: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
dc30: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
dc40: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
dc50: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
dc60: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
dc70: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
dc80: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
dc90: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
dca0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
dcb0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
dcc0: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
dcd0: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
dce0: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
dcf0: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
dd00: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
dd10: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
dd20: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
dd30: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
dd40: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
dd50: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
dd60: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
dd70: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
dd80: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
dd90: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
dda0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
ddb0: 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
ddc0: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
ddd0: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
dde0: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
ddf0: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
de00: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
de10: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
de20: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
de30: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
de40: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
de50: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
de60: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
de70: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
de80: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
de90: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
dea0: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
deb0: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
dec0: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
ded0: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
dee0: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
def0: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
df00: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
df10: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
df20: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
df30: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
df40: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
df50: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
df60: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
df70: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
df80: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
df90: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
dfa0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
dfb0: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
dfc0: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
dfd0: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
dfe0: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
dff0: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
e000: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
e010: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
e020: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
e030: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
e040: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
e050: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
e060: 20 41 72 67 75 6d 65 6e 74 20 7a 4d 61 73 74 65   Argument zMaste
e070: 72 20 6d 61 79 20 70 6f 69 6e 74 20 74 6f 20 50  r may point to P
e080: 61 67 65 72 2e 70 54 6d 70 53 70 61 63 65 2e 20  ager.pTmpSpace. 
e090: 53 6f 20 74 68 61 74 20 62 75 66 66 65 72 20 69  So that buffer i
e0a0: 73 20 6e 6f 74 20 0a 2a 2a 20 61 76 61 69 6c 61  s not .** availa
e0b0: 62 6c 65 20 66 6f 72 20 75 73 65 20 77 69 74 68  ble for use with
e0c0: 69 6e 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  in this function
e0d0: 2e 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  ..**.**.** The m
e0e0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
e0f0: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
e100: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
e110: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
e120: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
e130: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
e140: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
e150: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
e160: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
e170: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
e180: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
e190: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
e1a0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
e1b0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
e1c0: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
e1d0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
e1e0: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
e1f0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
e200: 5f 64 65 6c 6d 61 73 74 65 72 28 50 61 67 65 72  _delmaster(Pager
e210: 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20   *pPager, const 
e220: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
e230: 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
e240: 56 66 73 20 3d 20 70 50 61 67 65 72 2d 3e 70 56  Vfs = pPager->pV
e250: 66 73 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  fs;.  int rc;.  
e260: 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  int master_open 
e270: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  = 0;.  sqlite3_f
e280: 69 6c 65 20 2a 70 4d 61 73 74 65 72 3b 0a 20 20  ile *pMaster;.  
e290: 73 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 70 4a  sqlite3_file *pJ
e2a0: 6f 75 72 6e 61 6c 3b 0a 20 20 63 68 61 72 20 2a  ournal;.  char *
e2b0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d  zMasterJournal =
e2c0: 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20   0; /* Contents 
e2d0: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
e2e0: 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20  l file */.  i64 
e2f0: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20  nMasterJournal; 
e300: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
e310: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
e320: 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70  file */..  /* Op
e330: 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  en the master jo
e340: 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75  urnal file exclu
e350: 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73  sively in case s
e360: 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
e370: 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e  s.  ** is runnin
e380: 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  g this routine a
e390: 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74  lso. Not that it
e3a0: 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20   makes too much 
e3b0: 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f  difference..  */
e3c0: 0a 20 20 70 4d 61 73 74 65 72 20 3d 20 28 73 71  .  pMaster = (sq
e3d0: 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 73 71 6c  lite3_file *)sql
e3e0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 70 56 66 73  ite3_malloc(pVfs
e3f0: 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 32 29 3b  ->szOsFile * 2);
e400: 0a 20 20 70 4a 6f 75 72 6e 61 6c 20 3d 20 28 73  .  pJournal = (s
e410: 71 6c 69 74 65 33 5f 66 69 6c 65 20 2a 29 28 28  qlite3_file *)((
e420: 28 75 38 20 2a 29 70 4d 61 73 74 65 72 29 20 2b  (u8 *)pMaster) +
e430: 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29   pVfs->szOsFile)
e440: 3b 0a 20 20 69 66 28 20 21 70 4d 61 73 74 65 72  ;.  if( !pMaster
e450: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
e460: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 65 6c  ITE_NOMEM;.  }el
e470: 73 65 7b 0a 20 20 20 20 69 6e 74 20 66 6c 61 67  se{.    int flag
e480: 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50 45 4e  s = (SQLITE_OPEN
e490: 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49 54 45  _READONLY|SQLITE
e4a0: 5f 4f 50 45 4e 5f 4d 41 53 54 45 52 5f 4a 4f 55  _OPEN_MASTER_JOU
e4b0: 52 4e 41 4c 29 3b 0a 20 20 20 20 72 63 20 3d 20  RNAL);.    rc = 
e4c0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
e4d0: 66 73 2c 20 7a 4d 61 73 74 65 72 2c 20 70 4d 61  fs, zMaster, pMa
e4e0: 73 74 65 72 2c 20 66 6c 61 67 73 2c 20 30 29 3b  ster, flags, 0);
e4f0: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
e500: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
e510: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
e520: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31   master_open = 1
e530: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
e540: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4d 61 73  3OsFileSize(pMas
e550: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
e560: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
e570: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
e580: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
e590: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
e5a0: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
e5b0: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
e5c0: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
e5d0: 72 50 74 72 20 3d 20 30 3b 0a 20 20 20 20 69 6e  rPtr = 0;.    in
e5e0: 74 20 6e 4d 61 73 74 65 72 50 74 72 20 3d 20 70  t nMasterPtr = p
e5f0: 50 61 67 65 72 2d 3e 70 56 66 73 2d 3e 6d 78 50  Pager->pVfs->mxP
e600: 61 74 68 6e 61 6d 65 2b 31 3b 0a 0a 20 20 20 20  athname+1;..    
e610: 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69  /* Load the enti
e620: 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  re master journa
e630: 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63  l file into spac
e640: 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a  e obtained from.
e650: 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 33 5f 6d      ** sqlite3_m
e660: 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e  alloc() and poin
e670: 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65  ted to by zMaste
e680: 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a  rJournal. .    *
e690: 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75  /.    zMasterJou
e6a0: 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73  rnal = (char *)s
e6b0: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 6e 4d  qlite3_malloc(nM
e6c0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 2b 20 6e  asterJournal + n
e6d0: 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20  MasterPtr);.    
e6e0: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
e6f0: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
e700: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
e710: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
e720: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
e730: 20 20 20 20 7a 4d 61 73 74 65 72 50 74 72 20 3d      zMasterPtr =
e740: 20 26 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &zMasterJournal
e750: 5b 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 5d  [nMasterJournal]
e760: 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
e770: 65 33 4f 73 52 65 61 64 28 70 4d 61 73 74 65 72  e3OsRead(pMaster
e780: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
e790: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
e7a0: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
e7b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
e7c0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
e7d0: 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20  ;..    zJournal 
e7e0: 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  = zMasterJournal
e7f0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 7a 4a  ;.    while( (zJ
e800: 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f  ournal-zMasterJo
e810: 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f  urnal)<nMasterJo
e820: 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 69  urnal ){.      i
e830: 66 28 20 73 71 6c 69 74 65 33 4f 73 41 63 63 65  f( sqlite3OsAcce
e840: 73 73 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61  ss(pVfs, zJourna
e850: 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43 45 53 53  l, SQLITE_ACCESS
e860: 5f 45 58 49 53 54 53 29 20 29 7b 0a 20 20 20 20  _EXISTS) ){.    
e870: 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68      /* One of th
e880: 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74  e journals point
e890: 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61 73  ed to by the mas
e8a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ter journal exis
e8b0: 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f  ts..        ** O
e8c0: 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63 6b  pen it and check
e8d0: 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61 74   if it points at
e8e0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
e8f0: 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20 20  nal. If.        
e900: 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77 69  ** so, return wi
e910: 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20 74  thout deleting t
e920: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
e930: 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
e940: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63  */.        int c
e950: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66 6c  ;.        int fl
e960: 61 67 73 20 3d 20 28 53 51 4c 49 54 45 5f 4f 50  ags = (SQLITE_OP
e970: 45 4e 5f 52 45 41 44 4f 4e 4c 59 7c 53 51 4c 49  EN_READONLY|SQLI
e980: 54 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55  TE_OPEN_MAIN_JOU
e990: 52 4e 41 4c 29 3b 0a 20 20 20 20 20 20 20 20 72  RNAL);.        r
e9a0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65  c = sqlite3OsOpe
e9b0: 6e 28 70 56 66 73 2c 20 7a 4a 6f 75 72 6e 61 6c  n(pVfs, zJournal
e9c0: 2c 20 70 4a 6f 75 72 6e 61 6c 2c 20 66 6c 61 67  , pJournal, flag
e9d0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  s, 0);.        i
e9e0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
e9f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
ea00: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
ea10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
ea20: 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 4d 61       rc = readMa
ea30: 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 4a 6f 75  sterJournal(pJou
ea40: 72 6e 61 6c 2c 20 7a 4d 61 73 74 65 72 50 74 72  rnal, zMasterPtr
ea50: 2c 20 6e 4d 61 73 74 65 72 50 74 72 29 3b 0a 20  , nMasterPtr);. 
ea60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
ea70: 43 6c 6f 73 65 28 70 4a 6f 75 72 6e 61 6c 29 3b  Close(pJournal);
ea80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
ea90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
eaa0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
eab0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
eac0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
ead0: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 5b 30 5d   = zMasterPtr[0]
eae0: 21 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d  !=0 && strcmp(zM
eaf0: 61 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65  asterPtr, zMaste
eb00: 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 69  r)==0;.        i
eb10: 66 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20  f( c ){.        
eb20: 20 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d    /* We have a m
eb30: 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c  atch. Do not del
eb40: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
eb50: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a  ournal file. */.
eb60: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
eb70: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
eb80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
eb90: 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b        zJournal +
eba0: 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e  = (strlen(zJourn
ebb0: 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20  al)+1);.    }.  
ebc0: 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73 71 6c 69  }.  .  rc = sqli
ebd0: 74 65 33 4f 73 44 65 6c 65 74 65 28 70 56 66 73  te3OsDelete(pVfs
ebe0: 2c 20 7a 4d 61 73 74 65 72 2c 20 30 29 3b 0a 0a  , zMaster, 0);..
ebf0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20  delmaster_out:. 
ec00: 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72   if( zMasterJour
ec10: 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  nal ){.    sqlit
ec20: 65 33 5f 66 72 65 65 28 7a 4d 61 73 74 65 72 4a  e3_free(zMasterJ
ec30: 6f 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20  ournal);.  }  . 
ec40: 20 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e   if( master_open
ec50: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
ec60: 73 43 6c 6f 73 65 28 70 4d 61 73 74 65 72 29 3b  sClose(pMaster);
ec70: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
ec80: 72 65 65 28 70 4d 61 73 74 65 72 29 3b 0a 20 20  ree(pMaster);.  
ec90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73  return rc;.}...s
eca0: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
ecb0: 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
ecc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a  Pager *pPager);.
ecd0: 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20  ./*.** Truncate 
ece0: 74 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66  the main file of
ecf0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72   the given pager
ed00: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
ed10: 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63  f pages.** indic
ed20: 61 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63  ated. Also trunc
ed30: 61 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72  ate the cached r
ed40: 65 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66  epresentation of
ed50: 20 74 68 65 20 66 69 6c 65 2e 0a 2a 2a 0a 2a 2a   the file..**.**
ed60: 20 4d 69 67 68 74 20 6d 69 67 68 74 20 62 65 20   Might might be 
ed70: 74 68 65 20 63 61 73 65 20 74 68 61 74 20 74 68  the case that th
ed80: 65 20 66 69 6c 65 20 6f 6e 20 64 69 73 6b 20 69  e file on disk i
ed90: 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 6e  s smaller than n
eda0: 50 61 67 65 2e 0a 2a 2a 20 54 68 69 73 20 63 61  Page..** This ca
edb0: 6e 20 68 61 70 70 65 6e 2c 20 66 6f 72 20 65 78  n happen, for ex
edc0: 61 6d 70 6c 65 2c 20 69 66 20 77 65 20 61 72 65  ample, if we are
edd0: 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20 6f   in the middle o
ede0: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  f a transaction.
edf0: 2a 2a 20 77 68 69 63 68 20 68 61 73 20 65 78 74  ** which has ext
ee00: 65 6e 64 65 64 20 74 68 65 20 66 69 6c 65 20 73  ended the file s
ee10: 69 7a 65 20 61 6e 64 20 74 68 65 20 6e 65 77 20  ize and the new 
ee20: 70 61 67 65 73 20 61 72 65 20 73 74 69 6c 6c 20  pages are still 
ee30: 61 6c 6c 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 63  all held.** in c
ee40: 61 63 68 65 2c 20 74 68 65 6e 20 61 6e 20 49 4e  ache, then an IN
ee50: 53 45 52 54 20 6f 72 20 55 50 44 41 54 45 20 64  SERT or UPDATE d
ee60: 6f 65 73 20 61 20 73 74 61 74 65 6d 65 6e 74 20  oes a statement 
ee70: 72 6f 6c 6c 62 61 63 6b 2e 20 20 53 6f 6d 65 0a  rollback.  Some.
ee80: 2a 2a 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73  ** operating sys
ee90: 74 65 6d 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  tem implementati
eea0: 6f 6e 73 20 63 61 6e 20 67 65 74 20 63 6f 6e 66  ons can get conf
eeb0: 75 73 65 64 20 69 66 20 79 6f 75 20 74 72 79 20  used if you try 
eec0: 74 6f 0a 2a 2a 20 74 72 75 6e 63 61 74 65 20 61  to.** truncate a
eed0: 20 66 69 6c 65 20 74 6f 20 73 6f 6d 65 20 73 69   file to some si
eee0: 7a 65 20 74 68 61 74 20 69 73 20 6c 61 72 67 65  ze that is large
eef0: 72 20 74 68 61 6e 20 69 74 20 63 75 72 72 65 6e  r than it curren
ef00: 74 6c 79 20 69 73 2c 0a 2a 2a 20 73 6f 20 64 65  tly is,.** so de
ef10: 74 65 63 74 20 74 68 69 73 20 63 61 73 65 20 61  tect this case a
ef20: 6e 64 20 64 6f 20 6e 6f 74 20 64 6f 20 74 68 65  nd do not do the
ef30: 20 74 72 75 6e 63 61 74 69 6f 6e 2e 0a 2a 2f 0a   truncation..*/.
ef40: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
ef50: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
ef60: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
ef70: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  ge){.  int rc = 
ef80: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28  SQLITE_OK;.  if(
ef90: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
efa0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
efb0: 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  && pPager->fd->p
efc0: 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 69  Methods ){.    i
efd0: 36 34 20 63 75 72 72 65 6e 74 53 69 7a 65 2c 20  64 currentSize, 
efe0: 6e 65 77 53 69 7a 65 3b 0a 20 20 20 20 72 63 20  newSize;.    rc 
eff0: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
f000: 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ize(pPager->fd, 
f010: 26 63 75 72 72 65 6e 74 53 69 7a 65 29 3b 0a 20  &currentSize);. 
f020: 20 20 20 6e 65 77 53 69 7a 65 20 3d 20 70 50 61     newSize = pPa
f030: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69  ger->pageSize*(i
f040: 36 34 29 6e 50 61 67 65 3b 0a 20 20 20 20 69 66  64)nPage;.    if
f050: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
f060: 26 26 20 63 75 72 72 65 6e 74 53 69 7a 65 3e 6e  && currentSize>n
f070: 65 77 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  ewSize ){.      
f080: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72  rc = sqlite3OsTr
f090: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2d 3e 66  uncate(pPager->f
f0a0: 64 2c 20 6e 65 77 53 69 7a 65 29 3b 0a 20 20 20  d, newSize);.   
f0b0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d   }.  }.  if( rc=
f0c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
f0d0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
f0e0: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 70 61   = nPage;.    pa
f0f0: 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63  ger_truncate_cac
f100: 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  he(pPager);.  }.
f110: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
f120: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 65  /*.** Set the se
f130: 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74 68 65  ctorSize for the
f140: 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a   given pager..**
f150: 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72 20 73  .** The sector s
f160: 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72 67 65  ize is the large
f170: 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20  r of the sector 
f180: 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a 2a 2a  size reported.**
f190: 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53 65 63   by sqlite3OsSec
f1a0: 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20 74 68  torSize() and th
f1b0: 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f 0a 73  e pageSize..*/.s
f1c0: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 53 65  tatic void setSe
f1d0: 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72 20 2a  ctorSize(Pager *
f1e0: 70 50 61 67 65 72 29 7b 0a 20 20 61 73 73 65 72  pPager){.  asser
f1f0: 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
f200: 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
f210: 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28  tempFile);.  if(
f220: 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
f230: 6c 65 20 29 7b 0a 20 20 20 20 2f 2a 20 53 65 63  le ){.    /* Sec
f240: 74 6f 72 20 73 69 7a 65 20 64 6f 65 73 6e 27 74  tor size doesn't
f250: 20 6d 61 74 74 65 72 20 66 6f 72 20 74 65 6d 70   matter for temp
f260: 6f 72 61 72 79 20 66 69 6c 65 73 2e 20 41 6c 73  orary files. Als
f270: 6f 2c 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20  o, the file.    
f280: 2a 2a 20 6d 61 79 20 6e 6f 74 20 68 61 76 65 20  ** may not have 
f290: 62 65 65 6e 20 6f 70 65 6e 65 64 20 79 65 74 2c  been opened yet,
f2a0: 20 69 6e 20 77 68 63 69 68 20 63 61 73 65 20 74   in whcih case t
f2b0: 68 65 20 4f 73 53 65 63 74 6f 72 53 69 7a 65 28  he OsSectorSize(
f2c0: 29 0a 20 20 20 20 2a 2a 20 63 61 6c 6c 20 77 69  ).    ** call wi
f2d0: 6c 6c 20 73 65 67 66 61 75 6c 74 2e 0a 20 20 20  ll segfault..   
f2e0: 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
f2f0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71 6c  sectorSize = sql
f300: 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a 65  ite3OsSectorSize
f310: 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20  (pPager->fd);.  
f320: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
f330: 73 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67 65  sectorSize<pPage
f340: 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
f350: 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f     pPager->secto
f360: 72 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  rSize = pPager->
f370: 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d 0a  pageSize;.  }.}.
f380: 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20  ./*.** Playback 
f390: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
f3a0: 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68 65  thus restore the
f3b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74   database file t
f3c0: 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 69  o.** the state i
f3d0: 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65 20  t was in before 
f3e0: 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69 6e  we started makin
f3f0: 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a  g changes.  .**.
f400: 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
f410: 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61 73  ile format is as
f420: 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a   follows: .**.**
f430: 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70 72    (1)  8 byte pr
f440: 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f 66  efix.  A copy of
f450: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
f460: 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79 74  ..**  (2)  4 byt
f470: 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
f480: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
f490: 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c 69  e number of vali
f4a0: 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a 2a  d page records.*
f4b0: 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 6a  *       in the j
f4c0: 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69 73  ournal.  If this
f4d0: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
f4e0: 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70 75  ffff, then compu
f4f0: 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  te the.**       
f500: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20 72  number of page r
f510: 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65 20  ecords from the 
f520: 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a  journal size..**
f530: 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62 69    (3)  4 byte bi
f540: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
f550: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69 6e   which is the in
f560: 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72 20  itial value for 
f570: 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73 61  the .**       sa
f580: 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  nity checksum..*
f590: 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20 69  *  (4)  4 byte i
f5a0: 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20  nteger which is 
f5b0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
f5c0: 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65 20  ges to truncate 
f5d0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61 74  the.**       dat
f5e0: 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67 20  abase to during 
f5f0: 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20  a rollback..**  
f600: 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74 65  (5)  4 byte inte
f610: 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65  ger which is the
f620: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
f630: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a   in the master j
f640: 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20  ournal.**       
f650: 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75 65  name.  The value
f660: 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69 6e   may be zero (in
f670: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 72  dicate that ther
f680: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a  e is no master.*
f690: 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 2e  *       journal.
f6a0: 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79 74  ).**  (6)  N byt
f6b0: 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65 72  es of the master
f6c0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 20   journal name.  
f6d0: 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62 65  The name will be
f6e0: 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 0a   nul-terminated.
f6f0: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69 67  **       and mig
f700: 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74 68  ht be shorter th
f710: 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65 61  an the value rea
f720: 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66 20  d from (5).  If 
f730: 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a 2a  the first byte.*
f740: 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6e  *       of the n
f750: 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65 6e  ame is \000 then
f760: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
f770: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ter journal.  Th
f780: 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20  e master.**     
f790: 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69    journal name i
f7a0: 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46 2d  s stored in UTF-
f7b0: 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72 6f  8..**  (7)  Zero
f7c0: 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20 69   or more pages i
f7d0: 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20 61  nstances, each a
f7e0: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20  s follows:.**   
f7f0: 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 70       +  4 byte p
f800: 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20  age number..**  
f810: 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72 2d        +  pPager-
f820: 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73 20  >pageSize bytes 
f830: 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20 20  of data..**     
f840: 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68 65     +  4 byte che
f850: 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  cksum.**.** When
f860: 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68 65   we speak of the
f870: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2c   journal header,
f880: 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69 72   we mean the fir
f890: 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76 65  st 6 items above
f8a0: 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79 20  ..** Each entry 
f8b0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
f8c0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
f8d0: 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a 2a   the 7th item..*
f8e0: 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76 61  *.** Call the va
f8f0: 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65 63  lue from the sec
f900: 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65 63  ond bullet "nRec
f910: 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65 20  ".  nRec is the 
f920: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61 6c  number of.** val
f930: 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73 20  id page entries 
f940: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  in the journal. 
f950: 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c 20   In most cases, 
f960: 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65 20  you can compute 
f970: 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66 20  the.** value of 
f980: 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73 69  nRec from the si
f990: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
f9a0: 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66 20  l file.  But if 
f9b0: 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c 75  a power.** failu
f9c0: 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69 6c  re occurred whil
f9d0: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 61  e the journal wa
f9e0: 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c  s being written,
f9f0: 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68 65   it could be the
fa00: 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74 68  .** case that th
fa10: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
fa20: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20 61  urnal file had a
fa30: 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63 72  lready been incr
fa40: 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68 65  eased but.** the
fa50: 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20 68   extra entries h
fa60: 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65 20  ad not yet made 
fa70: 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69 73  it safely to dis
fa80: 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63 61  k.  In such a ca
fa90: 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65  se,.** the value
faa0: 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74 65   of nRec compute
fab0: 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  d from the file 
fac0: 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74 6f  size would be to
fad0: 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a 2a  o large.  For.**
fae0: 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77 65   that reason, we
faf0: 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65 20   always use the 
fb00: 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74 68  nRec value in th
fb10: 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20  e header..**.** 
fb20: 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  If the nRec valu
fb30: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 20  e is 0xffffffff 
fb40: 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e 52  it means that nR
fb50: 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f 6d  ec should be com
fb60: 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74 68  puted.** from th
fb70: 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54 68  e file size.  Th
fb80: 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65 64  is value is used
fb90: 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 73   when the user s
fba0: 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e 6f  elects the.** no
fbb0: 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f 72  -sync option for
fbc0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
fbd0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63   power failure c
fbe0: 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f 72  ould lead to cor
fbf0: 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68  ruption.** in th
fc00: 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66 6f  is case.  But fo
fc10: 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74 65  r things like te
fc20: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28 77  mporary table (w
fc30: 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a 20  hich will be.** 
fc40: 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68 65  deleted when the
fc50: 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f 72   power is restor
fc60: 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61 72  ed) we don't car
fc70: 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  e.  .**.** If th
fc80: 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61 73  e file opened as
fc90: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
fca0: 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c 2d  e is not a well-
fcb0: 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61  formed.** journa
fcc0: 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c 20  l file then all 
fcd0: 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65 20  pages up to the 
fce0: 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64 20  first corrupted 
fcf0: 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64 0a  page are rolled.
fd00: 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20 70  ** back (or no p
fd10: 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75 72  ages if the jour
fd20: 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63 6f  nal header is co
fd30: 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a 6f  rrupted). The jo
fd40: 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69 73  urnal file.** is
fd50: 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61 6e   then deleted an
fd60: 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  d SQLITE_OK retu
fd70: 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69 66  rned, just as if
fd80: 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20 68   no corruption h
fd90: 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f 75  ad.** been encou
fda0: 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  ntered..**.** If
fdb0: 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f   an I/O or mallo
fdc0: 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72 73  c() error occurs
fdd0: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66 69  , the journal-fi
fde0: 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74 65  le is not delete
fdf0: 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  d.** and an erro
fe00: 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
fe10: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ed..*/.static in
fe20: 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  t pager_playback
fe30: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
fe40: 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 73 71  int isHot){.  sq
fe50: 6c 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20  lite3_vfs *pVfs 
fe60: 3d 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a  = pPager->pVfs;.
fe70: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
fe80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
fe90: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
fea0: 6c 20 66 69 6c 65 20 69 6e 20 62 79 74 65 73 20  l file in bytes 
feb0: 2a 2f 0a 20 20 75 33 32 20 6e 52 65 63 3b 20 20  */.  u32 nRec;  
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fed0: 20 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72   Number of Recor
fee0: 64 73 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ds in the journa
fef0: 6c 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  l */.  int i;   
ff00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff10: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
ff20: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d  */.  Pgno mxPg =
ff30: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a   0;           /*
ff40: 20 53 69 7a 65 20 6f 66 20 74 68 65 20 6f 72 69   Size of the ori
ff50: 67 69 6e 61 6c 20 66 69 6c 65 20 69 6e 20 70 61  ginal file in pa
ff60: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ges */.  int rc;
ff70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff80: 20 20 2f 2a 20 52 65 73 75 6c 74 20 63 6f 64 65    /* Result code
ff90: 20 6f 66 20 61 20 73 75 62 72 6f 75 74 69 6e 65   of a subroutine
ffa0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73   */.  char *zMas
ffb0: 74 65 72 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  ter = 0;       /
ffc0: 2a 20 4e 61 6d 65 20 6f 66 20 6d 61 73 74 65 72  * Name of master
ffd0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66   journal file if
ffe0: 20 61 6e 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69   any */..  /* Fi
fff0: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
10000 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
10010 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41   the journal.  A
10020 62 6f 72 74 20 65 61 72 6c 79 20 69 66 0a 20 20  bort early if.  
10030 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  ** the journal i
10040 73 20 65 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20  s empty..  */.  
10050 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
10060 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20  journalOpen );. 
10070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
10080 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
10090 6a 66 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  jfd, &szJ);.  if
100a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
100b0 7c 7c 20 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20  || szJ==0 ){.   
100c0 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
100d0 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65  ck;.  }..  /* Re
100e0 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ad the master jo
100f0 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20  urnal name from 
10100 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20  the journal, if 
10110 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a 20  it is present.. 
10120 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20   ** If a master 
10130 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d  journal file nam
10140 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
10150 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73 20  but the file is 
10160 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74  not.  ** present
10170 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20 74   on disk, then t
10180 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f  he journal is no
10190 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e  t hot and does n
101a0 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20 20  ot need to be.  
101b0 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a  ** played back..
101c0 20 20 2a 2f 0a 20 20 7a 4d 61 73 74 65 72 20 3d    */.  zMaster =
101d0 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61   pPager->pTmpSpa
101e0 63 65 3b 0a 20 20 72 63 20 3d 20 72 65 61 64 4d  ce;.  rc = readM
101f0 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
10200 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65  ger->jfd, zMaste
10210 72 2c 20 70 50 61 67 65 72 2d 3e 70 56 66 73 2d  r, pPager->pVfs-
10220 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a  >mxPathname+1);.
10230 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
10240 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 69  LITE_DONE );.  i
10250 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10260 20 0a 20 20 20 7c 7c 20 28 7a 4d 61 73 74 65 72   .   || (zMaster
10270 5b 30 5d 20 26 26 20 21 73 71 6c 69 74 65 33 4f  [0] && !sqlite3O
10280 73 41 63 63 65 73 73 28 70 56 66 73 2c 20 7a 4d  sAccess(pVfs, zM
10290 61 73 74 65 72 2c 20 53 51 4c 49 54 45 5f 41 43  aster, SQLITE_AC
102a0 43 45 53 53 5f 45 58 49 53 54 53 29 29 20 0a 20  CESS_EXISTS)) . 
102b0 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
102c0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  = 0;.    if( rc=
102d0 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72  =SQLITE_DONE ) r
102e0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
102f0 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79     goto end_play
10300 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
10310 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
10320 20 30 3b 0a 20 20 7a 4d 61 73 74 65 72 20 3d 20   0;.  zMaster = 
10330 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f  0;..  /* This lo
10340 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69  op terminates ei
10350 74 68 65 72 20 77 68 65 6e 20 74 68 65 20 72 65  ther when the re
10360 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63  adJournalHdr() c
10370 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a  all returns.  **
10380 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20   SQLITE_DONE or 
10390 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75  an IO error occu
103a0 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20  rs. */.  while( 
103b0 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61  1 ){..    /* Rea
103c0 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e  d the next journ
103d0 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74  al header from t
103e0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
103f0 20 20 49 66 20 74 68 65 72 65 20 61 72 65 0a 20    If there are. 
10400 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68     ** not enough
10410 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74   bytes left in t
10420 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
10430 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68  for a complete h
10440 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a  eader, or.    **
10450 20 69 74 20 69 73 20 63 6f 72 72 75 70 74 65 64   it is corrupted
10460 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73  , then a process
10470 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20   must of failed 
10480 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74  while writing it
10490 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e  ..    ** This in
104a0 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20  dicates nothing 
104b0 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65  more needs to be
104c0 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20   rolled back..  
104d0 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65    */.    rc = re
104e0 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  adJournalHdr(pPa
104f0 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c  ger, szJ, &nRec,
10500 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28   &mxPg);.    if(
10510 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10520 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  { .      if( rc=
10530 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
10540 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
10550 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a  ITE_OK;.      }.
10560 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70        goto end_p
10570 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a  layback;.    }..
10580 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69      /* If nRec i
10590 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74 68  s 0xffffffff, th
105a0 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  en this journal 
105b0 77 61 73 20 63 72 65 61 74 65 64 20 62 79 20 61  was created by a
105c0 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20   process.    ** 
105d0 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79  working in no-sy
105e0 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65  nc mode. This me
105f0 61 6e 73 20 74 68 61 74 20 74 68 65 20 72 65 73  ans that the res
10600 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  t of the journal
10610 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e  .    ** file con
10620 73 69 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20  sists of pages, 
10630 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
10640 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
10650 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a  s. Compute.    *
10660 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
10670 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69  Rec based on thi
10680 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20  s assumption..  
10690 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65    */.    if( nRe
106a0 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b  c==0xffffffff ){
106b0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
106c0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
106d0 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  f==JOURNAL_HDR_S
106e0 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  Z(pPager) );.   
106f0 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
10700 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
10710 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c  pPager))/JOURNAL
10720 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  _PG_SZ(pPager);.
10730 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66      }..    /* If
10740 20 6e 52 65 63 20 69 73 20 30 20 61 6e 64 20 74   nRec is 0 and t
10750 68 69 73 20 72 6f 6c 6c 62 61 63 6b 20 69 73 20  his rollback is 
10760 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
10770 20 63 72 65 61 74 65 64 20 62 79 20 74 68 69 73   created by this
10780 0a 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 20  .    ** process 
10790 61 6e 64 20 69 66 20 74 68 69 73 20 69 73 20 74  and if this is t
107a0 68 65 20 66 69 6e 61 6c 20 68 65 61 64 65 72 20  he final header 
107b0 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  in the journal, 
107c0 74 68 65 6e 20 69 74 20 6d 65 61 6e 73 0a 20 20  then it means.  
107d0 20 20 2a 2a 20 74 68 61 74 20 74 68 69 73 20 70    ** that this p
107e0 61 72 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  art of the journ
107f0 61 6c 20 77 61 73 20 62 65 69 6e 67 20 66 69 6c  al was being fil
10800 6c 65 64 20 62 75 74 20 68 61 73 20 6e 6f 74 20  led but has not 
10810 79 65 74 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20  yet been.    ** 
10820 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e 20  synced to disk. 
10830 20 43 6f 6d 70 75 74 65 20 74 68 65 20 6e 75 6d   Compute the num
10840 62 65 72 20 6f 66 20 70 61 67 65 73 20 62 61 73  ber of pages bas
10850 65 64 20 6f 6e 20 74 68 65 20 72 65 6d 61 69 6e  ed on the remain
10860 69 6e 67 0a 20 20 20 20 2a 2a 20 73 69 7a 65 20  ing.    ** size 
10870 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20  of the file..   
10880 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 74   **.    ** The t
10890 68 69 72 64 20 74 65 72 6d 20 6f 66 20 74 68 65  hird term of the
108a0 20 74 65 73 74 20 77 61 73 20 61 64 64 65 64 20   test was added 
108b0 74 6f 20 66 69 78 20 74 69 63 6b 65 74 20 23 32  to fix ticket #2
108c0 35 36 35 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  565..    */.    
108d0 69 66 28 20 6e 52 65 63 3d 3d 30 20 26 26 20 21  if( nRec==0 && !
108e0 69 73 48 6f 74 20 26 26 0a 20 20 20 20 20 20 20  isHot &&.       
108f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10900 48 64 72 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Hdr+JOURNAL_HDR_
10910 53 5a 28 70 50 61 67 65 72 29 3d 3d 70 50 61 67  SZ(pPager)==pPag
10920 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
10930 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  {.      nRec = (
10940 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ - pPager->jo
10950 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55 52  urnalOff) / JOUR
10960 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72  NAL_PG_SZ(pPager
10970 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
10980 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
10990 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61  first header rea
109a0 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
109b0 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65  al, truncate the
109c0 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65  .    ** database
109d0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74   file back to it
109e0 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
109f0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10a00 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10a10 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ff==JOURNAL_HDR_
10a20 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20  SZ(pPager) ){.  
10a30 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74      rc = pager_t
10a40 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
10a50 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28  mxPg);.      if(
10a60 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10a70 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  {.        goto e
10a80 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
10a90 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
10aa0 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c  /* Copy original
10ab0 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68   pages out of th
10ac0 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  e journal and ba
10ad0 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61  ck into the data
10ae0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
10af0 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
10b00 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
10b10 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
10b20 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
10b30 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e  pPager, pPager->
10b40 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
10b50 72 6e 61 6c 4f 66 66 2c 20 31 29 3b 0a 20 20 20  rnalOff, 1);.   
10b60 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
10b70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
10b80 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44  if( rc==SQLITE_D
10b90 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ONE ){.         
10ba0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
10bb0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
10bc0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
10bd0 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62  szJ;.          b
10be0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
10bf0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67  lse{.          g
10c00 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
10c10 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10c20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
10c30 2f 2a 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20  /*NOTREACHED*/. 
10c40 20 61 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65   assert( 0 );..e
10c50 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  nd_playback:.  i
10c60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10c70 20 29 7b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20   ){.    zMaster 
10c80 3d 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70  = pPager->pTmpSp
10c90 61 63 65 3b 0a 20 20 20 20 72 63 20 3d 20 72 65  ace;.    rc = re
10ca0 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
10cb0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
10cc0 73 74 65 72 2c 20 70 50 61 67 65 72 2d 3e 70 56  ster, pPager->pV
10cd0 66 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 2b 31  fs->mxPathname+1
10ce0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
10cf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
10d00 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64    rc = pager_end
10d10 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61  _transaction(pPa
10d20 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
10d30 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
10d40 20 7a 4d 61 73 74 65 72 5b 30 5d 20 29 7b 0a 20   zMaster[0] ){. 
10d50 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
10d60 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
10d70 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
10d80 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
10d90 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
10da0 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
10db0 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
10dc0 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
10dd0 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
10de0 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61  rc = pager_delma
10df0 73 74 65 72 28 70 50 61 67 65 72 2c 20 7a 4d 61  ster(pPager, zMa
10e00 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  ster);.  }..  /*
10e10 20 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f   The Pager.secto
10e20 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d  rSize variable m
10e30 61 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64  ay have been upd
10e40 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69  ated while rolli
10e50 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a  ng.  ** back a j
10e60 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62  ournal created b
10e70 79 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68  y a process with
10e80 20 61 20 64 69 66 66 65 72 65 6e 74 20 73 65 63   a different sec
10e90 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20 76 61  tor size.  ** va
10ea0 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
10eb0 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
10ec0 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
10ed0 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65 74 53  ess..  */.  setS
10ee0 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72  ectorSize(pPager
10ef0 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
10f00 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
10f10 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
10f20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
10f30 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
10f40 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
10f50 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
10f60 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
10f70 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
10f80 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
10f90 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
10fa0 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
10fb0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
10fc0 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
10fd0 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
10fe0 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
10ff0 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
11000 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
11010 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
11020 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
11030 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
11040 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
11050 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
11060 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
11070 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
11080 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
11090 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
110a0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
110b0 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
110c0 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
110d0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
110e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
110f0 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
11100 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
11110 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11130 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
11140 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
11150 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
11160 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
11170 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
11180 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
11190 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
111a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
111b0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
111c0 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
111d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
111e0 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
111f0 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
11200 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
11210 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
11220 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  ze(pPager->jfd, 
11230 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66  &os_szJ);.    if
11240 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11250 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
11260 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73   assert( szJ==os
11270 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64  _szJ );.  }.#end
11280 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72  if..  /* Set hdr
11290 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66  Off to be the of
112a0 66 73 65 74 20 6a 75 73 74 20 61 66 74 65 72 20  fset just after 
112b0 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6c  the end of the l
112c0 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a  ast journal.  **
112d0 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 62 65   page written be
112e0 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 6a  fore the first j
112f0 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20 66 6f  ournal-header fo
11300 72 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74  r this statement
11310 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f  .  ** transactio
11320 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c 20 6f  n was written, o
11330 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
11340 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72   file if no jour
11350 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65 72 20  nal.  ** header 
11360 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a  was written..  *
11370 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70 50 61  /.  hdrOff = pPa
11380 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b  ger->stmtHdrOff;
11390 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
113a0 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21  r->fullSync || !
113b0 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66 28 20  hdrOff );.  if( 
113c0 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 68  !hdrOff ){.    h
113d0 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d  drOff = szJ;.  }
113e0 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74  .  .  /* Truncat
113f0 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  e the database b
11400 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69  ack to its origi
11410 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20  nal size..  */. 
11420 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e   rc = pager_trun
11430 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50 61  cate(pPager, pPa
11440 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a  ger->stmtSize);.
11450 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11460 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53  ->state>=PAGER_S
11470 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a 20 46  HARED );..  /* F
11480 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61  igure out how ma
11490 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69  ny records are i
114a0 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  n the statement 
114b0 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20  journal..  */.  
114c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
114d0 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61  stmtInUse && pPa
114e0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
114f0 20 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70 50 61   );.  nRec = pPa
11500 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20  ger->stmtNRec;. 
11510 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67   .  /* Copy orig
11520 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
11530 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  f the statement 
11540 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
11550 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64   into the.  ** d
11560 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
11570 6f 74 65 20 74 68 61 74 20 74 68 65 20 73 74 61  ote that the sta
11580 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f  tement journal o
11590 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73 20 66  mits checksums f
115a0 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20 72 65  rom.  ** each re
115b0 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77 65 72  cord since power
115c0 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76 65 72  -failure recover
115d0 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61  y is not importa
115e0 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a  nt to statement.
115f0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20    ** journals.. 
11600 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
11610 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nRec; i++){.   
11620 20 69 36 34 20 6f 66 66 73 65 74 20 3d 20 69 2a   i64 offset = i*
11630 28 34 2b 70 50 61 67 65 72 2d 3e 70 61 67 65 53  (4+pPager->pageS
11640 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ize);.    rc = p
11650 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
11660 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 70  e_page(pPager, p
11670 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 6f 66 66  Pager->stfd, off
11680 73 65 74 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  set, 0);.    ass
11690 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
116a0 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
116b0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
116c0 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
116d0 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
116e0 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
116f0 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
11700 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
11710 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
11720 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
11730 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
11740 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
11750 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
11760 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
11770 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
11780 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
11790 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
117a0 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
117b0 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
117c0 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
117d0 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
117e0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
117f0 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
11800 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
11810 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
11820 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
11830 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
11840 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
11850 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
11860 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
11870 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
11880 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11890 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73  lOff = pPager->s
118a0 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67  tmtJSize;.  pPag
118b0 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20  er->cksumInit = 
118c0 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75  pPager->stmtCksu
118d0 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67  m;.  while( pPag
118e0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
118f0 20 68 64 72 4f 66 66 20 29 7b 0a 20 20 20 20 72   hdrOff ){.    r
11900 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
11910 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
11920 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c  er, pPager->jfd,
11930 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
11940 4f 66 66 2c 20 31 29 3b 0a 20 20 20 20 61 73 73  Off, 1);.    ass
11950 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11960 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
11970 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
11980 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
11990 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77  ayback;.  }..  w
119a0 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f  hile( pPager->jo
119b0 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29  urnalOff < szJ )
119c0 7b 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b  {.    u32 nJRec;
119d0 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
119e0 65 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65  er of Journal Re
119f0 63 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32  cords */.    u32
11a00 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d   dummy;.    rc =
11a10 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
11a20 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a  pPager, szJ, &nJ
11a30 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20  Rec, &dummy);.  
11a40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11a50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73  _OK ){.      ass
11a60 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
11a70 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f  DONE );.      go
11a80 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
11a90 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  back;.    }.    
11aa0 69 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a  if( nJRec==0 ){.
11ab0 20 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73        nJRec = (s
11ac0 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
11ad0 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
11ae0 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
11af0 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11b00 3d 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26  =nJRec-1; i>=0 &
11b10 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
11b20 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29  lOff < szJ; i--)
11b30 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
11b40 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
11b50 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
11b60 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
11b70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 31 29  ->journalOff, 1)
11b80 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
11b90 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
11ba0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
11bb0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
11bc0 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
11bd0 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ack;.    }.  }..
11be0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
11bf0 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65  lOff = szJ;.  .e
11c00 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
11c10 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  :.  if( rc==SQLI
11c20 54 45 5f 4f 4b 29 20 7b 0a 20 20 20 20 70 50 61  TE_OK) {.    pPa
11c30 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
11c40 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70 61  = szJ;.    /* pa
11c50 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
11c60 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 7d  (pPager); */.  }
11c70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
11c80 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68  ./*.** Change th
11c90 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72  e maximum number
11ca0 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
11cb0 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c 6c  ges that are all
11cc0 6f 77 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  owed..*/.void sq
11cd0 6c 69 74 65 33 50 61 67 65 72 53 65 74 43 61 63  lite3PagerSetCac
11ce0 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  hesize(Pager *pP
11cf0 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65  ager, int mxPage
11d00 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e  ){.  if( mxPage>
11d10 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  10 ){.    pPager
11d20 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61 67  ->mxPage = mxPag
11d30 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  e;.  }else{.    
11d40 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
11d50 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   10;.  }.}../*.*
11d60 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f 62  * Adjust the rob
11d70 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20 64  ustness of the d
11d80 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61 67  atabase to damag
11d90 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61 73  e due to OS cras
11da0 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72 20  hes.** or power 
11db0 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61 6e  failures by chan
11dc0 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72 20  ging the number 
11dd0 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65 6e  of syncs()s when
11de0 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65 20   writing.** the 
11df0 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
11e00 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68 72  .  There are thr
11e10 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a  ee levels:.**.**
11e20 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73 71      OFF       sq
11e30 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69 73  lite3OsSync() is
11e40 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20 20   never called.  
11e50 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66 61  This is the defa
11e60 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ult.**          
11e70 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61 72      for temporar
11e80 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74 20  y and transient 
11e90 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  files..**.**    
11ea0 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a 6f  NORMAL    The jo
11eb0 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20  urnal is synced 
11ec0 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  once before writ
11ed0 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
11ee0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
11ef0 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73 20  database.  This 
11f00 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65 71  is normally adeq
11f10 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e 2c  uate protection,
11f20 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20 20   but.**         
11f30 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f 72       it is theor
11f40 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62 6c  etically possibl
11f50 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20 75  e, though very u
11f60 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20 20  nlikely,.**     
11f70 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61 6e           that an
11f80 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77 65   inopertune powe
11f90 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
11fa0 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e 61  leave the journa
11fb0 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  l.**            
11fc0 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68 69    in a state whi
11fd0 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20 64  ch would cause d
11fe0 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  amage to the dat
11ff0 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20 20  abase.**        
12000 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69 73        when it is
12010 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a   rolled back..**
12020 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20 20  .**    FULL     
12030 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
12040 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65 66  synced twice bef
12050 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
12060 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
12070 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
12080 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64 69   (with some addi
12090 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69  tional informati
120a0 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66 69  on - the nRec fi
120b0 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  eld.**          
120c0 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e      of the journ
120d0 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69 6e  al header - bein
120e0 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65 74  g written in bet
120f0 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a 20  ween the two.** 
12100 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e               syn
12110 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73 75  cs).  If we assu
12120 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67 20  me that writing 
12130 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  a.**            
12140 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73 65    single disk se
12150 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c 20  ctor is atomic, 
12160 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20 70  then this mode p
12170 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20 20  rovides.**      
12180 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e 63          assuranc
12190 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e  e that the journ
121a0 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20 63  al will not be c
121b0 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65 0a  orrupted to the.
121c0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
121d0 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e 67  point of causing
121e0 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64   damage to the d
121f0 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20 72  atabase during r
12200 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e  ollback..**.** N
12210 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61 73  umeric values as
12220 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
12230 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20 4f  ese states are O
12240 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c  FF==1, NORMAL=2,
12250 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a  .** and FULL=3..
12260 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
12270 45 5f 4f 4d 49 54 5f 50 41 47 45 52 5f 50 52 41  E_OMIT_PAGER_PRA
12280 47 4d 41 53 0a 76 6f 69 64 20 73 71 6c 69 74 65  GMAS.void sqlite
12290 33 50 61 67 65 72 53 65 74 53 61 66 65 74 79 4c  3PagerSetSafetyL
122a0 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67  evel(Pager *pPag
122b0 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 2c 20 69  er, int level, i
122c0 6e 74 20 66 75 6c 6c 5f 66 73 79 6e 63 29 7b 0a  nt full_fsync){.
122d0 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
122e0 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20   =  level==1 || 
122f0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
12300 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
12310 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20  Sync = level==3 
12320 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
12330 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e  File;.  pPager->
12340 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 28 66 75  sync_flags = (fu
12350 6c 6c 5f 66 73 79 6e 63 3f 53 51 4c 49 54 45 5f  ll_fsync?SQLITE_
12360 53 59 4e 43 5f 46 55 4c 4c 3a 53 51 4c 49 54 45  SYNC_FULL:SQLITE
12370 5f 53 59 4e 43 5f 4e 4f 52 4d 41 4c 29 3b 0a 20  _SYNC_NORMAL);. 
12380 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
12390 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
123a0 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65  edSync = 0;.}.#e
123b0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
123c0 66 6f 6c 6c 6f 77 69 6e 67 20 67 6c 6f 62 61 6c  following global
123d0 20 76 61 72 69 61 62 6c 65 20 69 73 20 69 6e 63   variable is inc
123e0 72 65 6d 65 6e 74 65 64 20 77 68 65 6e 65 76 65  remented wheneve
123f0 72 20 74 68 65 20 6c 69 62 72 61 72 79 0a 2a 2a  r the library.**
12400 20 61 74 74 65 6d 70 74 73 20 74 6f 20 6f 70 65   attempts to ope
12410 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69  n a temporary fi
12420 6c 65 2e 20 20 54 68 69 73 20 69 6e 66 6f 72 6d  le.  This inform
12430 61 74 69 6f 6e 20 69 73 20 75 73 65 64 20 66 6f  ation is used fo
12440 72 0a 2a 2a 20 74 65 73 74 69 6e 67 20 61 6e 64  r.** testing and
12450 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 2e 20   analysis only. 
12460 20 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49   .*/.#ifdef SQLI
12470 54 45 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69  TE_TEST.int sqli
12480 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63 6f 75  te3_opentemp_cou
12490 6e 74 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a  nt = 0;.#endif..
124a0 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d  /*.** Open a tem
124b0 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 0a 2a 2a  porary file. .**
124c0 0a 2a 2a 20 57 72 69 74 65 20 74 68 65 20 66 69  .** Write the fi
124d0 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
124e0 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
124f0 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
12500 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
12510 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
12520 20 69 66 20 77 65 20 66 61 69 6c 2e 20 54 68 65   if we fail. The
12530 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74   OS will automat
12540 69 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68  ically delete th
12550 65 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  e temporary.** f
12560 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 20 63  ile when it is c
12570 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  losed..*/.static
12580 20 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65   int sqlite3Page
12590 72 4f 70 65 6e 74 65 6d 70 28 0a 20 20 73 71 6c  rOpentemp(.  sql
125a0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 2c 20  ite3_vfs *pVfs, 
125b0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
125c0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 6c 61  l file system la
125d0 79 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  yer */.  sqlite3
125e0 5f 66 69 6c 65 20 2a 70 46 69 6c 65 2c 20 20 2f  _file *pFile,  /
125f0 2a 20 57 72 69 74 65 20 74 68 65 20 66 69 6c 65  * Write the file
12600 20 64 65 73 63 72 69 70 74 6f 72 20 68 65 72 65   descriptor here
12610 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69 6c   */.  char *zFil
12620 65 6e 61 6d 65 2c 20 20 20 20 20 20 2f 2a 20 4e  ename,      /* N
12630 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65 2e  ame of the file.
12640 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20    Might be NULL 
12650 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61 67  */.  int vfsFlag
12660 73 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6c  s          /* Fl
12670 61 67 73 20 70 61 73 73 65 64 20 74 68 72 6f 75  ags passed throu
12680 67 68 20 74 6f 20 74 68 65 20 56 46 53 20 2a 2f  gh to the VFS */
12690 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
126a0 61 73 73 65 72 74 28 20 7a 46 69 6c 65 6e 61 6d  assert( zFilenam
126b0 65 21 3d 30 20 29 3b 0a 0a 23 69 66 64 65 66 20  e!=0 );..#ifdef 
126c0 53 51 4c 49 54 45 5f 54 45 53 54 0a 20 20 73 71  SQLITE_TEST.  sq
126d0 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d 70 5f 63  lite3_opentemp_c
126e0 6f 75 6e 74 2b 2b 3b 20 20 2f 2a 20 55 73 65 64  ount++;  /* Used
126f0 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
12700 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c 79 20 2a   analysis only *
12710 2f 0a 23 65 6e 64 69 66 0a 0a 20 20 76 66 73 46  /.#endif..  vfsF
12720 6c 61 67 73 20 7c 3d 20 20 53 51 4c 49 54 45 5f  lags |=  SQLITE_
12730 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 20 7c  OPEN_READWRITE |
12740 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45   SQLITE_OPEN_CRE
12750 41 54 45 20 7c 0a 20 20 20 20 20 20 20 20 20 20  ATE |.          
12760 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 45 58    SQLITE_OPEN_EX
12770 43 4c 55 53 49 56 45 20 7c 20 53 51 4c 49 54 45  CLUSIVE | SQLITE
12780 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f 4e 43 4c  _OPEN_DELETEONCL
12790 4f 53 45 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  OSE;.  rc = sqli
127a0 74 65 33 4f 73 4f 70 65 6e 28 70 56 66 73 2c 20  te3OsOpen(pVfs, 
127b0 7a 46 69 6c 65 6e 61 6d 65 2c 20 70 46 69 6c 65  zFilename, pFile
127c0 2c 20 76 66 73 46 6c 61 67 73 2c 20 30 29 3b 0a  , vfsFlags, 0);.
127d0 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
127e0 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 46 69 6c 65  LITE_OK || pFile
127f0 2d 3e 70 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20  ->pMethods );.  
12800 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
12810 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
12820 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
12830 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
12840 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
12850 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
12860 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
12870 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
12880 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
12890 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
128a0 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
128b0 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
128c0 50 61 67 65 72 47 65 74 28 29 20 61 6e 64 20 69  PagerGet() and i
128d0 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
128e0 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
128f0 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
12900 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
12910 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e 0a 2a  3PagerUnref()..*
12920 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
12930 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61  e is NULL then a
12940 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20   randomly-named 
12950 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69  temporary file i
12960 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64  s created.** and
12970 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c   used as the fil
12980 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20  e to be cached. 
12990 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62   The file will b
129a0 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74  e deleted.** aut
129b0 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20  omatically when 
129c0 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a  it is closed..**
129d0 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
129e0 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74   is ":memory:" t
129f0 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74  hen all informat
12a00 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63  ion is held in c
12a10 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e  ache..** It is n
12a20 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20  ever written to 
12a30 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20  disk.  This can 
12a40 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65  be used to imple
12a50 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65  ment an.** in-me
12a60 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
12a70 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
12a80 65 72 4f 70 65 6e 28 0a 20 20 73 71 6c 69 74 65  erOpen(.  sqlite
12a90 33 5f 76 66 73 20 2a 70 56 66 73 2c 20 20 20 20  3_vfs *pVfs,    
12aa0 20 20 20 2f 2a 20 54 68 65 20 76 69 72 74 75 61     /* The virtua
12ab0 6c 20 66 69 6c 65 20 73 79 73 74 65 6d 20 74 6f  l file system to
12ac0 20 75 73 65 20 2a 2f 0a 20 20 50 61 67 65 72 20   use */.  Pager 
12ad0 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
12ae0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
12af0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
12b00 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
12b10 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
12b20 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
12b30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12b40 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
12b50 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
12b60 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
12b70 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
12b80 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
12b90 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 66 6c 61  age */.  int fla
12ba0 67 73 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  gs,             
12bb0 20 20 2f 2a 20 66 6c 61 67 73 20 63 6f 6e 74 72    /* flags contr
12bc0 6f 6c 6c 69 6e 67 20 74 68 69 73 20 66 69 6c 65  olling this file
12bd0 20 2a 2f 0a 20 20 69 6e 74 20 76 66 73 46 6c 61   */.  int vfsFla
12be0 67 73 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  gs             /
12bf0 2a 20 66 6c 61 67 73 20 70 61 73 73 65 64 20 74  * flags passed t
12c00 68 72 6f 75 67 68 20 74 6f 20 73 71 6c 69 74 65  hrough to sqlite
12c10 33 5f 76 66 73 2e 78 4f 70 65 6e 28 29 20 2a 2f  3_vfs.xOpen() */
12c20 0a 29 7b 0a 20 20 75 38 20 2a 70 50 74 72 3b 0a  .){.  u8 *pPtr;.
12c30 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
12c40 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  = 0;.  int rc = 
12c50 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
12c60 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70 46 69   i;.  int tempFi
12c70 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65  le = 0;.  int me
12c80 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  mDb = 0;.  int r
12c90 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 69  eadOnly = 0;.  i
12ca0 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20  nt useJournal = 
12cb0 28 66 6c 61 67 73 20 26 20 50 41 47 45 52 5f 4f  (flags & PAGER_O
12cc0 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d 30 3b  MIT_JOURNAL)==0;
12cd0 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c 6f 63  .  int noReadloc
12ce0 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47  k = (flags & PAG
12cf0 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b 29 21  ER_NO_READLOCK)!
12d00 3d 30 3b 0a 20 20 69 6e 74 20 6a 6f 75 72 6e 61  =0;.  int journa
12d10 6c 46 69 6c 65 53 69 7a 65 20 3d 20 73 71 6c 69  lFileSize = sqli
12d20 74 65 33 4a 6f 75 72 6e 61 6c 53 69 7a 65 28 70  te3JournalSize(p
12d30 56 66 73 29 3b 0a 20 20 69 6e 74 20 6e 44 65 66  Vfs);.  int nDef
12d40 61 75 6c 74 50 61 67 65 20 3d 20 53 51 4c 49 54  aultPage = SQLIT
12d50 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
12d60 49 5a 45 3b 0a 20 20 63 68 61 72 20 2a 7a 50 61  IZE;.  char *zPa
12d70 74 68 6e 61 6d 65 3b 0a 20 20 69 6e 74 20 6e 50  thname;.  int nP
12d80 61 74 68 6e 61 6d 65 3b 0a 0a 20 20 2f 2a 20 54  athname;..  /* T
12d90 68 65 20 64 65 66 61 75 6c 74 20 72 65 74 75 72  he default retur
12da0 6e 20 69 73 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  n is a NULL poin
12db0 74 65 72 20 2a 2f 0a 20 20 2a 70 70 50 61 67 65  ter */.  *ppPage
12dc0 72 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 43 6f 6d  r = 0;..  /* Com
12dd0 70 75 74 65 20 74 68 65 20 66 75 6c 6c 20 70 61  pute the full pa
12de0 74 68 6e 61 6d 65 20 2a 2f 0a 20 20 6e 50 61 74  thname */.  nPat
12df0 68 6e 61 6d 65 20 3d 20 70 56 66 73 2d 3e 6d 78  hname = pVfs->mx
12e00 50 61 74 68 6e 61 6d 65 2b 31 3b 0a 20 20 7a 50  Pathname+1;.  zP
12e10 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
12e20 33 5f 6d 61 6c 6c 6f 63 28 6e 50 61 74 68 6e 61  3_malloc(nPathna
12e30 6d 65 29 3b 0a 20 20 69 66 28 20 7a 50 61 74 68  me);.  if( zPath
12e40 6e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72  name==0 ){.    r
12e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
12e60 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
12e70 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
12e80 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
12e90 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
12ea0 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
12eb0 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
12ec0 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
12ed0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
12ee0 20 31 3b 0a 20 20 20 20 20 20 7a 50 61 74 68 6e   1;.      zPathn
12ef0 61 6d 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20  ame[0] = 0;.    
12f00 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
12f10 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
12f20 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
12f30 61 6d 65 28 70 56 66 73 2c 20 7a 46 69 6c 65 6e  ame(pVfs, zFilen
12f40 61 6d 65 2c 20 6e 50 61 74 68 6e 61 6d 65 2c 20  ame, nPathname, 
12f50 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  zPathname);.    
12f60 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
12f70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 47 65 74  c = sqlite3OsGet
12f80 54 65 6d 70 6e 61 6d 65 28 70 56 66 73 2c 20 6e  Tempname(pVfs, n
12f90 50 61 74 68 6e 61 6d 65 2c 20 7a 50 61 74 68 6e  Pathname, zPathn
12fa0 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ame);.  }.  if( 
12fb0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12fc0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
12fd0 65 28 7a 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  e(zPathname);.  
12fe0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12ff0 0a 20 20 6e 50 61 74 68 6e 61 6d 65 20 3d 20 73  .  nPathname = s
13000 74 72 6c 65 6e 28 7a 50 61 74 68 6e 61 6d 65 29  trlen(zPathname)
13010 3b 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65  ;..  /* Allocate
13020 20 6d 65 6d 6f 72 79 20 66 6f 72 20 74 68 65 20   memory for the 
13030 70 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  pager structure 
13040 2a 2f 0a 20 20 70 50 61 67 65 72 20 3d 20 73 71  */.  pPager = sq
13050 6c 69 74 65 33 4d 61 6c 6c 6f 63 5a 65 72 6f 28  lite3MallocZero(
13060 0a 20 20 20 20 73 69 7a 65 6f 66 28 2a 70 50 61  .    sizeof(*pPa
13070 67 65 72 29 20 2b 20 20 20 20 20 20 20 20 20 20  ger) +          
13080 20 2f 2a 20 50 61 67 65 72 20 73 74 72 75 63 74   /* Pager struct
13090 75 72 65 20 2a 2f 0a 20 20 20 20 6a 6f 75 72 6e  ure */.    journ
130a0 61 6c 46 69 6c 65 53 69 7a 65 20 2b 20 20 20 20  alFileSize +    
130b0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6a 6f         /* The jo
130c0 75 72 6e 61 6c 20 66 69 6c 65 20 73 74 72 75 63  urnal file struc
130d0 74 75 72 65 20 2a 2f 20 0a 20 20 20 20 70 56 66  ture */ .    pVf
130e0 73 2d 3e 73 7a 4f 73 46 69 6c 65 20 2a 20 33 20  s->szOsFile * 3 
130f0 2b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  +        /* The 
13100 6d 61 69 6e 20 64 62 20 61 6e 64 20 74 77 6f 20  main db and two 
13110 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f  journal files */
13120 20 0a 20 20 20 20 34 2a 6e 50 61 74 68 6e 61 6d   .    4*nPathnam
13130 65 20 2b 20 34 30 20 20 20 20 20 20 20 20 20 20  e + 40          
13140 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65 2c 20    /* zFilename, 
13150 7a 44 69 72 65 63 74 6f 72 79 2c 20 7a 4a 6f 75  zDirectory, zJou
13160 72 6e 61 6c 2c 20 7a 53 74 6d 74 4a 72 6e 6c 20  rnal, zStmtJrnl 
13170 2a 2f 0a 20 20 29 3b 0a 20 20 69 66 28 20 21 70  */.  );.  if( !p
13180 50 61 67 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Pager ){.    sql
13190 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 68 6e  ite3_free(zPathn
131a0 61 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ame);.    return
131b0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
131c0 20 7d 0a 20 20 70 50 74 72 20 3d 20 28 75 38 20   }.  pPtr = (u8 
131d0 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20  *)&pPager[1];.  
131e0 70 50 61 67 65 72 2d 3e 76 66 73 46 6c 61 67 73  pPager->vfsFlags
131f0 20 3d 20 76 66 73 46 6c 61 67 73 3b 0a 20 20 70   = vfsFlags;.  p
13200 50 61 67 65 72 2d 3e 66 64 20 3d 20 28 73 71 6c  Pager->fd = (sql
13210 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74 72  ite3_file*)&pPtr
13220 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 2a  [pVfs->szOsFile*
13230 30 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  0];.  pPager->st
13240 66 64 20 3d 20 28 73 71 6c 69 74 65 33 5f 66 69  fd = (sqlite3_fi
13250 6c 65 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e  le*)&pPtr[pVfs->
13260 73 7a 4f 73 46 69 6c 65 2a 31 5d 3b 0a 20 20 70  szOsFile*1];.  p
13270 50 61 67 65 72 2d 3e 6a 66 64 20 3d 20 28 73 71  Pager->jfd = (sq
13280 6c 69 74 65 33 5f 66 69 6c 65 2a 29 26 70 50 74  lite3_file*)&pPt
13290 72 5b 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65  r[pVfs->szOsFile
132a0 2a 32 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a  *2];.  pPager->z
132b0 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72  Filename = (char
132c0 2a 29 26 70 50 74 72 5b 70 56 66 73 2d 3e 73 7a  *)&pPtr[pVfs->sz
132d0 4f 73 46 69 6c 65 2a 32 2b 6a 6f 75 72 6e 61 6c  OsFile*2+journal
132e0 46 69 6c 65 53 69 7a 65 5d 3b 0a 20 20 70 50 61  FileSize];.  pPa
132f0 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 20  ger->zDirectory 
13300 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65  = &pPager->zFile
13310 6e 61 6d 65 5b 6e 50 61 74 68 6e 61 6d 65 2b 31  name[nPathname+1
13320 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
13330 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
13340 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 50 61 74  >zDirectory[nPat
13350 68 6e 61 6d 65 2b 31 5d 3b 0a 20 20 70 50 61 67  hname+1];.  pPag
13360 65 72 2d 3e 7a 53 74 6d 74 4a 72 6e 6c 20 3d 20  er->zStmtJrnl = 
13370 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  &pPager->zJourna
13380 6c 5b 6e 50 61 74 68 6e 61 6d 65 2b 31 30 5d 3b  l[nPathname+10];
13390 0a 20 20 70 50 61 67 65 72 2d 3e 70 56 66 73 20  .  pPager->pVfs 
133a0 3d 20 70 56 66 73 3b 0a 20 20 6d 65 6d 63 70 79  = pVfs;.  memcpy
133b0 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
133c0 6d 65 2c 20 7a 50 61 74 68 6e 61 6d 65 2c 20 6e  me, zPathname, n
133d0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 73  Pathname+1);.  s
133e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74  qlite3_free(zPat
133f0 68 6e 61 6d 65 29 3b 0a 0a 20 20 2f 2a 20 4f 70  hname);..  /* Op
13400 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
13410 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46  e..  */.  if( zF
13420 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
13430 6e 61 6d 65 5b 30 5d 20 26 26 20 21 6d 65 6d 44  name[0] && !memD
13440 62 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 50 61  b ){.    if( nPa
13450 74 68 6e 61 6d 65 3e 28 70 56 66 73 2d 3e 6d 78  thname>(pVfs->mx
13460 50 61 74 68 6e 61 6d 65 20 2d 20 73 69 7a 65 6f  Pathname - sizeo
13470 66 28 22 2d 6a 6f 75 72 6e 61 6c 22 29 29 20 29  f("-journal")) )
13480 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13490 49 54 45 5f 43 41 4e 54 4f 50 45 4e 3b 0a 20 20  ITE_CANTOPEN;.  
134a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
134b0 6e 74 20 66 6f 75 74 20 3d 20 30 3b 0a 20 20 20  nt fout = 0;.   
134c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
134d0 73 4f 70 65 6e 28 70 56 66 73 2c 20 70 50 61 67  sOpen(pVfs, pPag
134e0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 70  er->zFilename, p
134f0 50 61 67 65 72 2d 3e 66 64 2c 0a 20 20 20 20 20  Pager->fd,.     
13500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13510 20 20 20 20 70 50 61 67 65 72 2d 3e 76 66 73 46      pPager->vfsF
13520 6c 61 67 73 2c 20 26 66 6f 75 74 29 3b 0a 20 20  lags, &fout);.  
13530 20 20 20 20 72 65 61 64 4f 6e 6c 79 20 3d 20 28      readOnly = (
13540 66 6f 75 74 26 53 51 4c 49 54 45 5f 4f 50 45 4e  fout&SQLITE_OPEN
13550 5f 52 45 41 44 4f 4e 4c 59 29 3b 0a 0a 20 20 20  _READONLY);..   
13560 20 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c     /* If the fil
13570 65 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c  e was successful
13580 6c 79 20 6f 70 65 6e 65 64 20 66 6f 72 20 72 65  ly opened for re
13590 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2c  ad/write access,
135a0 0a 20 20 20 20 20 20 2a 2a 20 63 68 6f 6f 73 65  .      ** choose
135b0 20 61 20 64 65 66 61 75 6c 74 20 70 61 67 65 20   a default page 
135c0 73 69 7a 65 20 69 6e 20 63 61 73 65 20 77 65 20  size in case we 
135d0 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 74  have to create t
135e0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
135f0 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65 20 64  base file. The d
13600 65 66 61 75 6c 74 20 70 61 67 65 20 73 69 7a 65  efault page size
13610 20 69 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20   is the maximum 
13620 6f 66 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  of:.      **.   
13630 20 20 20 2a 2a 20 20 20 20 2b 20 53 51 4c 49 54     **    + SQLIT
13640 45 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  E_DEFAULT_PAGE_S
13650 49 5a 45 2c 0a 20 20 20 20 20 20 2a 2a 20 20 20  IZE,.      **   
13660 20 2b 20 54 68 65 20 76 61 6c 75 65 20 72 65 74   + The value ret
13670 75 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 33  urned by sqlite3
13680 4f 73 53 65 63 74 6f 72 53 69 7a 65 28 29 0a 20  OsSectorSize(). 
13690 20 20 20 20 20 2a 2a 20 20 20 20 2b 20 54 68 65       **    + The
136a0 20 6c 61 72 67 65 73 74 20 70 61 67 65 20 73 69   largest page si
136b0 7a 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 77  ze that can be w
136c0 72 69 74 74 65 6e 20 61 74 6f 6d 69 63 61 6c 6c  ritten atomicall
136d0 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  y..      */.    
136e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
136f0 5f 4f 4b 20 26 26 20 21 72 65 61 64 4f 6e 6c 79  _OK && !readOnly
13700 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
13710 69 53 65 63 74 6f 72 53 69 7a 65 20 3d 20 73 71  iSectorSize = sq
13720 6c 69 74 65 33 4f 73 53 65 63 74 6f 72 53 69 7a  lite3OsSectorSiz
13730 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  e(pPager->fd);. 
13740 20 20 20 20 20 20 20 69 66 28 20 6e 44 65 66 61         if( nDefa
13750 75 6c 74 50 61 67 65 3c 69 53 65 63 74 6f 72 53  ultPage<iSectorS
13760 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
13770 20 6e 44 65 66 61 75 6c 74 50 61 67 65 20 3d 20   nDefaultPage = 
13780 69 53 65 63 74 6f 72 53 69 7a 65 3b 0a 20 20 20  iSectorSize;.   
13790 20 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51       }.#ifdef SQ
137a0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f 4d  LITE_ENABLE_ATOM
137b0 49 43 5f 57 52 49 54 45 0a 20 20 20 20 20 20 20  IC_WRITE.       
137c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74   {.          int
137d0 20 69 44 63 20 3d 20 73 71 6c 69 74 65 33 4f 73   iDc = sqlite3Os
137e0 44 65 76 69 63 65 43 68 61 72 61 63 74 65 72 69  DeviceCharacteri
137f0 73 74 69 63 73 28 70 50 61 67 65 72 2d 3e 66 64  stics(pPager->fd
13800 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
13810 20 69 69 3b 0a 20 20 20 20 20 20 20 20 20 20 61   ii;.          a
13820 73 73 65 72 74 28 53 51 4c 49 54 45 5f 49 4f 43  ssert(SQLITE_IOC
13830 41 50 5f 41 54 4f 4d 49 43 35 31 32 3d 3d 28 35  AP_ATOMIC512==(5
13840 31 32 3e 3e 38 29 29 3b 0a 20 20 20 20 20 20 20  12>>8));.       
13850 20 20 20 61 73 73 65 72 74 28 53 51 4c 49 54 45     assert(SQLITE
13860 5f 49 4f 43 41 50 5f 41 54 4f 4d 49 43 36 34 4b  _IOCAP_ATOMIC64K
13870 3d 3d 28 36 35 35 33 36 3e 3e 38 29 29 3b 0a 20  ==(65536>>8));. 
13880 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13890 53 51 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55  SQLITE_MAX_DEFAU
138a0 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3c 3d 36 35  LT_PAGE_SIZE<=65
138b0 35 33 36 29 3b 0a 20 20 20 20 20 20 20 20 20 20  536);.          
138c0 66 6f 72 28 69 69 3d 6e 44 65 66 61 75 6c 74 50  for(ii=nDefaultP
138d0 61 67 65 3b 20 69 69 3c 3d 53 51 4c 49 54 45 5f  age; ii<=SQLITE_
138e0 4d 41 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45  MAX_DEFAULT_PAGE
138f0 5f 53 49 5a 45 3b 20 69 69 3d 69 69 2a 32 29 7b  _SIZE; ii=ii*2){
13900 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
13910 20 69 44 63 26 28 53 51 4c 49 54 45 5f 49 4f 43   iDc&(SQLITE_IOC
13920 41 50 5f 41 54 4f 4d 49 43 7c 28 69 69 3e 3e 38  AP_ATOMIC|(ii>>8
13930 29 29 20 29 20 6e 44 65 66 61 75 6c 74 50 61 67  )) ) nDefaultPag
13940 65 20 3d 20 69 69 3b 0a 20 20 20 20 20 20 20 20  e = ii;.        
13950 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65    }.        }.#e
13960 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28  ndif.        if(
13970 20 6e 44 65 66 61 75 6c 74 50 61 67 65 3e 53 51   nDefaultPage>SQ
13980 4c 49 54 45 5f 4d 41 58 5f 44 45 46 41 55 4c 54  LITE_MAX_DEFAULT
13990 5f 50 41 47 45 5f 53 49 5a 45 20 29 7b 0a 20 20  _PAGE_SIZE ){.  
139a0 20 20 20 20 20 20 20 20 6e 44 65 66 61 75 6c 74          nDefault
139b0 50 61 67 65 20 3d 20 53 51 4c 49 54 45 5f 4d 41  Page = SQLITE_MA
139c0 58 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53  X_DEFAULT_PAGE_S
139d0 49 5a 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  IZE;.        }. 
139e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
139f0 65 6c 73 65 20 69 66 28 20 21 6d 65 6d 44 62 20  else if( !memDb 
13a00 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 74  ){.    /* If a t
13a10 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
13a20 20 72 65 71 75 65 73 74 65 64 2c 20 69 74 20 69   requested, it i
13a30 73 20 6e 6f 74 20 6f 70 65 6e 65 64 20 69 6d 6d  s not opened imm
13a40 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
13a50 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 77 65   In this case we
13a60 20 61 63 63 65 70 74 20 74 68 65 20 64 65 66 61   accept the defa
13a70 75 6c 74 20 70 61 67 65 20 73 69 7a 65 20 61 6e  ult page size an
13a80 64 20 64 65 6c 61 79 20 61 63 74 75 61 6c 6c 79  d delay actually
13a90 0a 20 20 20 20 2a 2a 20 6f 70 65 6e 69 6e 67 20  .    ** opening 
13aa0 74 68 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 74  the file until t
13ab0 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74 6f  he first call to
13ac0 20 4f 73 57 72 69 74 65 28 29 2e 0a 20 20 20 20   OsWrite()..    
13ad0 2a 2f 20 0a 20 20 20 20 74 65 6d 70 46 69 6c 65  */ .    tempFile
13ae0 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72   = 1;.    pPager
13af0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
13b00 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 7d 0a 0a  EXCLUSIVE;.  }..
13b10 20 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20    if( pPager && 
13b20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
13b30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d  .    pPager->pTm
13b40 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20 2a  pSpace = (char *
13b50 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28  )sqlite3_malloc(
13b60 6e 44 65 66 61 75 6c 74 50 61 67 65 29 3b 0a 20  nDefaultPage);. 
13b70 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65   }..  /* If an e
13b80 72 72 6f 72 20 6f 63 63 75 72 65 64 20 69 6e 20  rror occured in 
13b90 65 69 74 68 65 72 20 6f 66 20 74 68 65 20 62 6c  either of the bl
13ba0 6f 63 6b 73 20 61 62 6f 76 65 2e 0a 20 20 2a 2a  ocks above..  **
13bb0 20 46 72 65 65 20 74 68 65 20 50 61 67 65 72 20   Free the Pager 
13bc0 73 74 72 75 63 74 75 72 65 20 61 6e 64 20 63 6c  structure and cl
13bd0 6f 73 65 20 74 68 65 20 66 69 6c 65 2e 0a 20 20  ose the file..  
13be0 2a 2a 20 53 69 6e 63 65 20 74 68 65 20 70 61 67  ** Since the pag
13bf0 65 72 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 63 61  er is not alloca
13c00 74 65 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ted there is no 
13c10 6e 65 65 64 20 74 6f 20 73 65 74 20 0a 20 20 2a  need to set .  *
13c20 2a 20 61 6e 79 20 50 61 67 65 72 2e 65 72 72 4d  * any Pager.errM
13c30 61 73 6b 20 76 61 72 69 61 62 6c 65 73 2e 0a 20  ask variables.. 
13c40 20 2a 2f 0a 20 20 69 66 28 20 21 70 50 61 67 65   */.  if( !pPage
13c50 72 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 70 54  r || !pPager->pT
13c60 6d 70 53 70 61 63 65 20 29 7b 0a 20 20 20 20 73  mpSpace ){.    s
13c70 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 70 50  qlite3OsClose(pP
13c80 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 73  ager->fd);.    s
13c90 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
13ca0 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
13cb0 28 28 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29  ((rc==SQLITE_OK)
13cc0 3f 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63  ?SQLITE_NOMEM:rc
13cd0 29 3b 0a 20 20 7d 0a 0a 20 20 50 41 47 45 52 54  );.  }..  PAGERT
13ce0 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
13cf0 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
13d00 49 44 28 70 50 61 67 65 72 2d 3e 66 64 29 2c 20  ID(pPager->fd), 
13d10 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
13d20 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  e);.  IOTRACE(("
13d30 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20 70  OPEN %p %s\n", p
13d40 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 7a  Pager, pPager->z
13d50 46 69 6c 65 6e 61 6d 65 29 29 0a 0a 20 20 2f 2a  Filename))..  /*
13d60 20 46 69 6c 6c 20 69 6e 20 50 61 67 65 72 2e 7a   Fill in Pager.z
13d70 44 69 72 65 63 74 6f 72 79 5b 5d 20 2a 2f 0a 20  Directory[] */. 
13d80 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13d90 7a 44 69 72 65 63 74 6f 72 79 2c 20 70 50 61 67  zDirectory, pPag
13da0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e  er->zFilename, n
13db0 50 61 74 68 6e 61 6d 65 2b 31 29 3b 0a 20 20 66  Pathname+1);.  f
13dc0 6f 72 28 69 3d 73 74 72 6c 65 6e 28 70 50 61 67  or(i=strlen(pPag
13dd0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 29 3b  er->zDirectory);
13de0 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d 3e   i>0 && pPager->
13df0 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d 21  zDirectory[i-1]!
13e00 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  ='/'; i--){}.  i
13e10 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72 2d  f( i>0 ) pPager-
13e20 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
13e30 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 46 69 6c 6c   = 0;..  /* Fill
13e40 20 69 6e 20 50 61 67 65 72 2e 7a 4a 6f 75 72 6e   in Pager.zJourn
13e50 61 6c 5b 5d 20 61 6e 64 20 50 61 67 65 72 2e 7a  al[] and Pager.z
13e60 53 74 6d 74 4a 72 6e 6c 5b 5d 20 2a 2f 0a 20 20  StmtJrnl[] */.  
13e70 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  memcpy(pPager->z
13e80 4a 6f 75 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d  Journal, pPager-
13e90 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50 61 74  >zFilename, nPat
13ea0 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63 70 79  hname);.  memcpy
13eb0 28 26 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  (&pPager->zJourn
13ec0 61 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d 2c 20 22  al[nPathname], "
13ed0 2d 6a 6f 75 72 6e 61 6c 22 2c 20 39 29 3b 0a 20  -journal", 9);. 
13ee0 20 6d 65 6d 63 70 79 28 70 50 61 67 65 72 2d 3e   memcpy(pPager->
13ef0 7a 53 74 6d 74 4a 72 6e 6c 2c 20 70 50 61 67 65  zStmtJrnl, pPage
13f00 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c 20 6e 50  r->zFilename, nP
13f10 61 74 68 6e 61 6d 65 29 3b 0a 20 20 6d 65 6d 63  athname);.  memc
13f20 70 79 28 26 70 50 61 67 65 72 2d 3e 7a 53 74 6d  py(&pPager->zStm
13f30 74 4a 72 6e 6c 5b 6e 50 61 74 68 6e 61 6d 65 5d  tJrnl[nPathname]
13f40 2c 20 22 2d 73 74 6d 74 6a 72 6e 6c 22 2c 20 31  , "-stmtjrnl", 1
13f50 30 29 3b 0a 0a 20 20 2f 2a 20 70 50 61 67 65 72  0);..  /* pPager
13f60 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
13f70 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  0; */.  pPager->
13f80 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
13f90 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
13fa0 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52  b;.  pPager->noR
13fb0 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64  eadlock = noRead
13fc0 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79  lock && readOnly
13fd0 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
13fe0 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 20 2a 2f 0a  tmtOpen = 0; */.
13ff0 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 6d    /* pPager->stm
14000 74 49 6e 55 73 65 20 3d 20 30 3b 20 2a 2f 0a 20  tInUse = 0; */. 
14010 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 52 65 66   /* pPager->nRef
14020 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
14030 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
14040 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
14050 61 67 65 53 69 7a 65 20 3d 20 6e 44 65 66 61 75  ageSize = nDefau
14060 6c 74 50 61 67 65 3b 0a 20 20 2f 2a 20 70 50 61  ltPage;.  /* pPa
14070 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20  ger->stmtSize = 
14080 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
14090 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 30  r->stmtJSize = 0
140a0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
140b0 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f 0a  ->nPage = 0; */.
140c0 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
140d0 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
140e0 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49 54  ->mxPgno = SQLIT
140f0 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e 54  E_MAX_PAGE_COUNT
14100 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73  ;.  /* pPager->s
14110 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
14120 4f 43 4b 3b 20 2a 2f 0a 20 20 61 73 73 65 72 74  OCK; */.  assert
14130 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
14140 3d 3d 20 28 74 65 6d 70 46 69 6c 65 20 3f 20 50  == (tempFile ? P
14150 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 3a  AGER_EXCLUSIVE :
14160 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 29 20 29   PAGER_UNLOCK) )
14170 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 65  ;.  /* pPager->e
14180 72 72 4d 61 73 6b 20 3d 20 30 3b 20 2a 2f 0a 20  rrMask = 0; */. 
14190 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
141a0 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
141b0 61 73 73 65 72 74 28 20 74 65 6d 70 46 69 6c 65  assert( tempFile
141c0 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d  ==PAGER_LOCKINGM
141d0 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a 20 20 20 20  ODE_NORMAL .    
141e0 20 20 20 20 20 20 7c 7c 20 74 65 6d 70 46 69 6c        || tempFil
141f0 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47  e==PAGER_LOCKING
14200 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 20 29  MODE_EXCLUSIVE )
14210 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
14220 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f 45 58  R_LOCKINGMODE_EX
14230 43 4c 55 53 49 56 45 3d 3d 31 20 29 3b 0a 20 20  CLUSIVE==1 );.  
14240 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69 76  pPager->exclusiv
14250 65 4d 6f 64 65 20 3d 20 74 65 6d 70 46 69 6c 65  eMode = tempFile
14260 3b 20 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d  ; .  pPager->mem
14270 44 62 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50  Db = memDb;.  pP
14280 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d  ager->readOnly =
14290 20 72 65 61 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20   readOnly;.  /* 
142a0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
142b0 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61 67 65   = 0; */.  pPage
142c0 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67  r->noSync = pPag
142d0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20  er->tempFile || 
142e0 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70  !useJournal;.  p
142f0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
14300 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  = (pPager->noSyn
14310 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72  c?0:1);.  pPager
14320 2d 3e 73 79 6e 63 5f 66 6c 61 67 73 20 3d 20 53  ->sync_flags = S
14330 51 4c 49 54 45 5f 53 59 4e 43 5f 4e 4f 52 4d 41  QLITE_SYNC_NORMA
14340 4c 3b 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e  L;.  /* pPager->
14350 70 46 69 72 73 74 20 3d 20 30 3b 20 2a 2f 0a 20  pFirst = 0; */. 
14360 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 46 69 72   /* pPager->pFir
14370 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 20 2a 2f  stSynced = 0; */
14380 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 70 4c  .  /* pPager->pL
14390 61 73 74 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50  ast = 0; */.  pP
143a0 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d 20 46  ager->nExtra = F
143b0 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 6e  ORCE_ALIGNMENT(n
143c0 45 78 74 72 61 29 3b 0a 20 20 61 73 73 65 72 74  Extra);.  assert
143d0 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d 65  (pPager->fd->pMe
143e0 74 68 6f 64 73 7c 7c 6d 65 6d 44 62 7c 7c 74 65  thods||memDb||te
143f0 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 21  mpFile);.  if( !
14400 6d 65 6d 44 62 20 29 7b 0a 20 20 20 20 73 65 74  memDb ){.    set
14410 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67 65  SectorSize(pPage
14420 72 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61  r);.  }.  /* pPa
14430 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
14440 72 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d  r = 0; */.  /* m
14450 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61 48  emset(pPager->aH
14460 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  ash, 0, sizeof(p
14470 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b 20  Pager->aHash)); 
14480 2a 2f 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  */.  *ppPager = 
14490 70 50 61 67 65 72 3b 0a 23 69 66 64 65 66 20 53  pPager;.#ifdef S
144a0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
144b0 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
144c0 20 70 50 61 67 65 72 2d 3e 69 49 6e 55 73 65 4d   pPager->iInUseM
144d0 4d 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  M = 0;.  pPager-
144e0 3e 69 49 6e 55 73 65 44 42 20 3d 20 30 3b 0a 20  >iInUseDB = 0;. 
144f0 20 69 66 28 20 21 6d 65 6d 44 62 20 29 7b 0a 20   if( !memDb ){. 
14500 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78     sqlite3_mutex
14510 20 2a 6d 75 74 65 78 20 3d 20 73 71 6c 69 74 65   *mutex = sqlite
14520 33 5f 6d 75 74 65 78 5f 61 6c 6c 6f 63 28 53 51  3_mutex_alloc(SQ
14530 4c 49 54 45 5f 4d 55 54 45 58 5f 53 54 41 54 49  LITE_MUTEX_STATI
14540 43 5f 4d 45 4d 32 29 3b 0a 20 20 20 20 73 71 6c  C_MEM2);.    sql
14550 69 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72  ite3_mutex_enter
14560 28 6d 75 74 65 78 29 3b 0a 20 20 20 20 70 50 61  (mutex);.    pPa
14570 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 73 71 6c  ger->pNext = sql
14580 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 0a 20  ite3PagerList;. 
14590 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 50 61     if( sqlite3Pa
145a0 67 65 72 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  gerList ){.     
145b0 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
145c0 50 61 67 65 72 4c 69 73 74 2d 3e 70 50 72 65 76  PagerList->pPrev
145d0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ==0 );.      sql
145e0 69 74 65 33 50 61 67 65 72 4c 69 73 74 2d 3e 70  ite3PagerList->p
145f0 50 72 65 76 20 3d 20 70 50 61 67 65 72 3b 0a 20  Prev = pPager;. 
14600 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
14610 3e 70 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20  >pPrev = 0;.    
14620 73 71 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74  sqlite3PagerList
14630 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20 73   = pPager;.    s
14640 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65 61  qlite3_mutex_lea
14650 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a 23  ve(mutex);.  }.#
14660 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 53  endif.  return S
14670 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
14680 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73 79 20  ** Set the busy 
14690 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69 6f 6e  handler function
146a0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
146b0 33 50 61 67 65 72 53 65 74 42 75 73 79 68 61 6e  3PagerSetBusyhan
146c0 64 6c 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  dler(Pager *pPag
146d0 65 72 2c 20 42 75 73 79 48 61 6e 64 6c 65 72 20  er, BusyHandler 
146e0 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a  *pBusyHandler){.
146f0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
14700 61 6e 64 6c 65 72 20 3d 20 70 42 75 73 79 48 61  andler = pBusyHa
14710 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ndler;.}../*.** 
14720 53 65 74 20 74 68 65 20 64 65 73 74 72 75 63 74  Set the destruct
14730 6f 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  or for this page
14740 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
14750 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
14760 69 73 20 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65  is called.** whe
14770 6e 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  n the reference 
14780 63 6f 75 6e 74 20 6f 6e 20 65 61 63 68 20 70 61  count on each pa
14790 67 65 20 72 65 61 63 68 65 73 20 7a 65 72 6f 2e  ge reaches zero.
147a0 20 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72    The destructor
147b0 20 63 61 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20   can.** be used 
147c0 74 6f 20 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f  to clean up info
147d0 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 65  rmation in the e
147e0 78 74 72 61 20 73 65 67 6d 65 6e 74 20 61 70 70  xtra segment app
147f0 65 6e 64 65 64 20 74 6f 20 65 61 63 68 20 70 61  ended to each pa
14800 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65  ge..**.** The de
14810 73 74 72 75 63 74 6f 72 20 69 73 20 6e 6f 74 20  structor is not 
14820 63 61 6c 6c 65 64 20 61 73 20 61 20 72 65 73 75  called as a resu
14830 6c 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 43  lt sqlite3PagerC
14840 6c 6f 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73  lose().  .** Des
14850 74 72 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c  tructors are onl
14860 79 20 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69  y called by sqli
14870 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 29 2e  te3PagerUnref().
14880 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
14890 50 61 67 65 72 53 65 74 44 65 73 74 72 75 63 74  PagerSetDestruct
148a0 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
148b0 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
148c0 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a 20  DbPage*,int)){. 
148d0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
148e0 63 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a  ctor = xDesc;.}.
148f0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72  ./*.** Set the r
14900 65 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72  einitializer for
14910 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
14920 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72   not NULL, the r
14930 65 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20  einitializer.** 
14940 69 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74  is called when t
14950 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20  he content of a 
14960 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73  page in cache is
14970 20 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73   restored to its
14980 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c   original.** val
14990 75 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f  ue as a result o
149a0 66 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54  f a rollback.  T
149b0 68 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65  he callback give
149c0 73 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63  s higher-level c
149d0 6f 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74  ode.** an opport
149e0 75 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65  unity to restore
149f0 20 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69   the EXTRA secti
14a00 6f 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68  on to agree with
14a10 20 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a   the restored.**
14a20 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76   page data..*/.v
14a30 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
14a40 53 65 74 52 65 69 6e 69 74 65 72 28 50 61 67 65  SetReiniter(Page
14a50 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
14a60 28 2a 78 52 65 69 6e 69 74 29 28 44 62 50 61 67  (*xReinit)(DbPag
14a70 65 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67  e*,int)){.  pPag
14a80 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20  er->xReiniter = 
14a90 78 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a  xReinit;.}../*.*
14aa0 2a 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73  * Set the page s
14ab0 69 7a 65 20 74 6f 20 2a 70 50 61 67 65 53 69 7a  ize to *pPageSiz
14ac0 65 2e 20 49 66 20 74 68 65 20 73 75 67 67 65 73  e. If the sugges
14ad0 74 20 6e 65 77 20 70 61 67 65 20 73 69 7a 65 20  t new page size 
14ae0 69 73 0a 2a 2a 20 69 6e 61 70 70 72 6f 70 72 69  is.** inappropri
14af0 61 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74  ate, then an alt
14b00 65 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69  ernative page si
14b10 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68 61  ze is set to tha
14b20 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 66 6f 72  t.** value befor
14b30 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
14b40 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
14b50 53 65 74 50 61 67 65 73 69 7a 65 28 50 61 67 65  SetPagesize(Page
14b60 72 20 2a 70 50 61 67 65 72 2c 20 75 31 36 20 2a  r *pPager, u16 *
14b70 70 50 61 67 65 53 69 7a 65 29 7b 0a 20 20 69 6e  pPageSize){.  in
14b80 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14b90 3b 0a 20 20 75 31 36 20 70 61 67 65 53 69 7a 65  ;.  u16 pageSize
14ba0 20 3d 20 2a 70 50 61 67 65 53 69 7a 65 3b 0a 20   = *pPageSize;. 
14bb0 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
14bc0 65 3d 3d 30 20 7c 7c 20 28 70 61 67 65 53 69 7a  e==0 || (pageSiz
14bd0 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
14be0 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
14bf0 41 47 45 5f 53 49 5a 45 29 20 29 3b 0a 20 20 69  AGE_SIZE) );.  i
14c00 66 28 20 70 61 67 65 53 69 7a 65 20 26 26 20 70  f( pageSize && p
14c10 61 67 65 53 69 7a 65 21 3d 70 50 61 67 65 72 2d  ageSize!=pPager-
14c20 3e 70 61 67 65 53 69 7a 65 20 0a 20 20 20 26 26  >pageSize .   &&
14c30 20 21 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20   !pPager->memDb 
14c40 26 26 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  && pPager->nRef=
14c50 3d 30 20 0a 20 20 29 7b 0a 20 20 20 20 63 68 61  =0 .  ){.    cha
14c60 72 20 2a 70 4e 65 77 20 3d 20 28 63 68 61 72 20  r *pNew = (char 
14c70 2a 29 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  *)sqlite3_malloc
14c80 28 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  (pageSize);.    
14c90 69 66 28 20 21 70 4e 65 77 20 29 7b 0a 20 20 20  if( !pNew ){.   
14ca0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e     rc = SQLITE_N
14cb0 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  OMEM;.    }else{
14cc0 0a 20 20 20 20 20 20 70 61 67 65 72 45 6e 74 65  .      pagerEnte
14cd0 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  r(pPager);.     
14ce0 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
14cf0 67 65 72 29 3b 0a 20 20 20 20 20 20 70 50 61 67  ger);.      pPag
14d00 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
14d10 61 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 73  ageSize;.      s
14d20 65 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61  etSectorSize(pPa
14d30 67 65 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ger);.      sqli
14d40 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
14d50 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 20  >pTmpSpace);.   
14d60 20 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53     pPager->pTmpS
14d70 70 61 63 65 20 3d 20 70 4e 65 77 3b 0a 20 20 20  pace = pNew;.   
14d80 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50     pagerLeave(pP
14d90 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ager);.    }.  }
14da0 0a 20 20 2a 70 50 61 67 65 53 69 7a 65 20 3d 20  .  *pPageSize = 
14db0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14dc0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
14dd0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  ../*.** Return a
14de0 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14df0 22 74 65 6d 70 6f 72 61 72 79 20 70 61 67 65 22  "temporary page"
14e00 20 62 75 66 66 65 72 20 68 65 6c 64 20 69 6e 74   buffer held int
14e10 65 72 6e 61 6c 6c 79 0a 2a 2a 20 62 79 20 74 68  ernally.** by th
14e20 65 20 70 61 67 65 72 2e 20 20 54 68 69 73 20 69  e pager.  This i
14e30 73 20 61 20 62 75 66 66 65 72 20 74 68 61 74 20  s a buffer that 
14e40 69 73 20 62 69 67 20 65 6e 6f 75 67 68 20 74 6f  is big enough to
14e50 20 68 6f 6c 64 20 74 68 65 0a 2a 2a 20 65 6e 74   hold the.** ent
14e60 69 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61  ire content of a
14e70 20 64 61 74 61 62 61 73 65 20 70 61 67 65 2e 20   database page. 
14e80 20 54 68 69 73 20 62 75 66 66 65 72 20 69 73 20   This buffer is 
14e90 75 73 65 64 20 69 6e 74 65 72 6e 61 6c 6c 79 0a  used internally.
14ea0 2a 2a 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  ** during rollba
14eb0 63 6b 20 61 6e 64 20 77 69 6c 6c 20 62 65 20 6f  ck and will be o
14ec0 76 65 72 77 72 69 74 74 65 6e 20 77 68 65 6e 65  verwritten whene
14ed0 76 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 0a 2a  ver a rollback.*
14ee0 2a 20 6f 63 63 75 72 73 2e 20 20 42 75 74 20 6f  * occurs.  But o
14ef0 74 68 65 72 20 6d 6f 64 75 6c 65 73 20 61 72 65  ther modules are
14f00 20 66 72 65 65 20 74 6f 20 75 73 65 20 69 74 20   free to use it 
14f10 74 6f 6f 2c 20 61 73 20 6c 6f 6e 67 20 61 73 0a  too, as long as.
14f20 2a 2a 20 6e 6f 20 72 6f 6c 6c 62 61 63 6b 73 20  ** no rollbacks 
14f30 61 72 65 20 68 61 70 70 65 6e 69 6e 67 2e 0a 2a  are happening..*
14f40 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 50  /.void *sqlite3P
14f50 61 67 65 72 54 65 6d 70 53 70 61 63 65 28 50 61  agerTempSpace(Pa
14f60 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14f70 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70  return pPager->p
14f80 54 6d 70 53 70 61 63 65 3b 0a 7d 0a 0a 2f 2a 0a  TmpSpace;.}../*.
14f90 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65  ** Attempt to se
14fa0 74 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61  t the maximum da
14fb0 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e  tabase page coun
14fc0 74 20 69 66 20 6d 78 50 61 67 65 20 69 73 20 70  t if mxPage is p
14fd0 6f 73 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b  ositive. .** Mak
14fe0 65 20 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20  e no changes if 
14ff0 6d 78 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f  mxPage is zero o
15000 72 20 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64  r negative.  And
15010 20 6e 65 76 65 72 20 72 65 64 75 63 65 20 74 68   never reduce th
15020 65 0a 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67  e.** maximum pag
15030 65 20 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68  e count below th
15040 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
15050 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a  f the database..
15060 2a 2a 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73  **.** Regardless
15070 20 6f 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75   of mxPage, retu
15080 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  rn the current m
15090 61 78 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e  aximum page coun
150a0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
150b0 33 50 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75  3PagerMaxPageCou
150c0 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
150d0 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
150e0 20 69 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b   if( mxPage>0 ){
150f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
15100 67 6e 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  gno = mxPage;.  
15110 7d 0a 20 20 73 71 6c 69 74 65 33 50 61 67 65 72  }.  sqlite3Pager
15120 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
15130 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  );.  return pPag
15140 65 72 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f  er->mxPgno;.}../
15150 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
15160 6e 67 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e  ng set of routin
15170 65 73 20 61 72 65 20 75 73 65 64 20 74 6f 20 64  es are used to d
15180 69 73 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c  isable the simul
15190 61 74 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f  ated.** I/O erro
151a0 72 20 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68  r mechanism.  Th
151b0 65 73 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65  ese routines are
151c0 20 75 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73   used to avoid s
151d0 69 6d 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f  imulated.** erro
151e0 72 73 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65  rs in places whe
151f0 72 65 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  re we do not car
15200 65 20 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a  e about errors..
15210 2a 2a 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53  **.** Unless -DS
15220 51 4c 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20  QLITE_TEST=1 is 
15230 75 73 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74  used, these rout
15240 69 6e 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d  ines are all no-
15250 6f 70 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72  ops.** and gener
15260 61 74 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a  ate no code..*/.
15270 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45  #ifdef SQLITE_TE
15280 53 54 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71  ST.extern int sq
15290 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70  lite3_io_error_p
152a0 65 6e 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69  ending;.extern i
152b0 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72  nt sqlite3_io_er
152c0 72 6f 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20  ror_hit;.static 
152d0 69 6e 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76  int saved_cnt;.v
152e0 6f 69 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75  oid disable_simu
152f0 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
15300 76 6f 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63  void){.  saved_c
15310 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f  nt = sqlite3_io_
15320 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20  error_pending;. 
15330 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
15340 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a  r_pending = -1;.
15350 7d 0a 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69  }.void enable_si
15360 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
15370 73 28 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74  s(void){.  sqlit
15380 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
15390 69 6e 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b  ing = saved_cnt;
153a0 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
153b0 65 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  e disable_simula
153c0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a  ted_io_errors().
153d0 23 20 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f  # define enable_
153e0 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
153f0 6f 72 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ors().#endif../*
15400 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72  .** Read the fir
15410 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20  st N bytes from 
15420 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  the beginning of
15430 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d   the file into m
15440 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44  emory.** that pD
15450 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a  est points to. .
15460 2a 2a 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63  **.** No error c
15470 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e  hecking is done.
15480 20 54 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f   The rational fo
15490 72 20 74 68 69 73 20 69 73 20 74 68 61 74 20 74  r this is that t
154a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a  his function .**
154b0 20 6d 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65   may be called e
154c0 76 65 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20  ven if the file 
154d0 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f  does not exist o
154e0 72 20 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64  r contain a head
154f0 65 72 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65  er. In .** these
15500 20 63 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73   cases sqlite3Os
15510 52 65 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75  Read() will retu
15520 72 6e 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20  rn an error, to 
15530 77 68 69 63 68 20 74 68 65 20 63 6f 72 72 65 63  which the correc
15540 74 20 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69  t .** response i
15550 73 20 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65  s to zero the me
15560 6d 6f 72 79 20 61 74 20 70 44 65 73 74 20 61 6e  mory at pDest an
15570 64 20 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72  d continue.  A r
15580 65 61 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a  eal IO error .**
15590 20 77 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79   will presumably
155a0 20 72 65 63 75 72 20 61 6e 64 20 62 65 20 70 69   recur and be pi
155b0 63 6b 65 64 20 75 70 20 6c 61 74 65 72 20 28 54  cked up later (T
155c0 6f 64 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74  odo: Think about
155d0 20 74 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73   this)..*/.int s
155e0 71 6c 69 74 65 33 50 61 67 65 72 52 65 61 64 46  qlite3PagerReadF
155f0 69 6c 65 68 65 61 64 65 72 28 50 61 67 65 72 20  ileheader(Pager 
15600 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20  *pPager, int N, 
15610 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
15620 44 65 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20  Dest){.  int rc 
15630 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d  = SQLITE_OK;.  m
15640 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20  emset(pDest, 0, 
15650 4e 29 3b 0a 20 20 61 73 73 65 72 74 28 4d 45 4d  N);.  assert(MEM
15660 44 42 7c 7c 70 50 61 67 65 72 2d 3e 66 64 2d 3e  DB||pPager->fd->
15670 70 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72  pMethods||pPager
15680 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69  ->tempFile);.  i
15690 66 28 20 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  f( pPager->fd->p
156a0 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 49  Methods ){.    I
156b0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
156c0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
156d0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
156e0 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
156f0 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
15700 20 4e 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   N, 0);.    if( 
15710 72 63 3d 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc==SQLITE_IOERR
15720 5f 53 48 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20  _SHORT_READ ){. 
15730 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15740 5f 4f 4b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  _OK;.    }.  }. 
15750 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15760 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
15770 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
15780 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
15790 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
157a0 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
157b0 2e 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  . .**.** If the 
157c0 50 45 4e 44 49 4e 47 5f 42 59 54 45 20 6c 69 65  PENDING_BYTE lie
157d0 73 20 6f 6e 20 74 68 65 20 70 61 67 65 20 64 69  s on the page di
157e0 72 65 63 74 6c 79 20 61 66 74 65 72 20 74 68 65  rectly after the
157f0 20 65 6e 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66   end of the.** f
15800 69 6c 65 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64  ile, then consid
15810 65 72 20 74 68 69 73 20 70 61 67 65 20 70 61 72  er this page par
15820 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 74 6f  t of the file to
15830 6f 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  o. For example, 
15840 69 66 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59  if.** PENDING_BY
15850 54 45 20 69 73 20 62 79 74 65 20 34 30 39 36 20  TE is byte 4096 
15860 28 74 68 65 20 66 69 72 73 74 20 62 79 74 65 20  (the first byte 
15870 6f 66 20 70 61 67 65 20 35 29 20 61 6e 64 20 74  of page 5) and t
15880 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a  he size of the.*
15890 2a 20 66 69 6c 65 20 69 73 20 34 30 39 36 20 62  * file is 4096 b
158a0 79 74 65 73 2c 20 35 20 69 73 20 72 65 74 75 72  ytes, 5 is retur
158b0 6e 65 64 20 69 6e 73 74 65 61 64 20 6f 66 20 34  ned instead of 4
158c0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
158d0 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 50  PagerPagecount(P
158e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
158f0 20 69 36 34 20 6e 20 3d 20 30 3b 0a 20 20 69 6e   i64 n = 0;.  in
15900 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
15910 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69  pPager!=0 );.  i
15920 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
15930 64 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  de ){.    return
15940 20 2d 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   -1;.  }.  if( p
15950 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
15960 20 29 7b 0a 20 20 20 20 6e 20 3d 20 70 50 61 67   ){.    n = pPag
15970 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 20  er->dbSize;.  } 
15980 65 6c 73 65 20 7b 0a 20 20 20 20 61 73 73 65 72  else {.    asser
15990 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d  t(pPager->fd->pM
159a0 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d 3e  ethods||pPager->
159b0 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 69  tempFile);.    i
159c0 66 28 20 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e  f( (pPager->fd->
159d0 70 4d 65 74 68 6f 64 73 29 0a 20 20 20 20 20 26  pMethods).     &
159e0 26 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  & (rc = sqlite3O
159f0 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72  sFileSize(pPager
15a00 2d 3e 66 64 2c 20 26 6e 29 29 21 3d 53 51 4c 49  ->fd, &n))!=SQLI
15a10 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
15a20 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
15a30 20 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72       pager_error
15a40 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
15a50 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
15a60 2d 2d 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  --;.      return
15a70 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69   -1;.    }.    i
15a80 66 28 20 6e 3e 30 20 26 26 20 6e 3c 70 50 61 67  f( n>0 && n<pPag
15a90 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
15aa0 20 20 20 20 20 20 6e 20 3d 20 31 3b 0a 20 20 20        n = 1;.   
15ab0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6e 20   }else{.      n 
15ac0 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
15ad0 69 7a 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ize;.    }.    i
15ae0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
15af0 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29  !=PAGER_UNLOCK )
15b00 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
15b10 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 20 20  dbSize = n;.    
15b20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3d 3d 28  }.  }.  if( n==(
15b30 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
15b40 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
15b50 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20  {.    n++;.  }. 
15b60 20 69 66 28 20 6e 3e 70 50 61 67 65 72 2d 3e 6d   if( n>pPager->m
15b70 78 50 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  xPgno ){.    pPa
15b80 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 6e 3b  ger->mxPgno = n;
15b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
15ba0 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  .}...#ifndef SQL
15bb0 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
15bc0 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20  B./*.** Clear a 
15bd0 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63 6b 0a  PgHistory block.
15be0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
15bf0 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67 48 69  learHistory(PgHi
15c00 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b 0a 20  story *pHist){. 
15c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48   sqlite3_free(pH
15c20 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
15c30 71 6c 69 74 65 33 5f 66 72 65 65 28 70 48 69 73  qlite3_free(pHis
15c40 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69  t->pStmt);.  pHi
15c50 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20  st->pOrig = 0;. 
15c60 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
15c70 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69  0;.}.#else.#defi
15c80 6e 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28  ne clearHistory(
15c90 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  x).#endif../*.**
15ca0 20 46 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61   Forward declara
15cb0 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  tion.*/.static i
15cc0 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
15cd0 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 55  ager*);../*.** U
15ce0 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69  nlink pPg from i
15cf0 74 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  ts hash chain. A
15d00 6c 73 6f 20 73 65 74 20 74 68 65 20 70 61 67 65  lso set the page
15d10 20 6e 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20   number to 0 to 
15d20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74  indicate.** that
15d30 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
15d40 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
15d50 68 20 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73  h chain. This is
15d60 20 72 65 71 75 69 72 65 64 20 62 65 63 61 75 73   required becaus
15d70 65 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33  e the.** sqlite3
15d80 50 61 67 65 72 4d 6f 76 65 70 61 67 65 28 29 20  PagerMovepage() 
15d90 72 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76  routine can leav
15da0 65 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  e a page in the 
15db0 0a 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50  .** pNextFree/pP
15dc0 72 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61  revFree list tha
15dd0 74 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20  t is not a part 
15de0 6f 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69  of any hash-chai
15df0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
15e00 64 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69  d unlinkHashChai
15e10 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  n(Pager *pPager,
15e20 20 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20   PgHdr *pPg){.  
15e30 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30  if( pPg->pgno==0
15e40 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
15e50 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d  pPg->pNextHash==
15e60 30 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48  0 && pPg->pPrevH
15e70 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65  ash==0 );.    re
15e80 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20  turn;.  }.  if( 
15e90 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
15ea0 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  {.    pPg->pNext
15eb0 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
15ec0 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68  = pPg->pPrevHash
15ed0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d  ;.  }.  if( pPg-
15ee0 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20  >pPrevHash ){.  
15ef0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15f00 2d 3e 61 48 61 73 68 5b 70 50 67 2d 3e 70 67 6e  ->aHash[pPg->pgn
15f10 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61  o & (pPager->nHa
15f20 73 68 2d 31 29 5d 21 3d 70 50 67 20 29 3b 0a 20  sh-1)]!=pPg );. 
15f30 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
15f40 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
15f50 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
15f60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
15f70 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 20 26 20  h = pPg->pgno & 
15f80 28 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 2d 31  (pPager->nHash-1
15f90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
15fa0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70  Hash[h] = pPg->p
15fb0 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20  NextHash;.  }.  
15fc0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
15fd0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 47   clearHistory(PG
15fe0 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
15ff0 20 70 50 61 67 65 72 29 29 3b 0a 20 20 7d 0a 20   pPager));.  }. 
16000 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a   pPg->pgno = 0;.
16010 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
16020 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
16030 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  h = 0;.}../*.** 
16040 55 6e 6c 69 6e 6b 20 61 20 70 61 67 65 20 66 72  Unlink a page fr
16050 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
16060 20 28 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c   (the list of al
16070 6c 20 70 61 67 65 73 20 77 68 65 72 65 20 6e 52  l pages where nR
16080 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72  ef==0).** and fr
16090 6f 6d 20 69 74 73 20 68 61 73 68 20 63 6f 6c 6c  om its hash coll
160a0 69 73 69 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a  ision chain..*/.
160b0 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
160c0 6e 6b 50 61 67 65 28 50 67 48 64 72 20 2a 70 50  nkPage(PgHdr *pP
160d0 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  g){.  Pager *pPa
160e0 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
160f0 72 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20  r;..  /* Unlink 
16100 66 72 6f 6d 20 66 72 65 65 20 70 61 67 65 20 6c  from free page l
16110 69 73 74 20 2a 2f 0a 20 20 6c 72 75 4c 69 73 74  ist */.  lruList
16120 52 65 6d 6f 76 65 28 70 50 67 29 3b 0a 0a 20 20  Remove(pPg);..  
16130 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
16140 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61 62  he pgno hash tab
16150 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  le */.  unlinkHa
16160 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
16170 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  pPg);.}../*.** T
16180 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
16190 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
161a0 74 68 65 20 63 61 63 68 65 20 77 68 65 6e 20 61  the cache when a
161b0 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69 73 20   database.** is 
161c0 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72 6f 70  truncated.  Drop
161d0 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68 65 20   from the cache 
161e0 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
161f0 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72 67 65  pgno is.** large
16200 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64  r than pPager->d
16210 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72  bSize and is unr
16220 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a 2a 2a  eferenced..**.**
16230 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
16240 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
16250 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
16260 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a 20 41   zeroed..**.** A
16270 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68 65 20  ctually, at the 
16280 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69  point this routi
16290 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 69 74  ne is called, it
162a0 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61 6e 20   would be.** an 
162b0 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20 61 20  error to have a 
162c0 72 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 2e  referenced page.
162d0 20 20 42 75 74 20 72 61 74 68 65 72 20 74 68 61    But rather tha
162e0 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68 61 74  n delete.** that
162f0 20 70 61 67 65 20 61 6e 64 20 67 75 61 72 61 6e   page and guaran
16300 74 65 65 20 61 20 73 75 62 73 65 71 75 65 6e 74  tee a subsequent
16310 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20 73 65   segfault, it se
16320 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20 74 6f  ems better.** to
16330 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68 6f 70   zero it and hop
16340 65 20 74 68 61 74 20 77 65 20 65 72 72 6f 72 20  e that we error 
16350 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f 0a 73  out sanely..*/.s
16360 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
16370 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
16380 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
16390 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
163a0 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20  PgHdr **ppPg;.  
163b0 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50 61  int dbSize = pPa
163c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
163d0 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d 3e  ppPg = &pPager->
163e0 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28  pAll;.  while( (
163f0 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30 20  pPg = *ppPg)!=0 
16400 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
16410 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a  pgno<=dbSize ){.
16420 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70 50        ppPg = &pP
16430 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
16440 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d 3e   }else if( pPg->
16450 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20 20  nRef>0 ){.      
16460 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
16470 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50  DATA(pPg), 0, pP
16480 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
16490 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
164a0 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
164b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a    }else{.      *
164c0 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78  ppPg = pPg->pNex
164d0 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f 54 52  tAll;.      IOTR
164e0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
164f0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
16500 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
16510 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c    PAGER_INCR(sql
16520 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66 72 65  ite3_pager_pgfre
16530 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20  e_count);.      
16540 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
16550 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
16560 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73 71 6c  (pPg);.      sql
16570 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70  ite3_free(pPg->p
16580 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
16590 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
165a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
165b0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
165c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
165d0 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
165e0 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
165f0 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
16600 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
16610 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
16620 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
16630 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
16640 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
16650 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
16660 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
16670 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
16680 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
16690 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
166a0 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
166b0 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
166c0 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
166d0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
166e0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
166f0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
16700 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
16710 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
16720 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
16730 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
16740 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
16750 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
16760 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
16770 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
16780 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
16790 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
167a0 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
167b0 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
167c0 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
167d0 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
167e0 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
167f0 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
16800 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
16810 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
16820 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
16830 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
16840 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
16850 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
16860 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20  0 || MEMDB );.. 
16870 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
16880 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
16890 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
168a0 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
168b0 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
168c0 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
168d0 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
168e0 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
168f0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
16900 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f  Y && sqlite3Invo
16910 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  keBusyHandler(pP
16920 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
16930 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  er) );.    if( r
16940 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
16950 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
16960 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
16970 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
16980 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
16990 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
169a0 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
169b0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
169c0 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
169d0 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
169e0 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
169f0 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
16a00 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
16a10 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
16a20 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
16a30 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
16a40 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
16a50 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
16a60 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69   MEMDB );.  sqli
16a70 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
16a80 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
16a90 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
16aa0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
16ab0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
16ac0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
16ad0 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
16ae0 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
16af0 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
16b00 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
16b10 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
16b20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
16b30 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
16b40 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
16b50 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
16b60 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
16b70 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70 61 67  TE_OK;.  }.  pag
16b80 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b  erEnter(pPager);
16b90 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
16ba0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 70  nal(pPager);.  p
16bb0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
16bc0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
16bd0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
16be0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
16bf0 2f 2a 20 47 65 74 20 61 6e 20 65 78 63 6c 75 73  /* Get an exclus
16c00 69 76 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ive lock on the 
16c10 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65 20  database before 
16c20 74 72 75 6e 63 61 74 69 6e 67 2e 20 2a 2f 0a 20  truncating. */. 
16c30 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
16c40 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61 67 65  er);.  rc = page
16c50 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
16c60 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
16c70 5f 4c 4f 43 4b 29 3b 0a 20 20 70 61 67 65 72 4c  _LOCK);.  pagerL
16c80 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
16c90 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
16ca0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
16cb0 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  rc;.  }..  rc = 
16cc0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
16cd0 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20  Pager, nPage);. 
16ce0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16cf0 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74 68  *.** Shutdown th
16d00 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20 46  e page cache.  F
16d10 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20 61  ree all memory a
16d20 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69 6c  nd close all fil
16d30 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20 74  es..**.** If a t
16d40 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 69  ransaction was i
16d50 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e 20  n progress when 
16d60 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
16d70 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a 20  called, that.** 
16d80 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 72  transaction is r
16d90 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c 6c  olled back.  All
16da0 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
16db0 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74  es are invalidat
16dc0 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72 20  ed.** and their 
16dd0 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64 2e  memory is freed.
16de0 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74 6f    Any attempt to
16df0 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73 6f   use a page asso
16e00 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20 74  ciated.** with t
16e10 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20 61  his page cache a
16e20 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74 69  fter this functi
16e30 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c 20  on returns will 
16e40 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c 74  likely.** result
16e50 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a   in a coredump..
16e60 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  **.** This funct
16e70 69 6f 6e 20 61 6c 77 61 79 73 20 73 75 63 63 65  ion always succe
16e80 65 64 73 2e 20 49 66 20 61 20 74 72 61 6e 73 61  eds. If a transa
16e90 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20  ction is active 
16ea0 61 6e 20 61 74 74 65 6d 70 74 0a 2a 2a 20 69 73  an attempt.** is
16eb0 20 6d 61 64 65 20 74 6f 20 72 6f 6c 6c 20 69 74   made to roll it
16ec0 20 62 61 63 6b 2e 20 49 66 20 61 6e 20 65 72 72   back. If an err
16ed0 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69 6e 67  or occurs during
16ee0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 0a 2a   the rollback .*
16ef0 2a 20 61 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * a hot journal 
16f00 6d 61 79 20 62 65 20 6c 65 66 74 20 69 6e 20 74  may be left in t
16f10 68 65 20 66 69 6c 65 73 79 73 74 65 6d 20 62 75  he filesystem bu
16f20 74 20 6e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  t no error is re
16f30 74 75 72 6e 65 64 0a 2a 2a 20 74 6f 20 74 68 65  turned.** to the
16f40 20 63 61 6c 6c 65 72 2e 0a 2a 2f 0a 69 6e 74 20   caller..*/.int 
16f50 73 71 6c 69 74 65 33 50 61 67 65 72 43 6c 6f 73  sqlite3PagerClos
16f60 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
16f70 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
16f80 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
16f90 4e 41 47 45 4d 45 4e 54 0a 20 20 69 66 28 20 21  NAGEMENT.  if( !
16fa0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 73 71 6c  MEMDB ){.    sql
16fb0 69 74 65 33 5f 6d 75 74 65 78 20 2a 6d 75 74 65  ite3_mutex *mute
16fc0 78 20 3d 20 73 71 6c 69 74 65 33 5f 6d 75 74 65  x = sqlite3_mute
16fd0 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d  x_alloc(SQLITE_M
16fe0 55 54 45 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32  UTEX_STATIC_MEM2
16ff0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6d  );.    sqlite3_m
17000 75 74 65 78 5f 65 6e 74 65 72 28 6d 75 74 65 78  utex_enter(mutex
17010 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  );.    if( pPage
17020 72 2d 3e 70 50 72 65 76 20 29 7b 0a 20 20 20 20  r->pPrev ){.    
17030 20 20 70 50 61 67 65 72 2d 3e 70 50 72 65 76 2d    pPager->pPrev-
17040 3e 70 4e 65 78 74 20 3d 20 70 50 61 67 65 72 2d  >pNext = pPager-
17050 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 65 6c 73  >pNext;.    }els
17060 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
17070 50 61 67 65 72 4c 69 73 74 20 3d 20 70 50 61 67  PagerList = pPag
17080 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  er->pNext;.    }
17090 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
170a0 3e 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20  >pNext ){.      
170b0 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 2d 3e 70  pPager->pNext->p
170c0 50 72 65 76 20 3d 20 70 50 61 67 65 72 2d 3e 70  Prev = pPager->p
170d0 50 72 65 76 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Prev;.    }.    
170e0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
170f0 61 76 65 28 6d 75 74 65 78 29 3b 0a 20 20 7d 0a  ave(mutex);.  }.
17100 23 65 6e 64 69 66 0a 0a 20 20 64 69 73 61 62 6c  #endif..  disabl
17110 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65  e_simulated_io_e
17120 72 72 6f 72 73 28 29 3b 0a 20 20 70 50 61 67 65  rrors();.  pPage
17130 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 30 3b 0a  r->errCode = 0;.
17140 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
17150 69 76 65 4d 6f 64 65 20 3d 20 30 3b 0a 20 20 70  iveMode = 0;.  p
17160 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
17170 72 29 3b 0a 20 20 70 61 67 65 72 55 6e 6c 6f 63  r);.  pagerUnloc
17180 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 70 50 61  kAndRollback(pPa
17190 67 65 72 29 3b 0a 20 20 65 6e 61 62 6c 65 5f 73  ger);.  enable_s
171a0 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f  imulated_io_erro
171b0 72 73 28 29 3b 0a 20 20 50 41 47 45 52 54 52 41  rs();.  PAGERTRA
171c0 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e 22  CE2("CLOSE %d\n"
171d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
171e0 29 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22  ));.  IOTRACE(("
171f0 43 4c 4f 53 45 20 25 70 5c 6e 22 2c 20 70 50 61  CLOSE %p\n", pPa
17200 67 65 72 29 29 0a 20 20 61 73 73 65 72 74 28 20  ger)).  assert( 
17210 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
17220 7c 7c 20 28 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || (pPager->jour
17230 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26 26 20 70 50  nalOpen==0 && pP
17240 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 3d 3d  ager->stmtOpen==
17250 30 29 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  0) );.  if( pPag
17260 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
17270 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
17280 43 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66  Close(pPager->jf
17290 64 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  d);.  }.  sqlite
172a0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
172b0 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
172c0 6c 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  l);.  if( pPager
172d0 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20  ->stmtOpen ){.  
172e0 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
172f0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  (pPager->stfd);.
17300 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 43    }.  sqlite3OsC
17310 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 66 64 29  lose(pPager->fd)
17320 3b 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65  ;.  /* Temp file
17330 73 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61  s are automatica
17340 6c 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74  lly deleted by t
17350 68 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70  he OS.  ** if( p
17360 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
17370 29 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65  ){.  **   sqlite
17380 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
17390 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  ->zFilename);.  
173a0 2a 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c  ** }.  */..  sql
173b0 69 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72  ite3_free(pPager
173c0 2d 3e 61 48 61 73 68 29 3b 0a 20 20 73 71 6c 69  ->aHash);.  sqli
173d0 74 65 33 5f 66 72 65 65 28 70 50 61 67 65 72 2d  te3_free(pPager-
173e0 3e 70 54 6d 70 53 70 61 63 65 29 3b 0a 20 20 73  >pTmpSpace);.  s
173f0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 50 61 67  qlite3_free(pPag
17400 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
17410 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 20  LITE_OK;.}..#if 
17420 21 64 65 66 69 6e 65 64 28 4e 44 45 42 55 47 29  !defined(NDEBUG)
17430 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49   || defined(SQLI
17440 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52  TE_TEST)./*.** R
17450 65 74 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e  eturn the page n
17460 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 67 69  umber for the gi
17470 76 65 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a  ven page data..*
17480 2f 0a 50 67 6e 6f 20 73 71 6c 69 74 65 33 50 61  /.Pgno sqlite3Pa
17490 67 65 72 50 61 67 65 6e 75 6d 62 65 72 28 44 62  gerPagenumber(Db
174a0 50 61 67 65 20 2a 70 29 7b 0a 20 20 72 65 74 75  Page *p){.  retu
174b0 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 23 65  rn p->pgno;.}.#e
174c0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
174d0 70 61 67 65 5f 72 65 66 28 29 20 66 75 6e 63 74  page_ref() funct
174e0 69 6f 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 74  ion increments t
174f0 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
17500 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a  nt for a page..*
17510 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73  * If the page is
17520 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
17530 65 20 66 72 65 65 6c 69 73 74 20 28 74 68 65 20  e freelist (the 
17540 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
17550 69 73 20 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a  is zero) then.**
17560 20 72 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20   remove it from 
17570 74 68 65 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a  the freelist..**
17580 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74  .** For non-test
17590 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
175a0 65 66 28 29 20 69 73 20 61 20 6d 61 63 72 6f 20  ef() is a macro 
175b0 74 68 61 74 20 63 61 6c 6c 73 20 5f 70 61 67 65  that calls _page
175c0 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65  _ref().** online
175d0 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
175e0 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e  e count is zero.
175f0 20 20 46 6f 72 20 74 65 73 74 20 73 79 73 74 65    For test syste
17600 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 0a 2a  ms, page_ref().*
17610 2a 20 69 73 20 61 20 72 65 61 6c 20 66 75 6e 63  * is a real func
17620 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 77 65 20  tion so that we 
17630 63 61 6e 20 73 65 74 20 62 72 65 61 6b 70 6f 69  can set breakpoi
17640 6e 74 73 20 61 6e 64 20 74 72 61 63 65 20 69 74  nts and trace it
17650 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17660 20 5f 70 61 67 65 5f 72 65 66 28 50 67 48 64 72   _page_ref(PgHdr
17670 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
17680 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
17690 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 69 73    /* The page is
176a0 20 63 75 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68   currently on th
176b0 65 20 66 72 65 65 6c 69 73 74 2e 20 20 52 65 6d  e freelist.  Rem
176c0 6f 76 65 20 69 74 2e 20 2a 2f 0a 20 20 20 20 6c  ove it. */.    l
176d0 72 75 4c 69 73 74 52 65 6d 6f 76 65 28 70 50 67  ruListRemove(pPg
176e0 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67  );.    pPg->pPag
176f0 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
17700 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 7d    pPg->nRef++;.}
17710 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
17720 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
17730 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
17740 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
17750 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
17760 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
17770 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
17780 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
17790 66 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  f++;.    }.  }.#
177a0 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61  else.# define pa
177b0 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50 29  ge_ref(P)   ((P)
177c0 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f  ->nRef==0?_page_
177d0 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29  ref(P):(void)(P)
177e0 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66  ->nRef++).#endif
177f0 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e  ../*.** Incremen
17800 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
17810 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65  count for a page
17820 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69  .  The input poi
17830 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66  nter is.** a ref
17840 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61  erence to the pa
17850 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20  ge data..*/.int 
17860 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66 28  sqlite3PagerRef(
17870 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20  DbPage *pPg){.  
17880 70 61 67 65 72 45 6e 74 65 72 28 70 50 67 2d 3e  pagerEnter(pPg->
17890 70 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 5f  pPager);.  page_
178a0 72 65 66 28 70 50 67 29 3b 0a 20 20 70 61 67 65  ref(pPg);.  page
178b0 72 4c 65 61 76 65 28 70 50 67 2d 3e 70 50 61 67  rLeave(pPg->pPag
178c0 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  er);.  return SQ
178d0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
178e0 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
178f0 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  al.  In other wo
17900 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61  rds, make sure a
17910 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74 68 61  ll the pages tha
17920 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77  t have.** been w
17930 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
17940 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61  urnal have actua
17950 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68 65 20  lly reached the 
17960 73 75 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a  surface of the.*
17970 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e  * disk.  It is n
17980 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66  ot safe to modif
17990 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  y the original d
179a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74  atabase file unt
179b0 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20  il after.** the 
179c0 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e  journal has been
179d0 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65   synced.  If the
179e0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
179f0 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62  se is modified b
17a00 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75  efore.** the jou
17a10 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61  rnal is synced a
17a20 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75  nd a power failu
17a30 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75  re occurs, the u
17a40 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a  nsynced journal.
17a50 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65  ** data would be
17a60 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75   lost and we wou
17a70 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20  ld be unable to 
17a80 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62  completely rollb
17a90 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62  ack the.** datab
17aa0 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61  ase changes.  Da
17ab0 74 61 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f  tabase corruptio
17ac0 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a  n would occur..*
17ad0 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  * .** This routi
17ae0 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20  ne also updates 
17af0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
17b00 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f 66 20  n the header of 
17b10 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20  the journal..** 
17b20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e  (See comments on
17b30 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62   the pager_playb
17b40 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f  ack() routine fo
17b50 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66  r additional inf
17b60 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66  ormation.).** If
17b70 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69   the sync mode i
17b80 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63  s FULL, two sync
17b90 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46  s will occur.  F
17ba0 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a  irst the whole j
17bb0 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e  ournal.** is syn
17bc0 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52  ced, then the nR
17bd0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
17be0 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f  ted, then a seco
17bf0 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a  nd sync occurs..
17c00 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72  **.** For tempor
17c10 61 72 79 20 64 61 74 61 62 61 73 65 73 2c 20 77  ary databases, w
17c20 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66  e do not care if
17c30 20 77 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20   we are able to 
17c40 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65  rollback.** afte
17c50 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72  r a power failur
17c60 65 2c 20 73 6f 20 6e 6f 20 73 79 6e 63 20 6f 63  e, so no sync oc
17c70 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  curs..**.** If t
17c80 68 65 20 49 4f 43 41 50 5f 53 45 51 55 45 4e 54  he IOCAP_SEQUENT
17c90 49 41 4c 20 66 6c 61 67 20 69 73 20 73 65 74 20  IAL flag is set 
17ca0 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
17cb0 6e 74 20 6d 65 64 69 61 20 6f 6e 20 77 68 69 63  nt media on whic
17cc0 68 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  h.** the databas
17cd0 65 20 69 73 20 73 74 6f 72 65 64 2c 20 74 68 65  e is stored, the
17ce0 6e 20 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65  n OsSync() is ne
17cf0 76 65 72 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  ver called on th
17d00 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
17d10 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  e. In this case 
17d20 61 6c 6c 20 74 68 61 74 20 69 73 20 72 65 71 75  all that is requ
17d30 69 72 65 64 20 69 73 20 74 6f 20 75 70 64 61 74  ired is to updat
17d40 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  e the nRec field
17d50 20 69 6e 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   in.** the journ
17d60 61 6c 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  al header..**.**
17d70 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6c   This routine cl
17d80 65 61 72 73 20 74 68 65 20 6e 65 65 64 53 79 6e  ears the needSyn
17d90 63 20 66 69 65 6c 64 20 6f 66 20 65 76 65 72 79  c field of every
17da0 20 70 61 67 65 20 63 75 72 72 65 6e 74 20 68 65   page current he
17db0 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e  ld in.** memory.
17dc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
17dd0 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
17de0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
17df0 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
17e00 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17e10 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 6a  .  /* Sync the j
17e20 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 6d 6f  ournal before mo
17e30 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61 69 6e  difying the main
17e40 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a 20 28   database.  ** (
17e50 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65 20 69  assuming there i
17e60 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  s a journal and 
17e70 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 73  it needs to be s
17e80 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20 20 69  ynced.).  */.  i
17e90 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  f( pPager->needS
17ea0 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28 20 21  ync ){.    if( !
17eb0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
17ec0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 44   ){.      int iD
17ed0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 44 65 76  c = sqlite3OsDev
17ee0 69 63 65 43 68 61 72 61 63 74 65 72 69 73 74 69  iceCharacteristi
17ef0 63 73 28 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  cs(pPager->fd);.
17f00 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
17f10 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17f20 6e 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 61  n );..      /* a
17f30 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
17f40 6e 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53  noSync ); // noS
17f50 79 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74  ync might be set
17f60 20 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a   if synchronous.
17f70 20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72        ** was tur
17f80 6e 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68  ned off after th
17f90 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61  e transaction wa
17fa0 73 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b  s started.  Tick
17fb0 65 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64  et #615 */.#ifnd
17fc0 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20  ef NDEBUG.      
17fd0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b  {.        /* Mak
17fe0 65 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65  e sure the pPage
17ff0 72 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20  r->nRec counter 
18000 77 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61  we are keeping a
18010 67 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  grees.        **
18020 20 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63   with the nRec c
18030 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65  omputed from the
18040 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
18050 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
18060 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36     */.        i6
18070 34 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72  4 jSz;.        r
18080 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
18090 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66  eSize(pPager->jf
180a0 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
180b0 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
180c0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
180d0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
180e0 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
180f0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
18100 69 66 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  if.      if( 0==
18110 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
18120 50 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29  P_SAFE_APPEND) )
18130 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
18140 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
18150 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
18160 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
18170 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
18180 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
18190 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
181a0 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
181b0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
181c0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
181d0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
181e0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
181f0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
18200 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
18210 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
18220 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
18230 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20  llback..        
18240 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  **.        ** Th
18250 69 73 20 69 73 20 6e 6f 74 20 72 65 71 75 69 72  is is not requir
18260 65 64 20 69 66 20 74 68 65 20 70 65 72 73 69 73  ed if the persis
18270 74 65 6e 74 20 6d 65 64 69 61 20 73 75 70 70 6f  tent media suppo
18280 72 74 73 20 74 68 65 0a 20 20 20 20 20 20 20 20  rts the.        
18290 2a 2a 20 53 41 46 45 5f 41 50 50 45 4e 44 20 70  ** SAFE_APPEND p
182a0 72 6f 70 65 72 74 79 2e 20 42 65 63 61 75 73 65  roperty. Because
182b0 20 69 6e 20 74 68 69 73 20 63 61 73 65 20 69 74   in this case it
182c0 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
182d0 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 66 6f 72   .        ** for
182e0 20 67 61 72 62 61 67 65 20 64 61 74 61 20 74 6f   garbage data to
182f0 20 62 65 20 61 70 70 65 6e 64 65 64 20 74 6f 20   be appended to 
18300 74 68 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 52  the file, the nR
18310 65 63 20 66 69 65 6c 64 0a 20 20 20 20 20 20 20  ec field.       
18320 20 2a 2a 20 69 73 20 70 6f 70 75 6c 61 74 65 64   ** is populated
18330 20 77 69 74 68 20 30 78 46 46 46 46 46 46 46 46   with 0xFFFFFFFF
18340 20 77 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   when the journa
18350 6c 20 68 65 61 64 65 72 20 69 73 20 77 72 69 74  l header is writ
18360 74 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ten.        ** a
18370 6e 64 20 6e 65 76 65 72 20 6e 65 65 64 73 20 74  nd never needs t
18380 6f 20 62 65 20 75 70 64 61 74 65 64 2e 0a 20 20  o be updated..  
18390 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
183a0 20 69 36 34 20 6a 72 6e 6c 4f 66 66 3b 0a 20 20   i64 jrnlOff;.  
183b0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
183c0 2d 3e 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d  ->fullSync && 0=
183d0 3d 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43  =(iDc&SQLITE_IOC
183e0 41 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29  AP_SEQUENTIAL) )
183f0 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
18400 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
18410 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
18420 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
18430 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
18440 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
18450 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
18460 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
18470 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
18480 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 79  >jfd, pPager->sy
18490 6e 63 5f 66 6c 61 67 73 29 3b 0a 20 20 20 20 20  nc_flags);.     
184a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
184b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
184c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 6a      }..        j
184d0 72 6e 6c 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  rnlOff = pPager-
184e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69  >journalHdr + si
184f0 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
18500 69 63 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54  ic);.        IOT
18510 52 41 43 45 28 28 22 4a 48 44 52 20 25 70 20 25  RACE(("JHDR %p %
18520 6c 6c 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  lld %d\n", pPage
18530 72 2c 20 6a 72 6e 6c 4f 66 66 2c 20 34 29 29 3b  r, jrnlOff, 4));
18540 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
18550 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
18560 2d 3e 6a 66 64 2c 20 6a 72 6e 6c 4f 66 66 2c 20  ->jfd, jrnlOff, 
18570 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
18580 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
18590 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
185a0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d   }.      if( 0==
185b0 28 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41  (iDc&SQLITE_IOCA
185c0 50 5f 53 45 51 55 45 4e 54 49 41 4c 29 20 29 7b  P_SEQUENTIAL) ){
185d0 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52  .        PAGERTR
185e0 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
185f0 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
18600 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
18610 20 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28         IOTRACE((
18620 22 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50  "JSYNC %p\n", pP
18630 61 67 65 72 29 29 0a 20 20 20 20 20 20 20 20 72  ager)).        r
18640 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
18650 63 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  c(pPager->jfd, p
18660 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
18670 73 7c 20 0a 20 20 20 20 20 20 20 20 20 20 28 70  s| .          (p
18680 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61 67  Pager->sync_flag
18690 73 3d 3d 53 51 4c 49 54 45 5f 53 59 4e 43 5f 46  s==SQLITE_SYNC_F
186a0 55 4c 4c 3f 53 51 4c 49 54 45 5f 53 59 4e 43 5f  ULL?SQLITE_SYNC_
186b0 44 41 54 41 4f 4e 4c 59 3a 30 29 0a 20 20 20 20  DATAONLY:0).    
186c0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
186d0 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
186e0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
186f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
18700 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
18710 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
18720 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
18730 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
18740 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
18750 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
18760 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
18770 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
18780 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
18790 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
187a0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
187b0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6c 72   0;.    }.    lr
187c0 75 4c 69 73 74 53 65 74 46 69 72 73 74 53 79 6e  uListSetFirstSyn
187d0 63 65 64 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ced(pPager);.  }
187e0 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
187f0 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61 67  .  /* If the Pag
18800 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  er.needSync flag
18810 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20 74   is clear then t
18820 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
18830 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73 74  c.  ** flag must
18840 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20 66   also be clear f
18850 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20 56  or all pages.  V
18860 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73 0a  erify that this.
18870 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20 69    ** invariant i
18880 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20 65  s true..  */.  e
18890 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50 67  lse{.    for(pPg
188a0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
188b0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
188c0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61 73  xtAll){.      as
188d0 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
188e0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d 0a  ync==0 );.    }.
188f0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
18900 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 53 79  er->lru.pFirstSy
18910 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 6c 72  nced==pPager->lr
18920 75 2e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  u.pFirst );.  }.
18930 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
18940 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
18950 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
18960 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
18970 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
18980 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
18990 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
189a0 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
189b0 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
189c0 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
189d0 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
189e0 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
189f0 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
18a00 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
18a10 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
18a20 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
18a30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
18a40 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
18a50 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
18a60 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
18a70 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
18a80 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
18a90 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
18aa0 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
18ab0 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
18ac0 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
18ad0 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
18ae0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
18af0 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
18b00 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
18b10 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
18b20 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
18b30 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
18b40 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
18b50 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
18b60 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
18b70 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
18b80 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
18b90 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
18ba0 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
18bb0 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
18bc0 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
18bd0 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
18be0 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
18bf0 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
18c00 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
18c10 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
18c20 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41   N_SORT_BUCKET_A
18c30 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20  LLOC 25.#define 
18c40 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20  N_SORT_BUCKET   
18c50 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51      25.#ifdef SQ
18c60 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
18c70 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
18c80 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b  sort_bucket = 0;
18c90 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54  .  #undef N_SORT
18ca0 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e  _BUCKET.  #defin
18cb0 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
18cc0 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61  \.   (sqlite3_pa
18cd0 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
18ce0 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t?sqlite3_pager_
18cf0 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f  n_sort_bucket:N_
18d00 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
18d10 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  C).#endif.static
18d20 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67   PgHdr *sort_pag
18d30 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e  elist(PgHdr *pIn
18d40 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f  ){.  PgHdr *a[N_
18d50 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
18d60 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  C], *p;.  int i;
18d70 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
18d80 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
18d90 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
18da0 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
18db0 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
18dc0 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
18dd0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
18de0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
18df0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
18e00 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
18e10 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
18e20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
18e30 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18e40 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
18e50 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
18e60 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
18e70 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
18e80 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
18e90 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
18ea0 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20     /* Coverage: 
18eb0 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65  To get here, the
18ec0 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e  re need to be 2^
18ed0 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20  (N_SORT_BUCKET) 
18ee0 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
18ef0 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
18f00 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f  list. This is po
18f10 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72  ssible, but impr
18f20 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a  actical..      *
18f30 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c  * Testing this l
18f40 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74  ine is the point
18f50 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   of global varia
18f60 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ble.      ** sql
18f70 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
18f80 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20  t_bucket..      
18f90 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  */.      a[i] = 
18fa0 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
18fb0 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
18fc0 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
18fd0 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
18fe0 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
18ff0 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
19000 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
19010 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
19020 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
19030 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
19040 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
19050 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
19060 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
19070 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
19080 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
19090 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
190a0 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
190b0 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
190c0 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
190d0 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
190e0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
190f0 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
19100 61 67 65 72 3b 0a 20 20 50 67 48 64 72 20 2a 70  ager;.  PgHdr *p
19110 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69  ;.  int rc;..  i
19120 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
19130 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
19140 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73 74    pPager = pList
19150 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20  ->pPager;..  /* 
19160 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
19170 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68 65  ere may be eithe
19180 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  r a RESERVED or 
19190 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
191a0 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61 62  n the.  ** datab
191b0 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68 65  ase file. If the
191c0 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61 6e  re is already an
191d0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c   EXCLUSIVE lock,
191e0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20   the following. 
191f0 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c   ** calls to sql
19200 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65  ite3OsLock() are
19210 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20   no-ops..  **.  
19220 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f  ** Moving the lo
19230 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45 44  ck from RESERVED
19240 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61 63   to EXCLUSIVE ac
19250 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20  tually involves 
19260 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75  going.  ** throu
19270 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69 61  gh an intermedia
19280 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e 47  te state PENDING
19290 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f  .   A PENDING lo
192a0 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77 0a  ck prevents new.
192b0 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72 6f    ** readers fro
192c0 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20 74  m attaching to t
192d0 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74 20  he database but 
192e0 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74 20  is unsufficient 
192f0 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77  for us to.  ** w
19300 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61 20  rite.  The idea 
19310 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63  of a PENDING loc
19320 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74 20  k is to prevent 
19330 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f 6d  new readers from
19340 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20  .  ** coming in 
19350 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66 6f  while we wait fo
19360 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64 65  r existing reade
19370 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a  rs to clear..  *
19380 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68 65  *.  ** While the
19390 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68 65   pager is in the
193a0 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c   RESERVED state,
193b0 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
193c0 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a  tabase file.  **
193d0 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61 6e   is unchanged an
193e0 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63  d we can rollbac
193f0 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e 67  k without having
19400 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68 65   to playback the
19410 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e  .  ** journal in
19420 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  to the original 
19430 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20  database file.  
19440 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74 69  Once we transiti
19450 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55  on to.  ** EXCLU
19460 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20 74  SIVE, it means t
19470 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19480 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67 65   has been change
19490 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61  d and any rollba
194a0 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71  ck.  ** will req
194b0 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70  uire a journal p
194c0 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20  layback..  */.  
194d0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
194e0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
194f0 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
19500 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19510 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75  E_OK ){.    retu
19520 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 70 4c  rn rc;.  }..  pL
19530 69 73 74 20 3d 20 73 6f 72 74 5f 70 61 67 65 6c  ist = sort_pagel
19540 69 73 74 28 70 4c 69 73 74 29 3b 0a 20 20 66 6f  ist(pList);.  fo
19550 72 28 70 3d 70 4c 69 73 74 3b 20 70 3b 20 70 3d  r(p=pList; p; p=
19560 70 2d 3e 70 44 69 72 74 79 29 7b 0a 20 20 20 20  p->pDirty){.    
19570 61 73 73 65 72 74 28 20 70 2d 3e 64 69 72 74 79  assert( p->dirty
19580 20 29 3b 0a 20 20 20 20 70 2d 3e 64 69 72 74 79   );.    p->dirty
19590 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 77 68 69 6c   = 0;.  }.  whil
195a0 65 28 20 70 4c 69 73 74 20 29 7b 0a 0a 20 20 20  e( pList ){..   
195b0 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20   /* If the file 
195c0 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
195d0 20 6f 70 65 6e 65 64 2c 20 6f 70 65 6e 20 69 74   opened, open it
195e0 20 6e 6f 77 2e 20 2a 2f 0a 20 20 20 20 69 66 28   now. */.    if(
195f0 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70 4d   !pPager->fd->pM
19600 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 20 20  ethods ){.      
19610 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 74  assert(pPager->t
19620 65 6d 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  empFile);.      
19630 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
19640 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65 72  rOpentemp(pPager
19650 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e  ->pVfs, pPager->
19660 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  fd, pPager->zFil
19670 65 6e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  ename,.         
19680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19690 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 76         pPager->v
196a0 66 73 46 6c 61 67 73 29 3b 0a 20 20 20 20 20 20  fsFlags);.      
196b0 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
196c0 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rc;.    }..    /
196d0 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64  * If there are d
196e0 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68  irty pages in th
196f0 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74  e page cache wit
19700 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67  h page numbers g
19710 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68  reater.    ** th
19720 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c  an Pager.dbSize,
19730 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69   this means sqli
19740 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65  te3PagerTruncate
19750 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
19760 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
19770 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
19780 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
19790 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
197a0 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
197b0 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
197c0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
197d0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
197e0 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
197f0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
19800 20 20 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d      i64 offset =
19810 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
19820 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
19830 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 63 68  geSize;.      ch
19840 61 72 20 2a 70 44 61 74 61 20 3d 20 43 4f 44 45  ar *pData = CODE
19850 43 32 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  C2(pPager, PGHDR
19860 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
19870 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
19880 3b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  ;.      PAGERTRA
19890 43 45 34 28 22 53 54 4f 52 45 20 25 64 20 70 61  CE4("STORE %d pa
198a0 67 65 20 25 64 20 68 61 73 68 28 25 30 38 78 29  ge %d hash(%08x)
198b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
198c0 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
198d0 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
198e0 70 67 6e 6f 2c 20 70 61 67 65 72 5f 70 61 67 65  pgno, pager_page
198f0 68 61 73 68 28 70 4c 69 73 74 29 29 3b 0a 20 20  hash(pList));.  
19900 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 50 47      IOTRACE(("PG
19910 4f 55 54 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  OUT %p %d\n", pP
19920 61 67 65 72 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ager, pList->pgn
19930 6f 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  o));.      rc = 
19940 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
19950 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 61 74 61  Pager->fd, pData
19960 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
19970 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20 20  ze, offset);.   
19980 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73 71     PAGER_INCR(sq
19990 6c 69 74 65 33 5f 70 61 67 65 72 5f 77 72 69 74  lite3_pager_writ
199a0 65 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  edb_count);.    
199b0 20 20 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61    PAGER_INCR(pPa
199c0 67 65 72 2d 3e 6e 57 72 69 74 65 29 3b 0a 20 20  ger->nWrite);.  
199d0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
199e0 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  gno==1 ){.      
199f0 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67 65 72    memcpy(&pPager
19a00 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c 20 26 70  ->dbFileVers, &p
19a10 44 61 74 61 5b 32 34 5d 2c 20 73 69 7a 65 6f 66  Data[24], sizeof
19a20 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  (pPager->dbFileV
19a30 65 72 73 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ers));.      }. 
19a40 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
19a50 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
19a60 20 20 20 20 50 41 47 45 52 54 52 41 43 45 33 28      PAGERTRACE3(
19a70 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65  "NOSTORE %d page
19a80 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19a90 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e  pPager), pList->
19aa0 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e  pgno);.    }.#en
19ab0 64 69 66 0a 20 20 20 20 69 66 28 20 72 63 20 29  dif.    if( rc )
19ac0 20 72 65 74 75 72 6e 20 72 63 3b 0a 23 69 66 64   return rc;.#ifd
19ad0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
19ae0 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
19af0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
19b00 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
19b10 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
19b20 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
19b30 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
19b40 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
19b50 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
19b60 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
19b70 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
19b80 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
19b90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
19ba0 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
19bb0 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
19bc0 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
19bd0 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
19be0 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
19bf0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
19c00 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
19c10 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
19c20 70 50 61 67 65 72 29 7b 0a 0a 23 69 66 6e 64 65  pPager){..#ifnde
19c30 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 56 65  f NDEBUG.  /* Ve
19c40 72 69 66 79 20 74 68 65 20 73 61 6e 69 74 79 20  rify the sanity 
19c50 6f 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  of the dirty lis
19c60 74 20 77 68 65 6e 20 77 65 20 61 72 65 20 72 75  t when we are ru
19c70 6e 6e 69 6e 67 0a 20 20 2a 2a 20 69 6e 20 64 65  nning.  ** in de
19c80 62 75 67 67 69 6e 67 20 6d 6f 64 65 2e 20 20 54  bugging mode.  T
19c90 68 69 73 20 69 73 20 65 78 70 65 6e 73 69 76 65  his is expensive
19ca0 2c 20 73 6f 20 64 6f 20 6e 6f 74 0a 20 20 2a 2a  , so do not.  **
19cb0 20 64 6f 20 74 68 69 73 20 6f 6e 20 61 20 6e 6f   do this on a no
19cc0 72 6d 61 6c 20 62 75 69 6c 64 2e 20 2a 2f 0a 20  rmal build. */. 
19cd0 20 69 6e 74 20 6e 31 20 3d 20 30 3b 0a 20 20 69   int n1 = 0;.  i
19ce0 6e 74 20 6e 32 20 3d 20 30 3b 0a 20 20 50 67 48  nt n2 = 0;.  PgH
19cf0 64 72 20 2a 70 3b 0a 20 20 66 6f 72 28 70 3d 70  dr *p;.  for(p=p
19d00 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
19d10 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 20  p=p->pNextAll){ 
19d20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 20 6e  if( p->dirty ) n
19d30 31 2b 2b 3b 20 7d 0a 20 20 66 6f 72 28 70 3d 70  1++; }.  for(p=p
19d40 50 61 67 65 72 2d 3e 70 44 69 72 74 79 3b 20 70  Pager->pDirty; p
19d50 3b 20 70 3d 70 2d 3e 70 44 69 72 74 79 29 7b 20  ; p=p->pDirty){ 
19d60 6e 32 2b 2b 3b 20 7d 0a 20 20 61 73 73 65 72 74  n2++; }.  assert
19d70 28 20 6e 31 3d 3d 6e 32 20 29 3b 0a 23 65 6e 64  ( n1==n2 );.#end
19d80 69 66 0a 0a 20 20 72 65 74 75 72 6e 20 70 50 61  if..  return pPa
19d90 67 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a  ger->pDirty;.}..
19da0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
19db0 45 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20  E if there is a 
19dc0 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74  hot journal on t
19dd0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
19de0 2a 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c  ** A hot journal
19df0 20 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65   is one that nee
19e00 64 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20  ds to be played 
19e10 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  back..**.** If t
19e20 68 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20  he current size 
19e30 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19e40 66 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20  file is 0 but a 
19e50 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20  journal file.** 
19e60 65 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20  exists, that is 
19e70 70 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20  probably an old 
19e80 6a 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65  journal left ove
19e90 72 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a  r from a prior.*
19ea0 2a 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20  * database with 
19eb0 74 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20  the same name.  
19ec0 4a 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20  Just delete the 
19ed0 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74  journal..*/.stat
19ee0 69 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75  ic int hasHotJou
19ef0 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
19f00 65 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 76  er){.  sqlite3_v
19f10 66 73 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65  fs *pVfs = pPage
19f20 72 2d 3e 70 56 66 73 3b 0a 20 20 69 66 28 20 21  r->pVfs;.  if( !
19f30 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
19f40 61 6c 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  al ) return 0;. 
19f50 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 66 64   if( !pPager->fd
19f60 2d 3e 70 4d 65 74 68 6f 64 73 20 29 20 72 65 74  ->pMethods ) ret
19f70 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
19f80 6c 69 74 65 33 4f 73 41 63 63 65 73 73 28 70 56  lite3OsAccess(pV
19f90 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
19fa0 72 6e 61 6c 2c 20 53 51 4c 49 54 45 5f 41 43 43  rnal, SQLITE_ACC
19fb0 45 53 53 5f 45 58 49 53 54 53 29 20 29 7b 0a 20  ESS_EXISTS) ){. 
19fc0 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
19fd0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
19fe0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
19ff0 6b 28 70 50 61 67 65 72 2d 3e 66 64 29 20 29 7b  k(pPager->fd) ){
1a000 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1a010 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
1a020 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1a030 50 61 67 65 72 29 3d 3d 30 20 29 7b 0a 20 20 20  Pager)==0 ){.   
1a040 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65   sqlite3OsDelete
1a050 28 70 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a  (pVfs, pPager->z
1a060 4a 6f 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20  Journal, 0);.   
1a070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
1a080 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
1a090 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ;.  }.}../*.** T
1a0a0 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ry to find a pag
1a0b0 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 74  e in the cache t
1a0c0 68 61 74 20 63 61 6e 20 62 65 20 72 65 63 79 63  hat can be recyc
1a0d0 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  led. .**.** This
1a0e0 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72 65 74   routine may ret
1a0f0 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
1a100 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 6f 72  , SQLITE_FULL or
1a110 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74 20 0a   SQLITE_OK. It .
1a120 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65 74 20  ** does not set 
1a130 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72 43  the pPager->errC
1a140 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a 2a 2f  ode variable..*/
1a150 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
1a160 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65 72 20  r_recycle(Pager 
1a170 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
1a180 2a 70 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20  *ppPg){.  PgHdr 
1a190 2a 70 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20  *pPg;.  *ppPg = 
1a1a0 30 3b 0a 0a 20 20 2f 2a 20 49 74 20 69 73 20 69  0;..  /* It is i
1a1b0 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74  llegal to call t
1a1c0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 75 6e 6c  his function unl
1a1d0 65 73 73 20 74 68 65 20 70 61 67 65 72 20 6f 62  ess the pager ob
1a1e0 6a 65 63 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 65  ject.  ** pointe
1a1f0 64 20 74 6f 20 62 79 20 70 50 61 67 65 72 20 68  d to by pPager h
1a200 61 73 20 61 74 20 6c 65 61 73 74 20 6f 6e 65 20  as at least one 
1a210 66 72 65 65 20 70 61 67 65 20 28 70 61 67 65 20  free page (page 
1a220 77 69 74 68 20 6e 52 65 66 3d 3d 30 29 2e 0a 20  with nRef==0).. 
1a230 20 2a 2f 20 0a 20 20 61 73 73 65 72 74 28 21 4d   */ .  assert(!M
1a240 45 4d 44 42 29 3b 0a 20 20 61 73 73 65 72 74 28  EMDB);.  assert(
1a250 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72  pPager->lru.pFir
1a260 73 74 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  st);..  /* Find 
1a270 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
1a280 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
1a290 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
1a2a0 65 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75  es not.  ** requ
1a2b0 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
1a2c0 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
1a2d0 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70  ournal..  */.  p
1a2e0 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72 75  Pg = pPager->lru
1a2f0 2e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  .pFirstSynced;..
1a300 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c 64    /* If we could
1a310 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67 65   not find a page
1a320 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 72   that does not r
1a330 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63 28  equire an fsync(
1a340 29 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f  ).  ** on the jo
1a350 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
1a360 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
1a370 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
1a380 20 61 0a 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f   a.  ** very slo
1a390 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
1a3a0 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
1a3b0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
1a3c0 6f 6d 65 74 69 6d 65 73 0a 20 20 2a 2a 20 69 74  ometimes.  ** it
1a3d0 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
1a3e0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ..  */.  if( pPg
1a3f0 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6c  ==0 && pPager->l
1a400 72 75 2e 70 46 69 72 73 74 29 7b 0a 20 20 20 20  ru.pFirst){.    
1a410 69 6e 74 20 69 44 63 20 3d 20 73 71 6c 69 74 65  int iDc = sqlite
1a420 33 4f 73 44 65 76 69 63 65 43 68 61 72 61 63 74  3OsDeviceCharact
1a430 65 72 69 73 74 69 63 73 28 70 50 61 67 65 72 2d  eristics(pPager-
1a440 3e 66 64 29 3b 0a 20 20 20 20 69 6e 74 20 72 63  >fd);.    int rc
1a450 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70   = syncJournal(p
1a460 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
1a470 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  rc!=0 ){.      r
1a480 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
1a490 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
1a4a0 66 75 6c 6c 53 79 6e 63 20 26 26 20 30 3d 3d 28  fullSync && 0==(
1a4b0 69 44 63 26 53 51 4c 49 54 45 5f 49 4f 43 41 50  iDc&SQLITE_IOCAP
1a4c0 5f 53 41 46 45 5f 41 50 50 45 4e 44 29 20 29 7b  _SAFE_APPEND) ){
1a4d0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20  .      /* If in 
1a4e0 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
1a4f0 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72  write a new jour
1a500 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20  nal header into 
1a510 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  the.      ** jou
1a520 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
1a530 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
1a540 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
1a550 61 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20  a journal.      
1a560 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
1a570 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
1a580 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
1a590 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 20 20  ges that have.  
1a5a0 20 20 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62      ** already b
1a5b0 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
1a5c0 68 65 20 64 61 74 61 62 61 73 65 20 28 69 6e 20  he database (in 
1a5d0 63 61 73 65 20 74 68 65 20 68 65 61 64 65 72 20  case the header 
1a5e0 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 72 61 73  is.      ** tras
1a5f0 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
1a600 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
1a610 65 64 29 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ed)..      */.  
1a620 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
1a630 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
1a640 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
1a650 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20  nalOff > 0 );.  
1a660 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a670 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1a680 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77   );.      rc = w
1a690 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1a6a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
1a6b0 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  ( rc!=0 ){.     
1a6c0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1a6d0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a6e0 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 6c 72  pPg = pPager->lr
1a6f0 75 2e 70 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 20  u.pFirst;.  }.. 
1a700 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1a710 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a 20 57  ef==0 );..  /* W
1a720 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f  rite the page to
1a730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a740 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74  le if it is dirt
1a750 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  y..  */.  if( pP
1a760 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  g->dirty ){.    
1a770 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73 73 65  int rc;.    asse
1a780 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  rt( pPg->needSyn
1a790 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61 6b 65  c==0 );.    make
1a7a0 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20 20  Clean(pPg);.    
1a7b0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1a7c0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
1a7d0 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61  = 0;.    rc = pa
1a7e0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
1a7f0 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 70  st( pPg );.    p
1a800 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20  Pg->dirty = 0;. 
1a810 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a820 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
1a830 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
1a840 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 67   }.  assert( pPg
1a850 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
1a860 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20   /* If the page 
1a870 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67  we are recycling
1a880 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c   is marked as al
1a890 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68  waysRollback, th
1a8a0 65 6e 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20  en.  ** set the 
1a8b0 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
1a8c0 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
1a8d0 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
1a8e0 20 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72   ** sqlite3Pager
1a8f0 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f  DontRollback() o
1a900 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
1a910 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
1a920 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
1a930 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
1a940 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
1a950 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
1a960 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
1a970 62 61 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20  back.  ** might 
1a980 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
1a990 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
1a9a0 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
1a9b0 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
1a9c0 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73    ** that is was
1a9d0 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f   marked alwaysRo
1a9e0 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65  llback.  This me
1a9f0 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67  ans that all pag
1aa00 65 73 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20  es must.  ** be 
1aa10 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
1aa20 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
1aa30 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a  re on out..  */.
1aa40 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
1aa50 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
1aa60 20 49 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59   IOTRACE(("ALWAY
1aa70 53 5f 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22  S_ROLLBACK %p\n"
1aa80 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 70  , pPager)).    p
1aa90 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1aaa0 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a  lback = 1;.  }..
1aab0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
1aac0 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
1aad0 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
1aae0 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
1aaf0 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65   */.  unlinkPage
1ab00 28 70 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28  (pPg);.  assert(
1ab10 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b   pPg->pgno==0 );
1ab20 0a 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b  ..  *ppPg = pPg;
1ab30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
1ab40 5f 4f 4b 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  _OK;.}..#ifdef S
1ab50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
1ab60 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 2f  ORY_MANAGEMENT./
1ab70 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
1ab80 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  on is called to 
1ab90 66 72 65 65 20 73 75 70 65 72 66 6c 75 6f 75 73  free superfluous
1aba0 20 64 79 6e 61 6d 69 63 61 6c 6c 79 20 61 6c 6c   dynamically all
1abb0 6f 63 61 74 65 64 20 6d 65 6d 6f 72 79 0a 2a 2a  ocated memory.**
1abc0 20 68 65 6c 64 20 62 79 20 74 68 65 20 70 61 67   held by the pag
1abd0 65 72 20 73 79 73 74 65 6d 2e 20 4d 65 6d 6f 72  er system. Memor
1abe0 79 20 69 6e 20 75 73 65 20 62 79 20 61 6e 79 20  y in use by any 
1abf0 53 51 4c 69 74 65 20 70 61 67 65 72 20 61 6c 6c  SQLite pager all
1ac00 6f 63 61 74 65 64 0a 2a 2a 20 62 79 20 74 68 65  ocated.** by the
1ac10 20 63 75 72 72 65 6e 74 20 74 68 72 65 61 64 20   current thread 
1ac20 6d 61 79 20 62 65 20 73 71 6c 69 74 65 33 5f 66  may be sqlite3_f
1ac30 72 65 65 28 29 65 64 2e 0a 2a 2a 0a 2a 2a 20 6e  ree()ed..**.** n
1ac40 52 65 71 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Req is the numbe
1ac50 72 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d 65  r of bytes of me
1ac60 6d 6f 72 79 20 72 65 71 75 69 72 65 64 2e 20 4f  mory required. O
1ac70 6e 63 65 20 74 68 69 73 20 6d 75 63 68 20 68 61  nce this much ha
1ac80 73 0a 2a 2a 20 62 65 65 6e 20 72 65 6c 65 61 73  s.** been releas
1ac90 65 64 2c 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  ed, the function
1aca0 20 72 65 74 75 72 6e 73 2e 20 54 68 65 20 72 65   returns. The re
1acb0 74 75 72 6e 20 76 61 6c 75 65 20 69 73 20 74 68  turn value is th
1acc0 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 0a  e total number .
1acd0 2a 2a 20 6f 66 20 62 79 74 65 73 20 6f 66 20 6d  ** of bytes of m
1ace0 65 6d 6f 72 79 20 72 65 6c 65 61 73 65 64 2e 0a  emory released..
1acf0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
1ad00 67 65 72 52 65 6c 65 61 73 65 4d 65 6d 6f 72 79  gerReleaseMemory
1ad10 28 69 6e 74 20 6e 52 65 71 29 7b 0a 20 20 69 6e  (int nReq){.  in
1ad20 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b  t nReleased = 0;
1ad30 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
1ad40 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72 65 6c  es of memory rel
1ad50 65 61 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a  eased so far */.
1ad60 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 20    sqlite3_mutex 
1ad70 2a 6d 75 74 65 78 3b 20 20 20 20 20 20 20 2f 2a  *mutex;       /*
1ad80 20 54 68 65 20 4d 45 4d 32 20 6d 75 74 65 78 20   The MEM2 mutex 
1ad90 2a 2f 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  */.  Pager *pPag
1ada0 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1adb0 20 2f 2a 20 46 6f 72 20 6c 6f 6f 70 69 6e 67 20   /* For looping 
1adc0 6f 76 65 72 20 70 61 67 65 72 73 20 2a 2f 0a 20  over pagers */. 
1add0 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 73 61   BusyHandler *sa
1ade0 76 65 64 42 75 73 79 3b 20 20 20 20 20 2f 2a 20  vedBusy;     /* 
1adf0 53 61 76 65 64 20 63 6f 70 79 20 6f 66 20 74 68  Saved copy of th
1ae00 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 2a  e busy handler *
1ae10 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  /.  int rc = SQL
1ae20 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 41 63  ITE_OK;..  /* Ac
1ae30 71 75 69 72 65 20 74 68 65 20 6d 65 6d 6f 72 79  quire the memory
1ae40 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 6d 75 74 65  -management mute
1ae50 78 0a 20 20 2a 2f 0a 20 20 6d 75 74 65 78 20 3d  x.  */.  mutex =
1ae60 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61   sqlite3_mutex_a
1ae70 6c 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45  lloc(SQLITE_MUTE
1ae80 58 5f 53 54 41 54 49 43 5f 4d 45 4d 32 29 3b 0a  X_STATIC_MEM2);.
1ae90 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1aea0 65 6e 74 65 72 28 6d 75 74 65 78 29 3b 0a 0a 20  enter(mutex);.. 
1aeb0 20 2f 2a 20 53 69 67 6e 61 6c 20 61 6c 6c 20 64   /* Signal all d
1aec0 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
1aed0 6f 6e 73 20 74 68 61 74 20 6d 65 6d 6f 72 79 20  ons that memory 
1aee0 6d 61 6e 61 67 65 6d 65 6e 74 20 77 61 6e 74 73  management wants
1aef0 0a 20 20 2a 2a 20 74 6f 20 68 61 76 65 20 61 63  .  ** to have ac
1af00 63 65 73 73 20 74 6f 20 74 68 65 20 70 61 67 65  cess to the page
1af10 72 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 70  rs..  */.  for(p
1af20 50 61 67 65 72 3d 73 71 6c 69 74 65 33 50 61 67  Pager=sqlite3Pag
1af30 65 72 4c 69 73 74 3b 20 70 50 61 67 65 72 3b 20  erList; pPager; 
1af40 70 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70  pPager=pPager->p
1af50 4e 65 78 74 29 7b 0a 20 20 20 20 20 70 50 61 67  Next){.     pPag
1af60 65 72 2d 3e 69 49 6e 55 73 65 4d 4d 20 3d 20 31  er->iInUseMM = 1
1af70 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
1af80 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
1af90 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52 65 6c   (nReq<0 || nRel
1afa0 65 61 73 65 64 3c 6e 52 65 71 29 20 29 7b 0a 20  eased<nReq) ){. 
1afb0 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1afc0 20 20 20 50 67 48 64 72 20 2a 70 52 65 63 79 63     PgHdr *pRecyc
1afd0 6c 65 64 3b 0a 20 0a 20 20 20 20 2f 2a 20 54 72  led;. .    /* Tr
1afe0 79 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  y to find a page
1aff0 20 74 6f 20 72 65 63 79 63 6c 65 20 74 68 61 74   to recycle that
1b000 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
1b010 65 20 61 20 73 79 6e 63 28 29 2e 20 49 66 0a 20  e a sync(). If. 
1b020 20 20 20 2a 2a 20 74 68 69 73 20 69 73 20 6e 6f     ** this is no
1b030 74 20 70 6f 73 73 69 62 6c 65 2c 20 66 69 6e 64  t possible, find
1b040 20 6f 6e 65 20 74 68 61 74 20 64 6f 65 73 20 72   one that does r
1b050 65 71 75 69 72 65 20 61 20 73 79 6e 63 28 29 2e  equire a sync().
1b060 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
1b070 74 65 33 5f 6d 75 74 65 78 5f 65 6e 74 65 72 28  te3_mutex_enter(
1b080 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 61 6c  sqlite3_mutex_al
1b090 6c 6f 63 28 53 51 4c 49 54 45 5f 4d 55 54 45 58  loc(SQLITE_MUTEX
1b0a0 5f 53 54 41 54 49 43 5f 4c 52 55 29 29 3b 0a 20  _STATIC_LRU));. 
1b0b0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33     pPg = sqlite3
1b0c0 4c 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72  LruPageList.pFir
1b0d0 73 74 53 79 6e 63 65 64 3b 0a 20 20 20 20 77 68  stSynced;.    wh
1b0e0 69 6c 65 28 20 70 50 67 20 26 26 20 28 70 50 67  ile( pPg && (pPg
1b0f0 2d 3e 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50  ->needSync || pP
1b100 67 2d 3e 70 50 61 67 65 72 2d 3e 69 49 6e 55 73  g->pPager->iInUs
1b110 65 44 42 29 20 29 7b 0a 20 20 20 20 20 20 70 50  eDB) ){.      pP
1b120 67 20 3d 20 70 50 67 2d 3e 67 66 72 65 65 2e 70  g = pPg->gfree.p
1b130 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Next;.    }.    
1b140 69 66 28 20 21 70 50 67 20 29 7b 0a 20 20 20 20  if( !pPg ){.    
1b150 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 4c    pPg = sqlite3L
1b160 72 75 50 61 67 65 4c 69 73 74 2e 70 46 69 72 73  ruPageList.pFirs
1b170 74 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  t;.      while( 
1b180 70 50 67 20 26 26 20 70 50 67 2d 3e 70 50 61 67  pPg && pPg->pPag
1b190 65 72 2d 3e 69 49 6e 55 73 65 44 42 20 29 7b 0a  er->iInUseDB ){.
1b1a0 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
1b1b0 67 2d 3e 67 66 72 65 65 2e 70 4e 65 78 74 3b 0a  g->gfree.pNext;.
1b1c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1b1d0 20 20 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f    sqlite3_mutex_
1b1e0 6c 65 61 76 65 28 73 71 6c 69 74 65 33 5f 6d 75  leave(sqlite3_mu
1b1f0 74 65 78 5f 61 6c 6c 6f 63 28 53 51 4c 49 54 45  tex_alloc(SQLITE
1b200 5f 4d 55 54 45 58 5f 53 54 41 54 49 43 5f 4c 52  _MUTEX_STATIC_LR
1b210 55 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  U));..    /* If 
1b220 70 50 67 3d 3d 30 2c 20 74 68 65 6e 20 74 68 65  pPg==0, then the
1b230 20 62 6c 6f 63 6b 20 61 62 6f 76 65 20 68 61 73   block above has
1b240 20 66 61 69 6c 65 64 20 74 6f 20 66 69 6e 64 20   failed to find 
1b250 61 20 70 61 67 65 20 74 6f 0a 20 20 20 20 2a 2a  a page to.    **
1b260 20 72 65 63 79 63 6c 65 2e 20 49 6e 20 74 68 69   recycle. In thi
1b270 73 20 63 61 73 65 20 72 65 74 75 72 6e 20 65 61  s case return ea
1b280 72 6c 79 20 2d 20 6e 6f 20 66 75 72 74 68 65 72  rly - no further
1b290 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 0a 20 20 20   memory will.   
1b2a0 20 2a 2a 20 62 65 20 72 65 6c 65 61 73 65 64 2e   ** be released.
1b2b0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1b2c0 21 70 50 67 20 29 20 62 72 65 61 6b 3b 0a 0a 20  !pPg ) break;.. 
1b2d0 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1b2e0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 61 73 73  >pPager;.    ass
1b2f0 65 72 74 28 21 70 50 67 2d 3e 6e 65 65 64 53 79  ert(!pPg->needSy
1b300 6e 63 20 7c 7c 20 70 50 67 3d 3d 70 50 61 67 65  nc || pPg==pPage
1b310 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74 29 3b 0a  r->lru.pFirst);.
1b320 20 20 20 20 61 73 73 65 72 74 28 70 50 67 2d 3e      assert(pPg->
1b330 6e 65 65 64 53 79 6e 63 20 7c 7c 20 70 50 67 3d  needSync || pPg=
1b340 3d 70 50 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69  =pPager->lru.pFi
1b350 72 73 74 53 79 6e 63 65 64 29 3b 0a 20 20 0a 20  rstSynced);.  . 
1b360 20 20 20 73 61 76 65 64 42 75 73 79 20 3d 20 70     savedBusy = p
1b370 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
1b380 6c 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ler;.    pPager-
1b390 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20  >pBusyHandler = 
1b3a0 30 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  0;.    rc = page
1b3b0 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65 72  r_recycle(pPager
1b3c0 2c 20 26 70 52 65 63 79 63 6c 65 64 29 3b 0a 20  , &pRecycled);. 
1b3d0 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
1b3e0 48 61 6e 64 6c 65 72 20 3d 20 73 61 76 65 64 42  Handler = savedB
1b3f0 75 73 79 3b 0a 20 20 20 20 61 73 73 65 72 74 28  usy;.    assert(
1b400 70 52 65 63 79 63 6c 65 64 3d 3d 70 50 67 20 7c  pRecycled==pPg |
1b410 7c 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29  | rc!=SQLITE_OK)
1b420 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
1b430 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1b440 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
1b450 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
1b460 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
1b470 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
1b480 0a 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f 76 65  .      ** remove
1b490 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  d from the page 
1b4a0 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72 65 65  hash-table, free
1b4b0 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63 65 64  -list and synced
1b4c0 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 2a 2a 20  -list .      ** 
1b4d0 28 70 46 69 72 73 74 53 79 6e 63 65 64 29 2e 20  (pFirstSynced). 
1b4e0 49 74 20 69 73 20 73 74 69 6c 6c 20 69 6e 20 74  It is still in t
1b4f0 68 65 20 61 6c 6c 20 70 61 67 65 73 20 28 70 41  he all pages (pA
1b500 6c 6c 29 20 6c 69 73 74 2e 20 0a 20 20 20 20 20  ll) list. .     
1b510 20 2a 2a 20 52 65 6d 6f 76 65 20 69 74 20 66 72   ** Remove it fr
1b520 6f 6d 20 74 68 69 73 20 6c 69 73 74 20 62 65 66  om this list bef
1b530 6f 72 65 20 66 72 65 65 69 6e 67 2e 0a 20 20 20  ore freeing..   
1b540 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
1b550 6f 64 6f 3a 20 43 68 65 63 6b 20 74 68 65 20 50  odo: Check the P
1b560 61 67 65 72 2e 70 53 74 6d 74 20 6c 69 73 74 20  ager.pStmt list 
1b570 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  to make sure thi
1b580 73 20 69 73 20 4f 6b 2e 20 49 74 20 0a 20 20 20  s is Ok. It .   
1b590 20 20 20 2a 2a 20 70 72 6f 62 61 62 6c 79 20 69     ** probably i
1b5a0 73 20 74 68 6f 75 67 68 2e 0a 20 20 20 20 20 20  s though..      
1b5b0 2a 2f 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  */.      PgHdr *
1b5c0 70 54 6d 70 3b 0a 20 20 20 20 20 20 61 73 73 65  pTmp;.      asse
1b5d0 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20  rt( pPg );.     
1b5e0 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
1b5f0 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20  ->pAll ){.      
1b600 20 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20     pPager->pAll 
1b610 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
1b620 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1b630 20 20 20 20 20 20 66 6f 72 28 20 70 54 6d 70 3d        for( pTmp=
1b640 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 54  pPager->pAll; pT
1b650 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 21 3d 70 50  mp->pNextAll!=pP
1b660 67 3b 20 70 54 6d 70 3d 70 54 6d 70 2d 3e 70 4e  g; pTmp=pTmp->pN
1b670 65 78 74 41 6c 6c 20 29 7b 7d 0a 20 20 20 20 20  extAll ){}.     
1b680 20 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c     pTmp->pNextAl
1b690 6c 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  l = pPg->pNextAl
1b6a0 6c 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  l;.      }.     
1b6b0 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 28 0a   nReleased += (.
1b6c0 20 20 20 20 20 20 20 20 20 20 73 69 7a 65 6f 66            sizeof
1b6d0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
1b6e0 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20 20  >pageSize.      
1b6f0 20 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32      + sizeof(u32
1b700 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ) + pPager->nExt
1b710 72 61 0a 20 20 20 20 20 20 20 20 20 20 2b 20 4d  ra.          + M
1b720 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69  EMDB*sizeof(PgHi
1b730 73 74 6f 72 79 29 20 0a 20 20 20 20 20 20 29 3b  story) .      );
1b740 0a 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28  .      IOTRACE((
1b750 22 50 47 46 52 45 45 20 25 70 20 25 64 20 2a 5c  "PGFREE %p %d *\
1b760 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d  n", pPager, pPg-
1b770 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 20 20 50  >pgno));.      P
1b780 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
1b790 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
1b7a0 6f 75 6e 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ount);.      sql
1b7b0 69 74 65 33 5f 66 72 65 65 28 70 50 67 2d 3e 70  ite3_free(pPg->p
1b7c0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 73 71 6c  Data);.      sql
1b7d0 69 74 65 33 5f 66 72 65 65 28 70 50 67 29 3b 0a  ite3_free(pPg);.
1b7e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
1b7f0 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 65 6c 73 65  age--;.    }else
1b800 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6e 20 65 72  {.      /* An er
1b810 72 6f 72 20 6f 63 63 75 72 65 64 20 77 68 69 6c  ror occured whil
1b820 73 74 20 77 72 69 74 69 6e 67 20 74 6f 20 74 68  st writing to th
1b830 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1b840 6f 72 20 0a 20 20 20 20 20 20 2a 2a 20 6a 6f 75  or .      ** jou
1b850 72 6e 61 6c 20 69 6e 20 70 61 67 65 72 5f 72 65  rnal in pager_re
1b860 63 79 63 6c 65 28 29 2e 20 54 68 65 20 65 72 72  cycle(). The err
1b870 6f 72 20 69 73 20 6e 6f 74 20 72 65 74 75 72 6e  or is not return
1b880 65 64 20 74 6f 20 74 68 65 20 0a 20 20 20 20 20  ed to the .     
1b890 20 2a 2a 20 63 61 6c 6c 65 72 20 6f 66 20 74 68   ** caller of th
1b8a0 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73  is function. Ins
1b8b0 74 65 61 64 2c 20 73 65 74 20 74 68 65 20 50 61  tead, set the Pa
1b8c0 67 65 72 2e 65 72 72 43 6f 64 65 20 76 61 72 69  ger.errCode vari
1b8d0 61 62 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 54  able..      ** T
1b8e0 68 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65  he error will be
1b8f0 20 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65   returned to the
1b900 20 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c   user (or users,
1b910 20 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20   in the case .  
1b920 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61 72      ** of a shar
1b930 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29 20  ed pager cache) 
1b940 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f 72  of the pager for
1b950 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f 72   which the error
1b960 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20 20   occured..      
1b970 2a 2f 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  */.      assert(
1b980 0a 20 20 20 20 20 20 20 20 20 20 28 72 63 26 30  .          (rc&0
1b990 78 66 66 29 3d 3d 53 51 4c 49 54 45 5f 49 4f 45  xff)==SQLITE_IOE
1b9a0 52 52 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  RR ||.          
1b9b0 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rc==SQLITE_FULL 
1b9c0 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 72 63 3d  ||.          rc=
1b9d0 3d 53 51 4c 49 54 45 5f 42 55 53 59 0a 20 20 20  =SQLITE_BUSY.   
1b9e0 20 20 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65     );.      asse
1b9f0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ba00 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
1ba10 44 20 29 3b 0a 20 20 20 20 20 20 70 61 67 65 72  D );.      pager
1ba20 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72  _error(pPager, r
1ba30 63 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  c);.    }.  }.. 
1ba40 20 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 6d 65   /* Clear the me
1ba50 6d 6f 72 79 20 6d 61 6e 61 67 65 6d 65 6e 74 20  mory management 
1ba60 66 6c 61 67 73 20 61 6e 64 20 72 65 6c 65 61 73  flags and releas
1ba70 65 20 74 68 65 20 6d 75 74 65 78 0a 20 20 2a 2f  e the mutex.  */
1ba80 0a 20 20 66 6f 72 28 70 50 61 67 65 72 3d 73 71  .  for(pPager=sq
1ba90 6c 69 74 65 33 50 61 67 65 72 4c 69 73 74 3b 20  lite3PagerList; 
1baa0 70 50 61 67 65 72 3b 20 70 50 61 67 65 72 3d 70  pPager; pPager=p
1bab0 50 61 67 65 72 2d 3e 70 4e 65 78 74 29 7b 0a 20  Pager->pNext){. 
1bac0 20 20 20 20 70 50 61 67 65 72 2d 3e 69 49 6e 55      pPager->iInU
1bad0 73 65 4d 4d 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  seMM = 0;.  }.  
1bae0 73 71 6c 69 74 65 33 5f 6d 75 74 65 78 5f 6c 65  sqlite3_mutex_le
1baf0 61 76 65 28 6d 75 74 65 78 29 3b 0a 0a 20 20 2f  ave(mutex);..  /
1bb00 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1bb10 62 65 72 20 6f 66 20 62 79 74 65 73 20 72 65 6c  ber of bytes rel
1bb20 65 61 73 65 64 0a 20 20 2a 2f 0a 20 20 72 65 74  eased.  */.  ret
1bb30 75 72 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d  urn nReleased;.}
1bb40 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1bb50 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f  E_ENABLE_MEMORY_
1bb60 4d 41 4e 41 47 45 4d 45 4e 54 20 2a 2f 0a 0a 2f  MANAGEMENT */../
1bb70 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 63 6f  *.** Read the co
1bb80 6e 74 65 6e 74 20 6f 66 20 70 61 67 65 20 70 50  ntent of page pP
1bb90 67 20 6f 75 74 20 6f 66 20 74 68 65 20 64 61 74  g out of the dat
1bba0 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73  abase file..*/.s
1bbb0 74 61 74 69 63 20 69 6e 74 20 72 65 61 64 44 62  tatic int readDb
1bbc0 50 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67  Page(Pager *pPag
1bbd0 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67 2c 20  er, PgHdr *pPg, 
1bbe0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 69 6e  Pgno pgno){.  in
1bbf0 74 20 72 63 3b 0a 20 20 69 36 34 20 6f 66 66 73  t rc;.  i64 offs
1bc00 65 74 3b 0a 20 20 61 73 73 65 72 74 28 20 4d 45  et;.  assert( ME
1bc10 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  MDB==0 );.  asse
1bc20 72 74 28 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  rt(pPager->fd->p
1bc30 4d 65 74 68 6f 64 73 7c 7c 70 50 61 67 65 72 2d  Methods||pPager-
1bc40 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66  >tempFile);.  if
1bc50 28 20 21 70 50 61 67 65 72 2d 3e 66 64 2d 3e 70  ( !pPager->fd->p
1bc60 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20 20 72  Methods ){.    r
1bc70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
1bc80 52 52 5f 53 48 4f 52 54 5f 52 45 41 44 3b 0a 20  RR_SHORT_READ;. 
1bc90 20 7d 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 70   }.  offset = (p
1bca0 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
1bcb0 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20  er->pageSize;.  
1bcc0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
1bcd0 61 64 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50  ad(pPager->fd, P
1bce0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1bcf0 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1bd00 69 7a 65 2c 20 6f 66 66 73 65 74 29 3b 0a 20 20  ize, offset);.  
1bd10 50 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74  PAGER_INCR(sqlit
1bd20 65 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f  e3_pager_readdb_
1bd30 63 6f 75 6e 74 29 3b 0a 20 20 50 41 47 45 52 5f  count);.  PAGER_
1bd40 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 52 65  INCR(pPager->nRe
1bd50 61 64 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  ad);.  IOTRACE((
1bd60 22 50 47 49 4e 20 25 70 20 25 64 5c 6e 22 2c 20  "PGIN %p %d\n", 
1bd70 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 3b 0a  pPager, pgno));.
1bd80 20 20 69 66 28 20 70 67 6e 6f 3d 3d 31 20 29 7b    if( pgno==1 ){
1bd90 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50 61  .    memcpy(&pPa
1bda0 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 2c  ger->dbFileVers,
1bdb0 20 26 28 28 75 38 2a 29 50 47 48 44 52 5f 54 4f   &((u8*)PGHDR_TO
1bdc0 5f 44 41 54 41 28 70 50 67 29 29 5b 32 34 5d 2c  _DATA(pPg))[24],
1bdd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1bde0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bdf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1be00 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62  izeof(pPager->db
1be10 46 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 7d 0a  FileVers));.  }.
1be20 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
1be30 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1be40 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
1be50 33 29 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45  3);.  PAGERTRACE
1be60 34 28 22 46 45 54 43 48 20 25 64 20 70 61 67 65  4("FETCH %d page
1be70 20 25 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e   %d hash(%08x)\n
1be80 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1be90 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
1bea0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 61  ), pPg->pgno, pa
1beb0 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
1bec0 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ));.  return rc;
1bed0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  .}.../*.** This 
1bee0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
1bef0 65 64 20 74 6f 20 6f 62 74 61 69 6e 20 74 68 65  ed to obtain the
1bf00 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 72 65 71   shared lock req
1bf10 75 69 72 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20  uired before.** 
1bf20 64 61 74 61 20 6d 61 79 20 62 65 20 72 65 61 64  data may be read
1bf30 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 72 20   from the pager 
1bf40 63 61 63 68 65 2e 20 49 66 20 74 68 65 20 73 68  cache. If the sh
1bf50 61 72 65 64 20 6c 6f 63 6b 20 68 61 73 20 61 6c  ared lock has al
1bf60 72 65 61 64 79 0a 2a 2a 20 62 65 65 6e 20 6f 62  ready.** been ob
1bf70 74 61 69 6e 65 64 2c 20 74 68 69 73 20 66 75 6e  tained, this fun
1bf80 63 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70  ction is a no-op
1bf90 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65 64 69 61 74  ..**.** Immediat
1bfa0 65 6c 79 20 61 66 74 65 72 20 6f 62 74 61 69 6e  ely after obtain
1bfb0 69 6e 67 20 74 68 65 20 73 68 61 72 65 64 20 6c  ing the shared l
1bfc0 6f 63 6b 20 28 69 66 20 72 65 71 75 69 72 65 64  ock (if required
1bfd0 29 2c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  ), this function
1bfe0 0a 2a 2a 20 63 68 65 63 6b 73 20 66 6f 72 20 61  .** checks for a
1bff0 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c   hot-journal fil
1c000 65 2e 20 49 66 20 6f 6e 65 20 69 73 20 66 6f 75  e. If one is fou
1c010 6e 64 2c 20 61 6e 20 65 6d 65 72 67 65 6e 63 79  nd, an emergency
1c020 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 69 73 20   rollback.** is 
1c030 70 65 72 66 6f 72 6d 65 64 20 69 6d 6d 65 64 69  performed immedi
1c040 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  ately..*/.static
1c050 20 69 6e 74 20 70 61 67 65 72 53 68 61 72 65 64   int pagerShared
1c060 4c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  Lock(Pager *pPag
1c070 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  er){.  int rc = 
1c080 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74  SQLITE_OK;.  int
1c090 20 69 73 48 6f 74 20 3d 20 30 3b 0a 0a 20 20 2f   isHot = 0;..  /
1c0a0 2a 20 49 66 20 74 68 69 73 20 64 61 74 61 62 61  * If this databa
1c0b0 73 65 20 69 73 20 6f 70 65 6e 65 64 20 66 6f 72  se is opened for
1c0c0 20 65 78 63 6c 75 73 69 76 65 20 61 63 63 65 73   exclusive acces
1c0d0 73 2c 20 68 61 73 20 6e 6f 20 6f 75 74 73 74 61  s, has no outsta
1c0e0 6e 64 69 6e 67 20 0a 20 20 2a 2a 20 70 61 67 65  nding .  ** page
1c0f0 20 72 65 66 65 72 65 6e 63 65 73 20 61 6e 64 20   references and 
1c100 69 73 20 69 6e 20 61 6e 20 65 72 72 6f 72 2d 73  is in an error-s
1c110 74 61 74 65 2c 20 6e 6f 77 20 69 73 20 74 68 65  tate, now is the
1c120 20 63 68 61 6e 63 65 20 74 6f 20 63 6c 65 61 72   chance to clear
1c130 0a 20 20 2a 2a 20 74 68 65 20 65 72 72 6f 72 2e  .  ** the error.
1c140 20 44 69 73 63 61 72 64 20 74 68 65 20 63 6f 6e   Discard the con
1c150 74 65 6e 74 73 20 6f 66 20 74 68 65 20 70 61 67  tents of the pag
1c160 65 72 2d 63 61 63 68 65 20 61 6e 64 20 74 72 65  er-cache and tre
1c170 61 74 20 61 6e 79 0a 20 20 2a 2a 20 6f 70 65 6e  at any.  ** open
1c180 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 73   journal file as
1c190 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c 2e 0a   a hot-journal..
1c1a0 20 20 2a 2f 0a 20 20 69 66 28 20 21 4d 45 4d 44    */.  if( !MEMD
1c1b0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 65 78 63  B && pPager->exc
1c1c0 6c 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50  lusiveMode && pP
1c1d0 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
1c1e0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1c1f0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67   ){.    if( pPag
1c200 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1c210 29 7b 0a 20 20 20 20 20 20 69 73 48 6f 74 20 3d  ){.      isHot =
1c220 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 61   1;.    }.    pa
1c230 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72  ger_reset(pPager
1c240 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  );.    pPager->e
1c250 72 72 43 6f 64 65 20 3d 20 53 51 4c 49 54 45 5f  rrCode = SQLITE_
1c260 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  OK;.  }..  /* If
1c270 20 74 68 65 20 70 61 67 65 72 20 69 73 20 73 74   the pager is st
1c280 69 6c 6c 20 69 6e 20 61 6e 20 65 72 72 6f 72 20  ill in an error 
1c290 73 74 61 74 65 2c 20 64 6f 20 6e 6f 74 20 70 72  state, do not pr
1c2a0 6f 63 65 65 64 2e 20 54 68 65 20 65 72 72 6f 72  oceed. The error
1c2b0 20 0a 20 20 2a 2a 20 73 74 61 74 65 20 77 69 6c   .  ** state wil
1c2c0 6c 20 62 65 20 63 6c 65 61 72 65 64 20 61 74 20  l be cleared at 
1c2d0 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74 68  some point in th
1c2e0 65 20 66 75 74 75 72 65 20 77 68 65 6e 20 61 6c  e future when al
1c2f0 6c 20 70 61 67 65 20 0a 20 20 2a 2a 20 72 65 66  l page .  ** ref
1c300 65 72 65 6e 63 65 73 20 61 72 65 20 64 72 6f 70  erences are drop
1c310 70 65 64 20 61 6e 64 20 74 68 65 20 63 61 63 68  ped and the cach
1c320 65 20 63 61 6e 20 62 65 20 64 69 73 63 61 72 64  e can be discard
1c330 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
1c340 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26  Pager->errCode &
1c350 26 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  & pPager->errCod
1c360 65 21 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29  e!=SQLITE_FULL )
1c370 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50 61  {.    return pPa
1c380 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1c390 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
1c3a0 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
1c3b0 4c 4f 43 4b 20 7c 7c 20 69 73 48 6f 74 20 29 7b  LOCK || isHot ){
1c3c0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73  .    sqlite3_vfs
1c3d0 20 2a 70 56 66 73 20 3d 20 70 50 61 67 65 72 2d   *pVfs = pPager-
1c3e0 3e 70 56 66 73 3b 0a 20 20 20 20 69 66 28 20 21  >pVfs;.    if( !
1c3f0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61  MEMDB ){.      a
1c400 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1c410 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  Ref==0 );.      
1c420 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52  if( !pPager->noR
1c430 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20  eadlock ){.     
1c440 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
1c450 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
1c460 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
1c470 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
1c480 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c490 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 70          return p
1c4a0 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
1c4b0 72 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  r, rc);.        
1c4c0 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  }.        assert
1c4d0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
1c4e0 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a  =SHARED_LOCK );.
1c4f0 20 20 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20        }.  .     
1c500 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c   /* If a journal
1c510 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e   file exists, an
1c520 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45  d there is no RE
1c530 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
1c540 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61  he.      ** data
1c550 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
1c560 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
1c570 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
1c580 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
1c590 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
1c5a0 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70   hasHotJournal(p
1c5b0 50 61 67 65 72 29 20 7c 7c 20 69 73 48 6f 74 20  Pager) || isHot 
1c5c0 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 47 65  ){.        /* Ge
1c5d0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
1c5e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
1c5f0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
1c600 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
1c610 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
1c620 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
1c630 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
1c640 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
1c650 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
1c660 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c    ** EXCLUSIVE l
1c670 6f 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c  ock. If it were,
1c680 20 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73   another process
1c690 20 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a   might open the.
1c6a0 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62          ** datab
1c6b0 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74  ase file, detect
1c6c0 20 74 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f   the RESERVED lo
1c6d0 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65  ck, and conclude
1c6e0 20 74 68 61 74 20 74 68 65 0a 20 20 20 20 20 20   that the.      
1c6f0 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69 73    ** database is
1c700 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77 68   safe to read wh
1c710 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73 73  ile this process
1c720 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e   is still rollin
1c730 67 20 69 74 20 0a 20 20 20 20 20 20 20 20 2a 2a  g it .        **
1c740 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a   back..        *
1c750 2a 20 0a 20 20 20 20 20 20 20 20 2a 2a 20 42 65  * .        ** Be
1c760 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
1c770 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
1c780 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
1c790 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
1c7a0 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f     ** second pro
1c7b0 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f  cess will get to
1c7c0 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74   this point in t
1c7d0 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c  he code and fail
1c7e0 20 74 6f 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f   to.        ** o
1c7f0 62 74 61 69 6e 20 69 74 73 20 6f 77 6e 20 45 58  btain its own EX
1c800 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
1c810 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1c820 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1c830 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
1c840 2d 3e 73 74 61 74 65 3c 45 58 43 4c 55 53 49 56  ->state<EXCLUSIV
1c850 45 5f 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  E_LOCK ){.      
1c860 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1c870 4f 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66  OsLock(pPager->f
1c880 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
1c890 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  K);.          if
1c8a0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1c8b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
1c8c0 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67  ager_unlock(pPag
1c8d0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
1c8e0 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
1c8f0 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63 29 3b  ror(pPager, rc);
1c900 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c910 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
1c920 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43  tate = PAGER_EXC
1c930 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20 20 20  LUSIVE;.        
1c940 7d 0a 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f  }. .        /* O
1c950 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
1c960 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c 79  for reading only
1c970 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  .  Return SQLITE
1c980 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20 20  _BUSY if.       
1c990 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
1c9a0 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
1c9b0 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
1c9c0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
1c9d0 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ** The journal f
1c9e0 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65  ile does not nee
1c9f0 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69  d to be locked i
1ca00 74 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20  tself.  The.    
1ca10 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1ca20 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65  ile is never ope
1ca30 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69  n unless the mai
1ca40 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  n database file 
1ca50 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 20 2a 2a  holds.        **
1ca60 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73   a write lock, s
1ca70 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65 72  o there is never
1ca80 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20 74   any chance of t
1ca90 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20  wo or more.     
1caa0 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
1cab0 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
1cac0 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
1cad0 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a  time..        **
1cae0 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
1caf0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
1cb00 20 72 65 61 64 2f 77 72 69 74 65 20 61 63 63 65   read/write acce
1cb10 73 73 2e 20 54 68 69 73 20 69 73 20 62 65 63 61  ss. This is beca
1cb20 75 73 65 20 69 6e 20 0a 20 20 20 20 20 20 20 20  use in .        
1cb30 2a 2a 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63  ** exclusive-acc
1cb40 65 73 73 20 6d 6f 64 65 20 74 68 65 20 66 69 6c  ess mode the fil
1cb50 65 20 64 65 73 63 72 69 70 74 6f 72 20 77 69 6c  e descriptor wil
1cb60 6c 20 62 65 20 6b 65 70 74 20 6f 70 65 6e 20 61  l be kept open a
1cb70 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 6f  nd.        ** po
1cb80 73 73 69 62 6c 79 20 75 73 65 64 20 66 6f 72 20  ssibly used for 
1cb90 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6c 61  a transaction la
1cba0 74 65 72 20 6f 6e 2e 20 4f 6e 20 73 6f 6d 65 20  ter on. On some 
1cbb0 73 79 73 74 65 6d 73 2c 20 74 68 65 0a 20 20 20  systems, the.   
1cbc0 20 20 20 20 20 2a 2a 20 4f 73 54 72 75 6e 63 61       ** OsTrunca
1cbd0 74 65 28 29 20 63 61 6c 6c 20 75 73 65 64 20 69  te() call used i
1cbe0 6e 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65  n exclusive-acce
1cbf0 73 73 20 6d 6f 64 65 20 61 6c 73 6f 20 72 65 71  ss mode also req
1cc00 75 69 72 65 73 0a 20 20 20 20 20 20 20 20 2a 2a  uires.        **
1cc10 20 61 20 72 65 61 64 2f 77 72 69 74 65 20 66 69   a read/write fi
1cc20 6c 65 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 20  le handle..     
1cc30 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
1cc40 28 20 21 69 73 48 6f 74 20 29 7b 0a 20 20 20 20  ( !isHot ){.    
1cc50 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1cc60 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1cc70 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 41    if( sqlite3OsA
1cc80 63 63 65 73 73 28 70 56 66 73 2c 20 70 50 61 67  ccess(pVfs, pPag
1cc90 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 53 51  er->zJournal, SQ
1cca0 4c 49 54 45 5f 41 43 43 45 53 53 5f 45 58 49 53  LITE_ACCESS_EXIS
1ccb0 54 53 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  TS) ){.         
1ccc0 20 20 20 69 6e 74 20 66 6f 75 74 20 3d 20 30 3b     int fout = 0;
1ccd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
1cce0 20 66 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e   f = SQLITE_OPEN
1ccf0 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
1cd00 45 5f 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52  E_OPEN_MAIN_JOUR
1cd10 4e 41 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  NAL;.           
1cd20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1cd30 2d 3e 74 65 6d 70 46 69 6c 65 20 29 3b 0a 20 20  ->tempFile );.  
1cd40 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1cd50 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56 66  qlite3OsOpen(pVf
1cd60 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  s, pPager->zJour
1cd70 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64  nal, pPager->jfd
1cd80 2c 20 66 2c 20 26 66 6f 75 74 29 3b 0a 20 20 20  , f, &fout);.   
1cd90 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
1cda0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
1cdb0 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70  | pPager->jfd->p
1cdc0 4d 65 74 68 6f 64 73 20 29 3b 0a 20 20 20 20 20  Methods );.     
1cdd0 20 20 20 20 20 20 20 69 66 28 20 66 6f 75 74 26         if( fout&
1cde0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
1cdf0 4f 4e 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20  ONLY ){.        
1ce00 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
1ce10 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20  E_BUSY;.        
1ce20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43        sqlite3OsC
1ce30 6c 6f 73 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  lose(pPager->jfd
1ce40 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
1ce50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1ce60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
1ce70 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ce80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61   ){.          pa
1ce90 67 65 72 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65  ger_unlock(pPage
1cea0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
1ceb0 74 75 72 6e 20 28 28 72 63 3d 3d 53 51 4c 49 54  turn ((rc==SQLIT
1cec0 45 5f 4e 4f 4d 45 4d 7c 7c 72 63 3d 3d 53 51 4c  E_NOMEM||rc==SQL
1ced0 49 54 45 5f 49 4f 45 52 52 5f 4e 4f 4d 45 4d 29  ITE_IOERR_NOMEM)
1cee0 3f 72 63 3a 53 51 4c 49 54 45 5f 42 55 53 59 29  ?rc:SQLITE_BUSY)
1cef0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1cf00 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
1cf10 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  nalOpen = 1;.   
1cf20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
1cf30 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
1cf40 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1cf50 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
1cf60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
1cf70 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
1cf80 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1cf90 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
1cfa0 20 0a 20 20 20 20 20 20 20 20 2f 2a 20 50 6c 61   .        /* Pla
1cfb0 79 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65  yback and delete
1cfc0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44   the journal.  D
1cfd0 72 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65  rop the database
1cfe0 20 77 72 69 74 65 0a 20 20 20 20 20 20 20 20 2a   write.        *
1cff0 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71  * lock and reacq
1d000 75 69 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f  uire the read lo
1d010 63 6b 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ck..        */. 
1d020 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65         rc = page
1d030 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  r_playback(pPage
1d040 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 69  r, 1);.        i
1d050 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1d060 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1d070 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72  turn pager_error
1d080 28 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20  (pPager, rc);.  
1d090 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1d0a0 61 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 73  assert(pPager->s
1d0b0 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52  tate==PAGER_SHAR
1d0c0 45 44 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  ED || .         
1d0d0 20 20 20 28 70 50 61 67 65 72 2d 3e 65 78 63 6c     (pPager->excl
1d0e0 75 73 69 76 65 4d 6f 64 65 20 26 26 20 70 50 61  usiveMode && pPa
1d0f0 67 65 72 2d 3e 73 74 61 74 65 3e 50 41 47 45 52  ger->state>PAGER
1d100 5f 53 48 41 52 45 44 29 0a 20 20 20 20 20 20 20  _SHARED).       
1d110 20 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   );.      }..   
1d120 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 70     if( pPager->p
1d130 41 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  All ){.        /
1d140 2a 20 54 68 65 20 73 68 61 72 65 64 2d 6c 6f 63  * The shared-loc
1d150 6b 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  k has just been 
1d160 61 63 71 75 69 72 65 64 20 6f 6e 20 74 68 65 20  acquired on the 
1d170 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
1d180 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 74 68 65        ** and the
1d190 72 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 70  re are already p
1d1a0 61 67 65 73 20 69 6e 20 74 68 65 20 63 61 63 68  ages in the cach
1d1b0 65 20 28 66 72 6f 6d 20 61 20 70 72 65 76 69 6f  e (from a previo
1d1c0 75 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65  us.        ** re
1d1d0 61 64 20 6f 72 20 77 72 69 74 65 20 74 72 61 6e  ad or write tran
1d1e0 73 61 63 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b  saction).  Check
1d1f0 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 64   to see if the d
1d200 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
1d210 2a 2a 20 68 61 73 20 62 65 65 6e 20 6d 6f 64 69  ** has been modi
1d220 66 69 65 64 2e 20 20 49 66 20 74 68 65 20 64 61  fied.  If the da
1d230 74 61 62 61 73 65 20 68 61 73 20 63 68 61 6e 67  tabase has chang
1d240 65 64 2c 20 66 6c 75 73 68 20 74 68 65 0a 20 20  ed, flush the.  
1d250 20 20 20 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a        ** cache..
1d260 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
1d270 20 20 20 2a 2a 20 44 61 74 61 62 61 73 65 20 63     ** Database c
1d280 68 61 6e 67 65 73 20 69 73 20 64 65 74 65 63 74  hanges is detect
1d290 65 64 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74  ed by looking at
1d2a0 20 31 35 20 62 79 74 65 73 20 62 65 67 69 6e 6e   15 bytes beginn
1d2b0 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
1d2c0 74 20 6f 66 66 73 65 74 20 32 34 20 69 6e 74 6f  t offset 24 into
1d2d0 20 74 68 65 20 66 69 6c 65 2e 20 20 54 68 65 20   the file.  The 
1d2e0 66 69 72 73 74 20 34 20 6f 66 20 74 68 65 73 65  first 4 of these
1d2f0 20 31 36 20 62 79 74 65 73 20 61 72 65 0a 20 20   16 bytes are.  
1d300 20 20 20 20 20 20 2a 2a 20 61 20 33 32 2d 62 69        ** a 32-bi
1d310 74 20 63 6f 75 6e 74 65 72 20 74 68 61 74 20 69  t counter that i
1d320 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 69  s incremented wi
1d330 74 68 20 65 61 63 68 20 63 68 61 6e 67 65 2e 20  th each change. 
1d340 20 54 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   The.        ** 
1d350 6f 74 68 65 72 20 62 79 74 65 73 20 63 68 61 6e  other bytes chan
1d360 67 65 20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68  ge randomly with
1d370 20 65 61 63 68 20 66 69 6c 65 20 63 68 61 6e 67   each file chang
1d380 65 20 77 68 65 6e 0a 20 20 20 20 20 20 20 20 2a  e when.        *
1d390 2a 20 61 20 63 6f 64 65 63 20 69 73 20 69 6e 20  * a codec is in 
1d3a0 75 73 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  use..        ** 
1d3b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68 65 72  .        ** Ther
1d3c0 65 20 69 73 20 61 20 76 61 6e 69 73 68 69 6e 67  e is a vanishing
1d3d0 6c 79 20 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20  ly small chance 
1d3e0 74 68 61 74 20 61 20 63 68 61 6e 67 65 20 77 69  that a change wi
1d3f0 6c 6c 20 6e 6f 74 20 62 65 20 0a 20 20 20 20 20  ll not be .     
1d400 20 20 20 2a 2a 20 64 65 74 65 63 74 65 64 2e 20     ** detected. 
1d410 20 54 68 65 20 63 68 61 6e 63 65 20 6f 66 20 61   The chance of a
1d420 6e 20 75 6e 64 65 74 65 63 74 65 64 20 63 68 61  n undetected cha
1d430 6e 67 65 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20  nge is so small 
1d440 74 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20  that.        ** 
1d450 69 74 20 63 61 6e 20 62 65 20 6e 65 67 6c 65 63  it can be neglec
1d460 74 65 64 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ted..        */.
1d470 20 20 20 20 20 20 20 20 63 68 61 72 20 64 62 46          char dbF
1d480 69 6c 65 56 65 72 73 5b 73 69 7a 65 6f 66 28 70  ileVers[sizeof(p
1d490 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d4a0 73 29 5d 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s)];.        sql
1d4b0 69 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75  ite3PagerPagecou
1d4c0 6e 74 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 20  nt(pPager);..   
1d4d0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1d4e0 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1d4f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 50 61        return pPa
1d500 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1d510 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1d520 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
1d530 69 7a 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ize>0 ){.       
1d540 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4b 56     IOTRACE(("CKV
1d550 45 52 53 20 25 70 20 25 64 5c 6e 22 2c 20 70 50  ERS %p %d\n", pP
1d560 61 67 65 72 2c 20 73 69 7a 65 6f 66 28 64 62 46  ager, sizeof(dbF
1d570 69 6c 65 56 65 72 73 29 29 29 3b 0a 20 20 20 20  ileVers)));.    
1d580 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1d590 65 33 4f 73 52 65 61 64 28 70 50 61 67 65 72 2d  e3OsRead(pPager-
1d5a0 3e 66 64 2c 20 26 64 62 46 69 6c 65 56 65 72 73  >fd, &dbFileVers
1d5b0 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65 56  , sizeof(dbFileV
1d5c0 65 72 73 29 2c 20 32 34 29 3b 0a 20 20 20 20 20  ers), 24);.     
1d5d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1d5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d5f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1d600 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1d610 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
1d620 20 20 20 20 20 20 6d 65 6d 73 65 74 28 64 62 46        memset(dbF
1d630 69 6c 65 56 65 72 73 2c 20 30 2c 20 73 69 7a 65  ileVers, 0, size
1d640 6f 66 28 64 62 46 69 6c 65 56 65 72 73 29 29 3b  of(dbFileVers));
1d650 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
1d660 20 20 20 20 69 66 28 20 6d 65 6d 63 6d 70 28 70      if( memcmp(p
1d670 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72  Pager->dbFileVer
1d680 73 2c 20 64 62 46 69 6c 65 56 65 72 73 2c 20 73  s, dbFileVers, s
1d690 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
1d6a0 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
1d6b0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
1d6c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
1d6d0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1d6e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1d6f0 65 72 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64  er->exclusiveMod
1d700 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  e || pPager->sta
1d710 74 65 3c 3d 50 41 47 45 52 5f 53 48 41 52 45 44  te<=PAGER_SHARED
1d720 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67   );.    if( pPag
1d730 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
1d740 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20  _UNLOCK ){.     
1d750 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1d760 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
1d770 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
1d780 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
1d790 41 6c 6c 6f 63 61 74 65 20 61 20 50 67 48 64 72  Allocate a PgHdr
1d7a0 20 6f 62 6a 65 63 74 2e 20 20 20 45 69 74 68 65   object.   Eithe
1d7b0 72 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 6f  r create a new o
1d7c0 6e 65 20 6f 72 20 72 65 75 73 65 0a 2a 2a 20 61  ne or reuse.** a
1d7d0 6e 20 65 78 69 73 74 69 6e 67 20 6f 6e 65 20 74  n existing one t
1d7e0 68 61 74 20 69 73 20 6e 6f 74 20 6f 74 68 65 72  hat is not other
1d7f0 77 69 73 65 20 69 6e 20 75 73 65 2e 0a 2a 2a 0a  wise in use..**.
1d800 2a 2a 20 41 20 6e 65 77 20 50 67 48 64 72 20 73  ** A new PgHdr s
1d810 74 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61  tructure is crea
1d820 74 65 64 20 69 66 20 61 6e 79 20 6f 66 20 74 68  ted if any of th
1d830 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 0a  e following are.
1d840 2a 2a 20 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20  ** true:.**.**  
1d850 20 20 20 28 31 29 20 20 57 65 20 68 61 76 65 20     (1)  We have 
1d860 6e 6f 74 20 65 78 63 65 65 64 65 64 20 6f 75 72  not exceeded our
1d870 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 63 61 74   maximum allocat
1d880 65 64 20 63 61 63 68 65 20 73 69 7a 65 0a 2a 2a  ed cache size.**
1d890 20 20 20 20 20 20 20 20 20 20 61 73 20 73 65 74            as set
1d8a0 20 62 79 20 74 68 65 20 22 50 52 41 47 4d 41 20   by the "PRAGMA 
1d8b0 63 61 63 68 65 5f 73 69 7a 65 22 20 63 6f 6d 6d  cache_size" comm
1d8c0 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  and..**.**     (
1d8d0 32 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  2)  There are no
1d8e0 20 75 6e 75 73 65 64 20 50 67 48 64 72 20 6f 62   unused PgHdr ob
1d8f0 6a 65 63 74 73 20 61 76 61 69 6c 61 62 6c 65 20  jects available 
1d900 61 74 20 74 68 69 73 20 74 69 6d 65 2e 0a 2a 2a  at this time..**
1d910 0a 2a 2a 20 20 20 20 20 28 33 29 20 20 54 68 69  .**     (3)  Thi
1d920 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
1d930 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  y database..**.*
1d940 2a 20 20 20 20 20 28 34 29 20 20 54 68 65 72 65  *     (4)  There
1d950 20 61 72 65 20 6e 6f 20 50 67 48 64 72 20 6f 62   are no PgHdr ob
1d960 6a 65 63 74 73 20 74 68 61 74 20 64 6f 20 6e 6f  jects that do no
1d970 74 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72  t require a jour
1d980 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  nal.**          
1d990 66 69 6c 65 20 73 79 6e 63 20 61 6e 64 20 61 20  file sync and a 
1d9a0 73 79 6e 63 20 6f 66 20 74 68 65 20 6a 6f 75 72  sync of the jour
1d9b0 6e 61 6c 20 66 69 6c 65 20 69 73 20 63 75 72 72  nal file is curr
1d9c0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
1d9d0 20 20 70 72 6f 68 69 62 69 74 65 64 2e 0a 2a 2a    prohibited..**
1d9e0 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
1d9f0 65 75 73 65 20 61 6e 20 65 78 69 73 74 69 6e 67  euse an existing
1da00 20 50 67 48 64 72 2e 20 20 49 6e 20 6f 74 68 65   PgHdr.  In othe
1da10 72 20 77 6f 72 64 73 2c 20 72 65 75 73 65 20 61  r words, reuse a
1da20 6e 0a 2a 2a 20 65 78 69 73 74 69 6e 67 20 50 67  n.** existing Pg
1da30 48 64 72 20 69 66 20 61 6c 6c 20 6f 66 20 74 68  Hdr if all of th
1da40 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  e following are 
1da50 74 72 75 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  true:.**.**     
1da60 28 31 29 20 20 57 65 20 68 61 76 65 20 72 65 61  (1)  We have rea
1da70 63 68 65 64 20 6f 72 20 65 78 63 65 65 64 65 64  ched or exceeded
1da80 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 63 61 63   the maximum cac
1da90 68 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20  he size.**      
1daa0 20 20 20 20 61 6c 6c 6f 77 65 64 20 62 79 20 22      allowed by "
1dab0 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73 69 7a  PRAGMA cache_siz
1dac0 65 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 32  e"..**.**     (2
1dad0 29 20 20 54 68 65 72 65 20 69 73 20 61 20 50 67  )  There is a Pg
1dae0 48 64 72 20 61 76 61 69 6c 61 62 6c 65 20 77 69  Hdr available wi
1daf0 74 68 20 50 67 48 64 72 2d 3e 6e 52 65 66 3d 3d  th PgHdr->nRef==
1db00 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 33 29 20  0.**.**     (3) 
1db10 20 57 65 20 61 72 65 20 6e 6f 74 20 69 6e 20 61   We are not in a
1db20 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
1db30 62 61 73 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  base.**.**     (
1db40 34 29 20 20 45 69 74 68 65 72 20 74 68 65 72 65  4)  Either there
1db50 20 69 73 20 61 6e 20 61 76 61 69 6c 61 62 6c 65   is an available
1db60 20 50 67 48 64 72 20 74 68 61 74 20 64 6f 65 73   PgHdr that does
1db70 20 6e 6f 74 20 6e 65 65 64 0a 2a 2a 20 20 20 20   not need.**    
1db80 20 20 20 20 20 20 74 6f 20 62 65 20 73 79 6e 63        to be sync
1db90 65 64 20 74 6f 20 64 69 73 6b 20 6f 72 20 65 6c  ed to disk or el
1dba0 73 65 20 64 69 73 6b 20 73 79 6e 63 69 6e 67 20  se disk syncing 
1dbb0 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a 2a 20  is currently.** 
1dbc0 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 65 64           allowed
1dbd0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1dbe0 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
1dbf0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
1dc00 20 50 67 48 64 72 20 2a 2a 70 70 50 67 29 7b 0a   PgHdr **ppPg){.
1dc10 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
1dc20 45 5f 4f 4b 3b 0a 20 20 50 67 48 64 72 20 2a 70  E_OK;.  PgHdr *p
1dc30 50 67 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 48  Pg;.  int nByteH
1dc40 64 72 3b 0a 0a 20 20 2f 2a 20 43 72 65 61 74 65  dr;..  /* Create
1dc50 20 61 20 6e 65 77 20 50 67 48 64 72 20 69 66 20   a new PgHdr if 
1dc60 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 75 72 20  any of the four 
1dc70 63 6f 6e 64 69 74 69 6f 6e 73 20 64 65 66 69 6e  conditions defin
1dc80 65 64 20 0a 20 20 2a 2a 20 61 62 6f 76 65 20 61  ed .  ** above a
1dc90 72 65 20 6d 65 74 3a 20 2a 2f 0a 20 20 69 66 28  re met: */.  if(
1dca0 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
1dcb0 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 0a 20 20  Pager->mxPage.  
1dcc0 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6c 72 75 2e   || pPager->lru.
1dcd0 70 46 69 72 73 74 3d 3d 30 20 0a 20 20 20 7c 7c  pFirst==0 .   ||
1dce0 20 4d 45 4d 44 42 0a 20 20 20 7c 7c 20 28 70 50   MEMDB.   || (pP
1dcf0 61 67 65 72 2d 3e 6c 72 75 2e 70 46 69 72 73 74  ager->lru.pFirst
1dd00 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
1dd10 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
1dd20 20 20 29 7b 0a 20 20 20 20 76 6f 69 64 20 2a 70    ){.    void *p
1dd30 44 61 74 61 3b 0a 20 20 20 20 69 66 28 20 70 50  Data;.    if( pP
1dd40 61 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61  ager->nPage>=pPa
1dd50 67 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20  ger->nHash ){.  
1dd60 20 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65      pager_resize
1dd70 5f 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67  _hash_table(pPag
1dd80 65 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61  er,.         pPa
1dd90 67 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f  ger->nHash<256 ?
1dda0 20 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e   256 : pPager->n
1ddb0 48 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69  Hash*2);.      i
1ddc0 66 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68  f( pPager->nHash
1ddd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
1dde0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
1ddf0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70  ;.        goto p
1de00 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75  ager_allocate_ou
1de10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  t;.      }.    }
1de20 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
1de30 70 50 61 67 65 72 29 3b 0a 20 20 20 20 6e 42 79  pPager);.    nBy
1de40 74 65 48 64 72 20 3d 20 73 69 7a 65 6f 66 28 2a  teHdr = sizeof(*
1de50 70 50 67 29 20 2b 20 73 69 7a 65 6f 66 28 75 33  pPg) + sizeof(u3
1de60 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78  2) + pPager->nEx
1de70 74 72 61 0a 20 20 20 20 20 20 20 20 20 20 20 20  tra.            
1de80 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
1de90 28 50 67 48 69 73 74 6f 72 79 29 3b 0a 20 20 20  (PgHistory);.   
1dea0 20 70 50 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d   pPg = sqlite3_m
1deb0 61 6c 6c 6f 63 28 20 6e 42 79 74 65 48 64 72 20  alloc( nByteHdr 
1dec0 29 3b 0a 20 20 20 20 69 66 28 20 70 50 67 20 29  );.    if( pPg )
1ded0 7b 0a 20 20 20 20 20 20 70 44 61 74 61 20 3d 20  {.      pData = 
1dee0 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20  sqlite3_malloc( 
1def0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1df00 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44   );.      if( pD
1df10 61 74 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ata==0 ){.      
1df20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1df30 50 67 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  Pg);.        pPg
1df40 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1df50 20 20 7d 0a 20 20 20 20 70 61 67 65 72 45 6e 74    }.    pagerEnt
1df60 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  er(pPager);.    
1df70 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20  if( pPg==0 ){.  
1df80 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
1df90 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
1dfa0 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74 65  o pager_allocate
1dfb0 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  _out;.    }.    
1dfc0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 6e  memset(pPg, 0, n
1dfd0 42 79 74 65 48 64 72 29 3b 0a 20 20 20 20 70 50  ByteHdr);.    pP
1dfe0 67 2d 3e 70 44 61 74 61 20 3d 20 70 44 61 74 61  g->pData = pData
1dff0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65  ;.    pPg->pPage
1e000 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
1e010 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  pPg->pNextAll = 
1e020 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20  pPager->pAll;.  
1e030 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
1e040 20 70 50 67 3b 0a 20 20 20 20 70 50 61 67 65 72   pPg;.    pPager
1e050 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 7d 65 6c  ->nPage++;.  }el
1e060 73 65 7b 0a 20 20 20 20 2f 2a 20 52 65 63 79 63  se{.    /* Recyc
1e070 6c 65 20 61 6e 20 65 78 69 73 74 69 6e 67 20 70  le an existing p
1e080 61 67 65 20 77 69 74 68 20 61 20 7a 65 72 6f 20  age with a zero 
1e090 72 65 66 2d 63 6f 75 6e 74 2e 20 2a 2f 0a 20 20  ref-count. */.  
1e0a0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 63    rc = pager_rec
1e0b0 79 63 6c 65 28 70 50 61 67 65 72 2c 20 26 70 50  ycle(pPager, &pP
1e0c0 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  g);.    if( rc==
1e0d0 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
1e0e0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
1e0f0 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b 45 44 3b 0a  _IOERR_BLOCKED;.
1e100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 72 63      }.    if( rc
1e110 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
1e120 20 20 20 20 20 67 6f 74 6f 20 70 61 67 65 72 5f       goto pager_
1e130 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3b 0a 20 20  allocate_out;.  
1e140 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
1e150 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
1e160 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
1e170 20 20 61 73 73 65 72 74 28 70 50 67 29 3b 0a 20    assert(pPg);. 
1e180 20 7d 0a 20 20 2a 70 70 50 67 20 3d 20 70 50 67   }.  *ppPg = pPg
1e190 3b 0a 0a 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  ;..pager_allocat
1e1a0 65 5f 6f 75 74 3a 0a 20 20 72 65 74 75 72 6e 20  e_out:.  return 
1e1b0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b  rc;.}../*.** Mak
1e1c0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 74  e sure we have t
1e1d0 68 65 20 63 6f 6e 74 65 6e 74 20 66 6f 72 20 61  he content for a
1e1e0 20 70 61 67 65 2e 20 20 49 66 20 74 68 65 20 70   page.  If the p
1e1f0 61 67 65 20 77 61 73 0a 2a 2a 20 70 72 65 76 69  age was.** previ
1e200 6f 75 73 6c 79 20 61 63 71 75 69 72 65 64 20 77  ously acquired w
1e210 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31  ith noContent==1
1e220 2c 20 74 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  , then the conte
1e230 6e 74 20 77 61 73 0a 2a 2a 20 6a 75 73 74 20 69  nt was.** just i
1e240 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65  nitialized to ze
1e250 72 6f 73 20 69 6e 73 74 65 61 64 20 6f 66 20 62  ros instead of b
1e260 65 69 6e 67 20 72 65 61 64 20 66 72 6f 6d 20 64  eing read from d
1e270 69 73 6b 2e 0a 2a 2a 20 42 75 74 20 6e 6f 77 20  isk..** But now 
1e280 77 65 20 6e 65 65 64 20 74 68 65 20 72 65 61 6c  we need the real
1e290 20 64 61 74 61 20 6f 66 66 20 6f 66 20 64 69 73   data off of dis
1e2a0 6b 2e 20 20 53 6f 20 6d 61 6b 65 20 73 75 72 65  k.  So make sure
1e2b0 20 77 65 0a 2a 2a 20 68 61 76 65 20 69 74 2e 20   we.** have it. 
1e2c0 20 52 65 61 64 20 69 74 20 69 6e 20 69 66 20 77   Read it in if w
1e2d0 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 69 74  e do not have it
1e2e0 20 61 6c 72 65 61 64 79 2e 0a 2a 2f 0a 73 74 61   already..*/.sta
1e2f0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 67 65  tic int pager_ge
1e300 74 5f 63 6f 6e 74 65 6e 74 28 50 67 48 64 72 20  t_content(PgHdr 
1e310 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67  *pPg){.  if( pPg
1e320 2d 3e 6e 65 65 64 52 65 61 64 20 29 7b 0a 20 20  ->needRead ){.  
1e330 20 20 69 6e 74 20 72 63 20 3d 20 72 65 61 64 44    int rc = readD
1e340 62 50 61 67 65 28 70 50 67 2d 3e 70 50 61 67 65  bPage(pPg->pPage
1e350 72 2c 20 70 50 67 2c 20 70 50 67 2d 3e 70 67 6e  r, pPg, pPg->pgn
1e360 6f 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  o);.    if( rc==
1e370 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1e380 20 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64     pPg->needRead
1e390 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 0;.    }else{
1e3a0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63  .      return rc
1e3b0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1e3c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1e3d0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
1e3e0 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41   a page..**.** A
1e3f0 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68   read lock on th
1e400 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f  e disk file is o
1e410 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65  btained when the
1e420 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61   first page is a
1e430 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69  cquired. .** Thi
1e440 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64  s read lock is d
1e450 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20  ropped when the 
1e460 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c  last page is rel
1e470 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  eased..**.** Thi
1e480 73 20 72 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20  s routine works 
1e490 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
1e4a0 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
1e4b0 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
1e4c0 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
1e4d0 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
1e4e0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
1e4f0 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
1e500 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
1e510 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
1e520 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
1e530 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
1e540 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
1e550 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
1e560 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
1e570 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
1e580 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
1e590 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
1e5a0 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
1e5b0 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
1e5c0 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
1e5d0 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
1e5e0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
1e5f0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
1e600 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
1e610 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
1e620 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
1e630 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
1e640 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
1e650 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
1e660 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b  sqlite3PagerLook
1e670 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
1e680 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 4c 6f 6f   routine and Loo
1e690 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a  kup() attempt.**
1e6a0 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65 20   to find a page 
1e6b0 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79  in the in-memory
1e6c0 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20 49   cache first.  I
1e6d0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
1e6e0 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20  t already.** in 
1e6f0 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f 75  memory, this rou
1e700 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69 73  tine goes to dis
1e710 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e 20  k to read it in 
1e720 77 68 65 72 65 61 73 20 4c 6f 6f 6b 75 70 28 29  whereas Lookup()
1e730 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73  .** just returns
1e740 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e   0.  This routin
1e750 65 20 61 63 71 75 69 72 65 73 20 61 20 72 65 61  e acquires a rea
1e760 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74  d-lock the first
1e770 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20   time it.** has 
1e780 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61  to go to disk, a
1e790 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c  nd could also pl
1e7a0 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f  ayback an old jo
1e7b0 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61  urnal if necessa
1e7c0 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 4c 6f 6f  ry..** Since Loo
1e7d0 6b 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73  kup() never goes
1e7e0 20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76   to disk, it nev
1e7f0 65 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77  er has to deal w
1e800 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20  ith locks.** or 
1e810 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a  journal files..*
1e820 2a 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74 65 6e  *.** If noConten
1e830 74 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 20  t is false, the 
1e840 70 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72  page contents ar
1e850 65 20 61 63 74 75 61 6c 6c 79 20 72 65 61 64 20  e actually read 
1e860 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a 20 49 66  from disk..** If
1e870 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 74 72   noContent is tr
1e880 75 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  ue, it means tha
1e890 74 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  t we do not care
1e8a0 20 61 62 6f 75 74 20 74 68 65 20 63 6f 6e 74 65   about the conte
1e8b0 6e 74 73 0a 2a 2a 20 6f 66 20 74 68 65 20 70 61  nts.** of the pa
1e8c0 67 65 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c  ge at this time,
1e8d0 20 73 6f 20 64 6f 20 6e 6f 74 20 64 6f 20 61 20   so do not do a 
1e8e0 64 69 73 6b 20 72 65 61 64 2e 20 20 4a 75 73 74  disk read.  Just
1e8f0 20 66 69 6c 6c 20 69 6e 20 74 68 65 0a 2a 2a 20   fill in the.** 
1e900 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 77 69 74  page content wit
1e910 68 20 7a 65 72 6f 73 2e 20 20 42 75 74 20 6d 61  h zeros.  But ma
1e920 72 6b 20 74 68 65 20 66 61 63 74 20 74 68 61 74  rk the fact that
1e930 20 77 65 20 68 61 76 65 20 6e 6f 74 20 72 65 61   we have not rea
1e940 64 20 74 68 65 0a 2a 2a 20 63 6f 6e 74 65 6e 74  d the.** content
1e950 20 62 79 20 73 65 74 74 69 6e 67 20 74 68 65 20   by setting the 
1e960 50 67 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66  PgHdr.needRead f
1e970 6c 61 67 2e 20 20 4c 61 74 65 72 20 6f 6e 2c 20  lag.  Later on, 
1e980 69 66 20 0a 2a 2a 20 73 71 6c 69 74 65 33 50 61  if .** sqlite3Pa
1e990 67 65 72 57 72 69 74 65 28 29 20 69 73 20 63 61  gerWrite() is ca
1e9a0 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20 70 61 67  lled on this pag
1e9b0 65 20 6f 72 20 69 66 20 74 68 69 73 20 72 6f 75  e or if this rou
1e9c0 74 69 6e 65 20 69 73 0a 2a 2a 20 63 61 6c 6c 65  tine is.** calle
1e9d0 64 20 61 67 61 69 6e 20 77 69 74 68 20 6e 6f 43  d again with noC
1e9e0 6f 6e 74 65 6e 74 3d 3d 30 2c 20 74 68 61 74 20  ontent==0, that 
1e9f0 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 63  means that the c
1ea00 6f 6e 74 65 6e 74 20 69 73 20 6e 65 65 64 65 64  ontent is needed
1ea10 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 69 73 6b  .** and the disk
1ea20 20 72 65 61 64 20 73 68 6f 75 6c 64 20 6f 63 63   read should occ
1ea30 75 72 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74  ur at that point
1ea40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1ea50 70 61 67 65 72 41 63 71 75 69 72 65 28 0a 20 20  pagerAcquire(.  
1ea60 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 20  Pager *pPager,  
1ea70 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1ea80 20 6f 70 65 6e 20 6f 6e 20 74 68 65 20 64 61 74   open on the dat
1ea90 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
1eaa0 50 67 6e 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20  Pgno pgno,      
1eab0 20 20 20 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62      /* Page numb
1eac0 65 72 20 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20  er to fetch */. 
1ead0 20 44 62 50 61 67 65 20 2a 2a 70 70 50 61 67 65   DbPage **ppPage
1eae0 2c 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 20  ,    /* Write a 
1eaf0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
1eb00 61 67 65 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e  age here */.  in
1eb10 74 20 6e 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20  t noContent     
1eb20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68    /* Do not both
1eb30 65 72 20 72 65 61 64 69 6e 67 20 63 6f 6e 74 65  er reading conte
1eb40 6e 74 20 66 72 6f 6d 20 64 69 73 6b 20 69 66 20  nt from disk if 
1eb50 74 72 75 65 20 2a 2f 0a 29 7b 0a 20 20 50 67 48  true */.){.  PgH
1eb60 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72  dr *pPg;.  int r
1eb70 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50  c;..  assert( pP
1eb80 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
1eb90 45 52 5f 55 4e 4c 4f 43 4b 20 7c 7c 20 70 50 61  ER_UNLOCK || pPa
1eba0 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70  ger->nRef>0 || p
1ebb0 67 6e 6f 3d 3d 31 20 29 3b 0a 0a 20 20 2f 2a 20  gno==1 );..  /* 
1ebc0 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65  The maximum page
1ebd0 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e   number is 2^31.
1ebe0 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43   Return SQLITE_C
1ebf0 4f 52 52 55 50 54 20 69 66 20 61 20 70 61 67 65  ORRUPT if a page
1ec00 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65  .  ** number gre
1ec10 61 74 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20  ater than this, 
1ec20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75  or zero, is requ
1ec30 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66  ested..  */.  if
1ec40 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58  ( pgno>PAGER_MAX
1ec50 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30  _PGNO || pgno==0
1ec60 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
1ec70 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
1ec80 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
1ec90 4c 49 54 45 5f 43 4f 52 52 55 50 54 5f 42 4b 50  LITE_CORRUPT_BKP
1eca0 54 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b  T;.  }..  /* Mak
1ecb0 65 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e  e sure we have n
1ecc0 6f 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69  ot hit any criti
1ecd0 63 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f  cal errors..  */
1ece0 20 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67   .  assert( pPag
1ecf0 65 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61  er!=0 );.  *ppPa
1ed00 67 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 49 66  ge = 0;..  /* If
1ed10 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1ed20 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
1ed30 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
1ed40 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
1ed50 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1ed60 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65 64 4c  le. pagerSharedL
1ed70 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d 6f 70  ock() is a no-op
1ed80 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61 74 61   if .  ** a data
1ed90 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61 6c 72  base lock is alr
1eda0 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a 2f 0a  eady held..  */.
1edb0 20 20 72 63 20 3d 20 70 61 67 65 72 53 68 61 72    rc = pagerShar
1edc0 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  edLock(pPager);.
1edd0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1ede0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
1edf0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
1ee00 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
1ee10 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
1ee20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65  );..  pPg = page
1ee30 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1ee40 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1ee50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
1ee60 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
1ee70 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
1ee80 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1ee90 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20 20 20     int nMax;.   
1eea0 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41 47 45   int h;.    PAGE
1eeb0 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e  R_INCR(pPager->n
1eec0 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20 3d 20  Miss);.    rc = 
1eed0 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50 61 67  pagerAllocatePag
1eee0 65 28 70 50 61 67 65 72 2c 20 26 70 50 67 29 3b  e(pPager, &pPg);
1eef0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1ef00 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1ef10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1ef20 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  ..    pPg->pgno 
1ef30 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73 73 65  = pgno;.    asse
1ef40 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20 70 67  rt( !MEMDB || pg
1ef50 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  no>pPager->stmtS
1ef60 69 7a 65 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e  ize );.    pPg->
1ef70 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69  inJournal = sqli
1ef80 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
1ef90 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
1efa0 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67  , pgno);.    pPg
1efb0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
1efc0 0a 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70  .    makeClean(p
1efd0 50 67 29 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52  Pg);.    pPg->nR
1efe0 65 66 20 3d 20 31 3b 0a 0a 20 20 20 20 70 50 61  ef = 1;..    pPa
1eff0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
1f000 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
1f010 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
1f020 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
1f030 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
1f040 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
1f050 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
1f060 20 6e 4d 61 78 20 3d 20 73 71 6c 69 74 65 33 50   nMax = sqlite3P
1f070 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1f080 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
1f090 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
1f0a0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 50 61  {.      rc = pPa
1f0b0 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
1f0c0 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72      sqlite3Pager
1f0d0 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20  Unref(pPg);.    
1f0e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1f0f0 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 6f 70 75 6c   }..    /* Popul
1f100 61 74 65 20 74 68 65 20 70 61 67 65 20 77 69 74  ate the page wit
1f110 68 20 64 61 74 61 2c 20 65 69 74 68 65 72 20 62  h data, either b
1f120 79 20 72 65 61 64 69 6e 67 20 66 72 6f 6d 20 74  y reading from t
1f130 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
1f140 2a 2a 20 66 69 6c 65 2c 20 6f 72 20 62 79 20 73  ** file, or by s
1f150 65 74 74 69 6e 67 20 74 68 65 20 65 6e 74 69 72  etting the entir
1f160 65 20 70 61 67 65 20 74 6f 20 7a 65 72 6f 2e 0a  e page to zero..
1f170 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
1f180 4d 61 78 3c 28 69 6e 74 29 70 67 6e 6f 20 7c 7c  Max<(int)pgno ||
1f190 20 4d 45 4d 44 42 20 7c 7c 20 28 6e 6f 43 6f 6e   MEMDB || (noCon
1f1a0 74 65 6e 74 20 26 26 20 21 70 50 61 67 65 72 2d  tent && !pPager-
1f1b0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 29  >alwaysRollback)
1f1c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 67   ){.      if( pg
1f1d0 6e 6f 3e 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e  no>pPager->mxPgn
1f1e0 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  o ){.        sql
1f1f0 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
1f200 50 67 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  Pg);.        ret
1f210 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  urn SQLITE_FULL;
1f220 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6d  .      }.      m
1f230 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
1f240 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
1f250 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
1f260 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 52        pPg->needR
1f270 65 61 64 20 3d 20 6e 6f 43 6f 6e 74 65 6e 74 20  ead = noContent 
1f280 26 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61  && !pPager->alwa
1f290 79 73 52 6f 6c 6c 62 61 63 6b 3b 0a 20 20 20 20  ysRollback;.    
1f2a0 20 20 49 4f 54 52 41 43 45 28 28 22 5a 45 52 4f    IOTRACE(("ZERO
1f2b0 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
1f2c0 72 2c 20 70 67 6e 6f 29 29 3b 0a 20 20 20 20 7d  r, pgno));.    }
1f2d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
1f2e0 20 72 65 61 64 44 62 50 61 67 65 28 70 50 61 67   readDbPage(pPag
1f2f0 65 72 2c 20 70 50 67 2c 20 70 67 6e 6f 29 3b 0a  er, pPg, pgno);.
1f300 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1f310 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1f320 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48 4f 52  QLITE_IOERR_SHOR
1f330 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20 20 20  T_READ ){.      
1f340 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b    pPg->pgno = 0;
1f350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f360 50 61 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b  PagerUnref(pPg);
1f370 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1f380 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
1f390 20 20 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20    pPg->needRead 
1f3a0 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
1f3b0 2f 2a 20 4c 69 6e 6b 20 74 68 65 20 70 61 67 65  /* Link the page
1f3c0 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 20 68   into the page h
1f3d0 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  ash table */.   
1f3e0 20 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61   h = pgno & (pPa
1f3f0 67 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20  ger->nHash-1);. 
1f400 20 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21     assert( pgno!
1f410 3d 30 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  =0 );.    pPg->p
1f420 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1f430 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20  r->aHash[h];.   
1f440 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1f450 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  ] = pPg;.    if(
1f460 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1f470 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
1f480 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
1f490 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b  >pPrevHash==0 );
1f4a0 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
1f4b0 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
1f4c0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 0a 23   = pPg;.    }..#
1f4d0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
1f4e0 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67  CK_PAGES.    pPg
1f4f0 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67  ->pageHash = pag
1f500 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29  er_pagehash(pPg)
1f510 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65  ;.#endif.  }else
1f520 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
1f530 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
1f540 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
1f550 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28  . */.    assert(
1f560 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 30 20 7c  pPager->nRef>0 |
1f570 7c 20 70 67 6e 6f 3d 3d 31 29 3b 0a 20 20 20 20  | pgno==1);.    
1f580 50 41 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65  PAGER_INCR(pPage
1f590 72 2d 3e 6e 48 69 74 29 3b 0a 20 20 20 20 69 66  r->nHit);.    if
1f5a0 28 20 21 6e 6f 43 6f 6e 74 65 6e 74 20 29 7b 0a  ( !noContent ){.
1f5b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
1f5c0 5f 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67  _get_content(pPg
1f5d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
1f5e0 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
1f5f0 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
1f600 20 20 7d 0a 20 20 20 20 70 61 67 65 5f 72 65 66    }.    page_ref
1f610 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70  (pPg);.  }.  *pp
1f620 50 61 67 65 20 3d 20 70 50 67 3b 0a 20 20 72 65  Page = pPg;.  re
1f630 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1f640 7d 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  }.int sqlite3Pag
1f650 65 72 41 63 71 75 69 72 65 28 0a 20 20 50 61 67  erAcquire(.  Pag
1f660 65 72 20 2a 70 50 61 67 65 72 2c 20 20 20 20 20  er *pPager,     
1f670 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 6f 70   /* The pager op
1f680 65 6e 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  en on the databa
1f690 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 50 67 6e  se file */.  Pgn
1f6a0 6f 20 70 67 6e 6f 2c 20 20 20 20 20 20 20 20 20  o pgno,         
1f6b0 20 2f 2a 20 50 61 67 65 20 6e 75 6d 62 65 72 20   /* Page number 
1f6c0 74 6f 20 66 65 74 63 68 20 2a 2f 0a 20 20 44 62  to fetch */.  Db
1f6d0 50 61 67 65 20 2a 2a 70 70 50 61 67 65 2c 20 20  Page **ppPage,  
1f6e0 20 20 2f 2a 20 57 72 69 74 65 20 61 20 70 6f 69    /* Write a poi
1f6f0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
1f700 20 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   here */.  int n
1f710 6f 43 6f 6e 74 65 6e 74 20 20 20 20 20 20 20 2f  oContent       /
1f720 2a 20 44 6f 20 6e 6f 74 20 62 6f 74 68 65 72 20  * Do not bother 
1f730 72 65 61 64 69 6e 67 20 63 6f 6e 74 65 6e 74 20  reading content 
1f740 66 72 6f 6d 20 64 69 73 6b 20 69 66 20 74 72 75  from disk if tru
1f750 65 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  e */.){.  int rc
1f760 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70  ;.  pagerEnter(p
1f770 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
1f780 61 67 65 72 41 63 71 75 69 72 65 28 70 50 61 67  agerAcquire(pPag
1f790 65 72 2c 20 70 67 6e 6f 2c 20 70 70 50 61 67 65  er, pgno, ppPage
1f7a0 2c 20 6e 6f 43 6f 6e 74 65 6e 74 29 3b 0a 20 20  , noContent);.  
1f7b0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
1f7c0 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
1f7d0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  .}.../*.** Acqui
1f7e0 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
1f7f0 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
1f800 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
1f810 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
1f820 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
1f830 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
1f840 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
1f850 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
1f860 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1f870 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
1f880 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
1f890 33 50 61 67 65 72 47 65 74 28 29 2e 20 20 54 68  3PagerGet().  Th
1f8a0 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74  e difference bet
1f8b0 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  ween this routin
1f8c0 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33  e.** and sqlite3
1f8d0 50 61 67 65 72 47 65 74 28 29 20 69 73 20 74 68  PagerGet() is th
1f8e0 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
1f8f0 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
1f900 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
1f910 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
1f920 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
1f930 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
1f940 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
1f950 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
1f960 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
1f970 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
1f980 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
1f990 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
1f9a0 64 2e 0a 2a 2f 0a 44 62 50 61 67 65 20 2a 73 71  d..*/.DbPage *sq
1f9b0 6c 69 74 65 33 50 61 67 65 72 4c 6f 6f 6b 75 70  lite3PagerLookup
1f9c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1f9d0 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
1f9e0 48 64 72 20 2a 70 50 67 20 3d 20 30 3b 0a 0a 20  Hdr *pPg = 0;.. 
1f9f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
1fa00 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fa10 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a 20 20 70 61  pgno!=0 );..  pa
1fa20 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
1fa30 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1fa40 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c  state==PAGER_UNL
1fa50 4f 43 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72  OCK ){.    asser
1fa60 74 28 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c  t( !pPager->pAll
1fa70 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c   || pPager->excl
1fa80 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 7d  usiveMode );.  }
1fa90 65 6c 73 65 20 69 66 28 20 70 50 61 67 65 72 2d  else if( pPager-
1faa0 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61 67  >errCode && pPag
1fab0 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c  er->errCode!=SQL
1fac0 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20  ITE_FULL ){.    
1fad0 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a 2f  /* Do nothing */
1fae0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 70 50  .  }else if( (pP
1faf0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
1fb00 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 29 21  (pPager, pgno))!
1fb10 3d 30 20 29 7b 0a 20 20 20 20 70 61 67 65 5f 72  =0 ){.    page_r
1fb20 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70  ef(pPg);.  }.  p
1fb30 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
1fb40 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 3b  );.  return pPg;
1fb50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73  .}../*.** Releas
1fb60 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
1fb70 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
1fb80 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1fb90 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20  he page drop to 
1fba0 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a  zero, then the.*
1fbb0 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20  * page is added 
1fbc0 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e  to the LRU list.
1fbd0 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72    When all refer
1fbe0 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67  ences to all pag
1fbf0 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73  es.** are releas
1fc00 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f  ed, a rollback o
1fc10 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f  ccurs and the lo
1fc20 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1fc30 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64  se is.** removed
1fc40 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1fc50 50 61 67 65 72 55 6e 72 65 66 28 44 62 50 61 67  PagerUnref(DbPag
1fc60 65 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  e *pPg){.  Pager
1fc70 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1fc80 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 44 65  pPager;..  /* De
1fc90 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65  crement the refe
1fca0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
1fcb0 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20  this page.  */. 
1fcc0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1fcd0 65 66 3e 30 20 29 3b 0a 20 20 70 61 67 65 72 45  ef>0 );.  pagerE
1fce0 6e 74 65 72 28 70 50 67 2d 3e 70 50 61 67 65 72  nter(pPg->pPager
1fcf0 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
1fd00 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
1fd10 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e  pPg);..  /* When
1fd20 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
1fd30 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70  eferences to a p
1fd40 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c  age reach 0, cal
1fd50 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72  l the.  ** destr
1fd60 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68  uctor and add th
1fd70 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66 72  e page to the fr
1fd80 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69  eelist..  */.  i
1fd90 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  f( pPg->nRef==0 
1fda0 29 7b 0a 0a 20 20 20 20 6c 72 75 4c 69 73 74 41  ){..    lruListA
1fdb0 64 64 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  dd(pPg);.    if(
1fdc0 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
1fdd0 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20 70 50  ctor ){.      pP
1fde0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
1fdf0 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70  r(pPg, pPager->p
1fe00 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
1fe10 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61    .    /* When a
1fe20 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74  ll pages reach t
1fe30 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f  he freelist, dro
1fe40 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20  p the read lock 
1fe50 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20  from.    ** the 
1fe60 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
1fe70 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72     */.    pPager
1fe80 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73  ->nRef--;.    as
1fe90 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52  sert( pPager->nR
1fea0 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  ef>=0 );.    if(
1feb0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
1fec0 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e 65 78   && (!pPager->ex
1fed0 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70  clusiveMode || p
1fee0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
1fef0 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20 70 61  f>0) ){.      pa
1ff00 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c  gerUnlockAndRoll
1ff10 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
1ff20 20 20 7d 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c    }.  }.  pagerL
1ff30 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
1ff40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1ff50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
1ff60 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  e a journal file
1ff70 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68   for pPager.  Th
1ff80 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61  ere should alrea
1ff90 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45 44  dy be a RESERVED
1ffa0 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45  .** or EXCLUSIVE
1ffb0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1ffc0 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20  abase file when 
1ffd0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1ffe0 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65  called..**.** Re
1fff0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69  turn SQLITE_OK i
20000 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52  f everything.  R
20010 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63  eturn an error c
20020 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20  ode and release 
20030 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63  the.** write loc
20040 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f  k if anything go
20050 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61  es wrong..*/.sta
20060 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70  tic int pager_op
20070 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72  en_journal(Pager
20080 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 73 71 6c   *pPager){.  sql
20090 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
200a0 20 70 50 61 67 65 72 2d 3e 70 56 66 73 3b 0a 20   pPager->pVfs;. 
200b0 20 69 6e 74 20 66 6c 61 67 73 20 3d 20 28 53 51   int flags = (SQ
200c0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
200d0 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
200e0 45 58 43 4c 55 53 49 56 45 7c 53 51 4c 49 54 45  EXCLUSIVE|SQLITE
200f0 5f 4f 50 45 4e 5f 43 52 45 41 54 45 29 3b 0a 0a  _OPEN_CREATE);..
20100 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
20110 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20  rt( !MEMDB );.  
20120 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
20130 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
20140 45 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72  ERVED );.  asser
20150 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
20160 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61  alOpen==0 );.  a
20170 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75  ssert( pPager->u
20180 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 61  seJournal );.  a
20190 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
201a0 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a  InJournal==0 );.
201b0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
201c0 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
201d0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
201e0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
201f0 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >pInJournal = sq
20200 6c 69 74 65 33 42 69 74 76 65 63 43 72 65 61 74  lite3BitvecCreat
20210 65 28 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  e(pPager->dbSize
20220 29 3b 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  );.  pagerEnter(
20230 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70  pPager);.  if( p
20240 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
20250 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
20260 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
20270 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
20280 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
20290 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65    }..  if( pPage
202a0 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
202b0 20 20 20 66 6c 61 67 73 20 7c 3d 20 28 53 51 4c     flags |= (SQL
202c0 49 54 45 5f 4f 50 45 4e 5f 44 45 4c 45 54 45 4f  ITE_OPEN_DELETEO
202d0 4e 43 4c 4f 53 45 7c 53 51 4c 49 54 45 5f 4f 50  NCLOSE|SQLITE_OP
202e0 45 4e 5f 54 45 4d 50 5f 4a 4f 55 52 4e 41 4c 29  EN_TEMP_JOURNAL)
202f0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  ;.  }else{.    f
20300 6c 61 67 73 20 7c 3d 20 28 53 51 4c 49 54 45 5f  lags |= (SQLITE_
20310 4f 50 45 4e 5f 4d 41 49 4e 5f 4a 4f 55 52 4e 41  OPEN_MAIN_JOURNA
20320 4c 29 3b 0a 20 20 7d 0a 23 69 66 64 65 66 20 53  L);.  }.#ifdef S
20330 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41 54 4f  QLITE_ENABLE_ATO
20340 4d 49 43 5f 57 52 49 54 45 0a 20 20 72 63 20 3d  MIC_WRITE.  rc =
20350 20 73 71 6c 69 74 65 33 4a 6f 75 72 6e 61 6c 4f   sqlite3JournalO
20360 70 65 6e 28 0a 20 20 20 20 20 20 70 56 66 73 2c  pen(.      pVfs,
20370 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
20380 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l, pPager->jfd, 
20390 66 6c 61 67 73 2c 20 6a 72 6e 6c 42 75 66 66 65  flags, jrnlBuffe
203a0 72 53 69 7a 65 28 70 50 61 67 65 72 29 0a 20 20  rSize(pPager).  
203b0 29 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20  );.#else.  rc = 
203c0 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 28 70 56  sqlite3OsOpen(pV
203d0 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  fs, pPager->zJou
203e0 72 6e 61 6c 2c 20 70 50 61 67 65 72 2d 3e 6a 66  rnal, pPager->jf
203f0 64 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a 23 65  d, flags, 0);.#e
20400 6e 64 69 66 0a 20 20 61 73 73 65 72 74 28 20 72  ndif.  assert( r
20410 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
20420 70 50 61 67 65 72 2d 3e 6a 66 64 2d 3e 70 4d 65  pPager->jfd->pMe
20430 74 68 6f 64 73 20 29 3b 0a 20 20 70 50 61 67 65  thods );.  pPage
20440 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
20450 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
20460 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 70 50  Master = 0;.  pP
20470 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
20480 20 3d 20 30 3b 0a 20 20 69 66 28 20 72 63 21 3d   = 0;.  if( rc!=
20490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
204a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
204b0 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 20 20 73  NOMEM ){.      s
204c0 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70  qlite3OsDelete(p
204d0 56 66 73 2c 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  Vfs, pPager->zJo
204e0 75 72 6e 61 6c 2c 20 30 29 3b 0a 20 20 20 20 7d  urnal, 0);.    }
204f0 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
20500 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
20510 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
20520 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
20530 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
20540 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
20550 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e   pPager->needSyn
20560 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  c = 0;.  pPager-
20570 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
20580 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
20590 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Rec = 0;.  if( p
205a0 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 29  Pager->errCode )
205b0 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61 67 65  {.    rc = pPage
205c0 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20  r->errCode;.    
205d0 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f  goto failed_to_o
205e0 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d  pen_journal;.  }
205f0 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  .  pPager->origD
20600 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  bSize = pPager->
20610 64 62 53 69 7a 65 3b 0a 0a 20 20 72 63 20 3d 20  dbSize;..  rc = 
20620 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
20630 70 50 61 67 65 72 29 3b 0a 0a 20 20 69 66 28 20  pPager);..  if( 
20640 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f  pPager->stmtAuto
20650 6f 70 65 6e 20 26 26 20 72 63 3d 3d 53 51 4c 49  open && rc==SQLI
20660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
20670 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  = sqlite3PagerSt
20680 6d 74 42 65 67 69 6e 28 70 50 61 67 65 72 29 3b  mtBegin(pPager);
20690 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
206a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d  QLITE_OK && rc!=
206b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 26 26 20  SQLITE_NOMEM && 
206c0 72 63 21 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52  rc!=SQLITE_IOERR
206d0 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20 72 63  _NOMEM ){.    rc
206e0 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61   = pager_end_tra
206f0 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29  nsaction(pPager)
20700 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
20710 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20720 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c   rc = SQLITE_FUL
20730 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  L;.    }.  }.  r
20740 65 74 75 72 6e 20 72 63 3b 0a 0a 66 61 69 6c 65  eturn rc;..faile
20750 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
20760 6c 3a 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76  l:.  sqlite3Bitv
20770 65 63 44 65 73 74 72 6f 79 28 70 50 61 67 65 72  ecDestroy(pPager
20780 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->pInJournal);. 
20790 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72   pPager->pInJour
207a0 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  nal = 0;.  retur
207b0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
207c0 63 71 75 69 72 65 20 61 20 77 72 69 74 65 2d 6c  cquire a write-l
207d0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
207e0 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b 20 69  ase.  The lock i
207f0 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e 0a 2a  s removed when.*
20800 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74 68 65  * the any of the
20810 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70 70 65   following happe
20820 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20 73 71  n:.**.**   *  sq
20830 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74  lite3PagerCommit
20840 50 68 61 73 65 54 77 6f 28 29 20 69 73 20 63 61  PhaseTwo() is ca
20850 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
20860 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61  lite3PagerRollba
20870 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a  ck() is called..
20880 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 50  **   *  sqlite3P
20890 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73 20 63  agerClose() is c
208a0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
208b0 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66  qlite3PagerUnref
208c0 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
208d0 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
208e0 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
208f0 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
20900 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
20910 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
20920 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
20930 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
20940 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
20950 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
20960 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
20970 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
20980 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
20990 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
209a0 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
209b0 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
209c0 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
209d0 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
209e0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
209f0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
20a00 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
20a10 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
20a20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
20a30 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
20a40 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
20a50 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
20a60 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
20a70 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
20a80 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
20a90 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
20aa0 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
20ab0 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
20ac0 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
20ad0 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
20ae0 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
20af0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
20b00 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
20b10 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
20b20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
20b30 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
20b40 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
20b50 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
20b60 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
20b70 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
20b80 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
20b90 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
20ba0 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
20bb0 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
20bc0 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
20bd0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
20be0 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
20bf0 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
20c00 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
20c10 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
20c20 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
20c30 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
20c40 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
20c50 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
20c60 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
20c70 65 33 50 61 67 65 72 42 65 67 69 6e 28 44 62 50  e3PagerBegin(DbP
20c80 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20 65 78  age *pPg, int ex
20c90 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72 20 2a  Flag){.  Pager *
20ca0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
20cb0 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 20 3d  ager;.  int rc =
20cc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 61   SQLITE_OK;.  pa
20cd0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
20ce0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
20cf0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
20d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
20d10 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
20d20 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
20d30 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
20d40 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
20d50 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49 6e  ert( pPager->pIn
20d60 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
20d70 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
20d80 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
20d90 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
20da0 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
20db0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
20dc0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
20dd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20de0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
20df0 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Lock(pPager->fd,
20e00 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b   RESERVED_LOCK);
20e10 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
20e20 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e30 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
20e40 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
20e50 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
20e60 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
20e70 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
20e80 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
20e90 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
20ea0 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
20eb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
20ec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
20ed0 7b 0a 20 20 20 20 20 20 20 20 70 61 67 65 72 4c  {.        pagerL
20ee0 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
20ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
20f00 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
20f10 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
20f20 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
20f30 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
20f40 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
20f50 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
20f60 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
20f70 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
20f80 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
20f90 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
20fa0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
20fb0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
20fc0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
20fd0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
20fe0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
20ff0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
21000 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
21010 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
21020 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
21030 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
21040 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
21050 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
21060 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
21070 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
21080 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
21090 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
210a0 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
210b0 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
210c0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
210d0 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
210e0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
210f0 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
21100 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
21110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
21120 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
21130 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
21140 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
21150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21160 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->pInJournal==0
21170 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
21180 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
21190 61 67 65 72 29 3b 0a 20 20 20 20 70 61 67 65 72  ager);.    pager
211a0 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
211b0 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f     pPager->pInJo
211c0 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33 42  urnal = sqlite3B
211d0 69 74 76 65 63 43 72 65 61 74 65 28 20 70 50 61  itvecCreate( pPa
211e0 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 3b 0a 20  ger->dbSize );. 
211f0 20 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50     pagerEnter(pP
21200 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 21  ager);.    if( !
21210 70 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e  pPager->pInJourn
21220 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  al ){.      rc =
21230 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
21240 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
21250 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
21260 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
21270 69 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ize;.      rc = 
21280 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
21290 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
212a0 20 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50   }.  assert( !pP
212b0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
212c0 6e 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  n || pPager->jou
212d0 72 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21  rnalOff>0 || rc!
212e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20  =SQLITE_OK );.  
212f0 70 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65  pagerLeave(pPage
21300 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  r);.  return rc;
21310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 61  .}../*.** Make a
21320 20 70 61 67 65 20 64 69 72 74 79 2e 20 20 53 65   page dirty.  Se
21330 74 20 69 74 73 20 64 69 72 74 79 20 66 6c 61 67  t its dirty flag
21340 20 61 6e 64 20 61 64 64 20 69 74 20 74 6f 20 74   and add it to t
21350 68 65 20 64 69 72 74 79 0a 2a 2a 20 70 61 67 65  he dirty.** page
21360 20 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63   list..*/.static
21370 20 76 6f 69 64 20 6d 61 6b 65 44 69 72 74 79 28   void makeDirty(
21380 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
21390 66 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30  f( pPg->dirty==0
213a0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
213b0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
213c0 67 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69  ger;.    pPg->di
213d0 72 74 79 20 3d 20 31 3b 0a 20 20 20 20 70 50 67  rty = 1;.    pPg
213e0 2d 3e 70 44 69 72 74 79 20 3d 20 70 50 61 67 65  ->pDirty = pPage
213f0 72 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 69  r->pDirty;.    i
21400 66 28 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74  f( pPager->pDirt
21410 79 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  y ){.      pPage
21420 72 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65 76  r->pDirty->pPrev
21430 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20 20 20  Dirty = pPg;.   
21440 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65   }.    pPg->pPre
21450 76 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  vDirty = 0;.    
21460 70 50 61 67 65 72 2d 3e 70 44 69 72 74 79 20 3d  pPager->pDirty =
21470 20 70 50 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a   pPg;.  }.}../*.
21480 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 63  ** Make a page c
21490 6c 65 61 6e 2e 20 20 43 6c 65 61 72 20 69 74 73  lean.  Clear its
214a0 20 64 69 72 74 79 20 62 69 74 20 61 6e 64 20 72   dirty bit and r
214b0 65 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68  emove it from th
214c0 65 0a 2a 2a 20 64 69 72 74 79 20 70 61 67 65 20  e.** dirty page 
214d0 6c 69 73 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  list..*/.static 
214e0 76 6f 69 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50  void makeClean(P
214f0 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
21500 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  ( pPg->dirty ){.
21510 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
21520 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   0;.    if( pPg-
21530 3e 70 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  >pDirty ){.     
21540 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 44   assert( pPg->pD
21550 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79  irty->pPrevDirty
21560 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
21570 50 67 2d 3e 70 44 69 72 74 79 2d 3e 70 50 72 65  Pg->pDirty->pPre
21580 76 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 50  vDirty = pPg->pP
21590 72 65 76 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  revDirty;.    }.
215a0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
215b0 65 76 44 69 72 74 79 20 29 7b 0a 20 20 20 20 20  evDirty ){.     
215c0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50   assert( pPg->pP
215d0 72 65 76 44 69 72 74 79 2d 3e 70 44 69 72 74 79  revDirty->pDirty
215e0 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20 20 70  ==pPg );.      p
215f0 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 2d 3e  Pg->pPrevDirty->
21600 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44  pDirty = pPg->pD
21610 69 72 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  irty;.    }else{
21620 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
21630 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44 69 72  Pg->pPager->pDir
21640 74 79 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 20  ty==pPg );.     
21650 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 44   pPg->pPager->pD
21660 69 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72  irty = pPg->pDir
21670 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ty;.    }.  }.}.
21680 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64  ../*.** Mark a d
21690 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69 74  ata page as writ
216a0 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65  eable.  The page
216b0 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   is written into
216c0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a   the journal .**
216d0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
216e0 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68  ere already.  Th
216f0 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20  is routine must 
21700 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65  be called before
21710 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67   making.** chang
21720 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a  es to a page..**
21730 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74 69  .** The first ti
21740 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  me this routine 
21750 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70  is called, the p
21760 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20 6e  ager creates a n
21770 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e  ew.** journal an
21780 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45 53  d acquires a RES
21790 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
217a0 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66 20  e database.  If 
217b0 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  the RESERVED.** 
217c0 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62  lock could not b
217d0 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69 73  e acquired, this
217e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
217f0 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54   SQLITE_BUSY.  T
21800 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f  he.** calling ro
21810 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b  utine must check
21820 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e   for that return
21830 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61   value and be ca
21840 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20  reful not to.** 
21850 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20  change any page 
21860 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20  data until this 
21870 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20  routine returns 
21880 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a  SQLITE_OK..**.**
21890 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   If the journal 
218a0 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62  file could not b
218b0 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75 73  e written becaus
218c0 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66 75  e the disk is fu
218d0 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73  ll,.** then this
218e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
218f0 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64   SQLITE_FULL and
21900 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61   does an immedia
21910 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20  te rollback..** 
21920 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77  All subsequent w
21930 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c  rite attempts al
21940 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  so return SQLITE
21950 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72  _FULL until ther
21960 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74  e.** is a call t
21970 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f  o sqlite3PagerCo
21980 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65  mmit() or sqlite
21990 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 29  3PagerRollback()
219a0 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
219b0 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
219c0 72 5f 77 72 69 74 65 28 50 67 48 64 72 20 2a 70  r_write(PgHdr *p
219d0 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a 70 44 61  Pg){.  void *pDa
219e0 74 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41  ta = PGHDR_TO_DA
219f0 54 41 28 70 50 67 29 3b 0a 20 20 50 61 67 65 72  TA(pPg);.  Pager
21a00 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
21a10 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
21a20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
21a30 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
21a40 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
21a50 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21a60 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
21a70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a  Pager->errCode;.
21a80 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
21a90 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b 0a 20 20  ->readOnly ){.  
21aa0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
21ab0 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20 61 73 73  PERM;.  }..  ass
21ac0 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 65  ert( !pPager->se
21ad0 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20 20 43 48  tMaster );..  CH
21ae0 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
21af0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
21b00 65 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  e was previously
21b10 20 61 63 71 75 69 72 65 64 20 77 69 74 68 20 6e   acquired with n
21b20 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 61  oContent==1, tha
21b30 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20 77 65 20  t means.  ** we 
21b40 64 69 64 6e 27 74 20 72 65 61 6c 6c 79 20 72 65  didn't really re
21b50 61 64 20 69 6e 20 74 68 65 20 63 6f 6e 74 65 6e  ad in the conten
21b60 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 20 20  t of the page.  
21b70 54 68 69 73 20 63 61 6e 20 68 61 70 70 65 6e 0a  This can happen.
21b80 20 20 2a 2a 20 28 66 6f 72 20 65 78 61 6d 70 6c    ** (for exampl
21b90 65 29 20 77 68 65 6e 20 74 68 65 20 70 61 67 65  e) when the page
21ba0 20 69 73 20 62 65 69 6e 67 20 6d 6f 76 65 64 20   is being moved 
21bb0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
21bc0 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f 77 20 77    But.  ** now w
21bd0 65 20 61 72 65 20 28 70 65 72 68 61 70 73 29 20  e are (perhaps) 
21be0 6d 6f 76 69 6e 67 20 74 68 65 20 70 61 67 65 20  moving the page 
21bf0 6f 66 66 20 6f 66 20 74 68 65 20 66 72 65 65 6c  off of the freel
21c00 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20 72 65 75  ist for.  ** reu
21c10 73 65 20 61 6e 64 20 77 65 20 6e 65 65 64 20 74  se and we need t
21c20 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72 69 67 69  o know its origi
21c30 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73 6f 20 74  nal content so t
21c40 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20 20 2a 2a  hat content.  **
21c50 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69   can be stored i
21c60 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a  n the rollback j
21c70 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64 6f 20 74  ournal.  So do t
21c80 68 65 20 72 65 61 64 20 61 74 20 74 68 69 73 0a  he read at this.
21c90 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20 2a 2f 0a    ** time..  */.
21ca0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74    rc = pager_get
21cb0 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20  _content(pPg);. 
21cc0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 72   if( rc ){.    r
21cd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
21ce0 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20 70 61 67   /* Mark the pag
21cf0 65 20 61 73 20 64 69 72 74 79 2e 20 20 49 66 20  e as dirty.  If 
21d00 74 68 65 20 70 61 67 65 20 68 61 73 20 61 6c 72  the page has alr
21d10 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
21d20 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65 20 6a 6f  n.  ** to the jo
21d30 75 72 6e 61 6c 20 74 68 65 6e 20 77 65 20 63 61  urnal then we ca
21d40 6e 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  n return right a
21d50 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d 61 6b 65  way..  */.  make
21d60 44 69 72 74 79 28 70 50 67 29 3b 0a 20 20 69 66  Dirty(pPg);.  if
21d70 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c  ( pPg->inJournal
21d80 20 26 26 20 28 70 61 67 65 49 6e 53 74 61 74 65   && (pageInState
21d90 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20 70 50 61  ment(pPg) || pPa
21da0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
21db0 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
21dc0 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
21dd0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
21de0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
21df0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
21e00 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
21e10 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
21e20 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
21e30 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
21e40 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
21e50 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
21e60 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
21e70 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
21e80 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
21e90 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
21ea0 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
21eb0 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
21ec0 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
21ed0 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
21ee0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
21ef0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
21f00 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
21f10 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 42   = sqlite3PagerB
21f20 65 67 69 6e 28 70 50 67 2c 20 30 29 3b 0a 20 20  egin(pPg, 0);.  
21f30 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21f40 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
21f50 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  urn rc;.    }.  
21f60 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
21f70 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52  ->state>=PAGER_R
21f80 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69  ESERVED );.    i
21f90 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
21fa0 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65  nalOpen && pPage
21fb0 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b  r->useJournal ){
21fc0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
21fd0 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70  r_open_journal(p
21fe0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
21ff0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
22000 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
22010 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
22020 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
22030 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75  en || !pPager->u
22040 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20  seJournal );.   
22050 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
22060 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20  che = 1;.  .    
22070 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69  /* The transacti
22080 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65  on journal now e
22090 78 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76  xists and we hav
220a0 65 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  e a RESERVED or 
220b0 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53  an.    ** EXCLUS
220c0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
220d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69  main database fi
220e0 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63  le.  Write the c
220f0 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20  urrent page to. 
22100 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61     ** the transa
22110 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66  ction journal if
22120 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
22130 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f   already..    */
22140 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69  .    if( !pPg->i
22150 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61  nJournal && (pPa
22160 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
22170 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20  || MEMDB) ){.   
22180 20 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d     if( (int)pPg-
22190 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d  >pgno <= pPager-
221a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
221b0 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42         if( MEMDB
221c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50 67   ){.          Pg
221d0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
221e0 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
221f0 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
22200 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
22210 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70  E3("JOURNAL %d p
22220 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
22230 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
22240 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
22250 20 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d    assert( pHist-
22260 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20  >pOrig==0 );.   
22270 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f         pHist->pO
22280 72 69 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  rig = sqlite3_ma
22290 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
222a0 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
222b0 20 20 20 20 69 66 28 20 21 70 48 69 73 74 2d 3e      if( !pHist->
222c0 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20  pOrig ){.       
222d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
222e0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
222f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
22300 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 4f  memcpy(pHist->pO
22310 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  rig, PGHDR_TO_DA
22320 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
22330 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
22340 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
22350 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
22360 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
22370 70 44 61 74 61 32 3b 0a 0a 20 20 20 20 20 20 20  pData2;..       
22380 20 20 20 2f 2a 20 57 65 20 73 68 6f 75 6c 64 20     /* We should 
22390 6e 65 76 65 72 20 77 72 69 74 65 20 74 6f 20 74  never write to t
223a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
223b0 74 68 65 20 70 61 67 65 20 74 68 61 74 0a 20 20  the page that.  
223c0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61          ** conta
223d0 69 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65  ins the database
223e0 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20 66 6f 6c   locks.  The fol
223f0 6c 6f 77 69 6e 67 20 61 73 73 65 72 74 20 76 65  lowing assert ve
22400 72 69 66 69 65 73 0a 20 20 20 20 20 20 20 20 20  rifies.         
22410 20 2a 2a 20 74 68 61 74 20 77 65 20 64 6f 20 6e   ** that we do n
22420 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ot. */.         
22430 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 67   assert( pPg->pg
22440 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  no!=PAGER_MJ_PGN
22450 4f 28 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20  O(pPager) );.   
22460 20 20 20 20 20 20 20 70 44 61 74 61 32 20 3d 20         pData2 = 
22470 43 4f 44 45 43 32 28 70 50 61 67 65 72 2c 20 70  CODEC2(pPager, p
22480 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
22490 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
224a0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
224b0 75 6d 28 70 50 61 67 65 72 2c 20 28 75 38 2a 29  um(pPager, (u8*)
224c0 70 44 61 74 61 32 29 3b 0a 20 20 20 20 20 20 20  pData2);.       
224d0 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
224e0 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
224f0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
22500 4f 66 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  Off, pPg->pgno);
22510 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
22520 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
22530 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
22540 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
22550 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 61  pPager->jfd, pDa
22560 74 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ta2, pPager->pag
22570 65 53 69 7a 65 2c 0a 20 20 20 20 20 20 20 20 20  eSize,.         
22580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22590 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
225a0 6f 75 72 6e 61 6c 4f 66 66 20 2b 20 34 29 3b 0a  ournalOff + 4);.
225b0 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67              pPag
225c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
225d0 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
225e0 7a 65 2b 34 3b 0a 20 20 20 20 20 20 20 20 20 20  ze+4;.          
225f0 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
22600 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
22610 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
22620 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70 50  = write32bits(pP
22630 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
22640 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 63  r->journalOff, c
22650 6b 73 75 6d 29 3b 0a 20 20 20 20 20 20 20 20 20  ksum);.         
22660 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
22670 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20  alOff += 4;.    
22680 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22690 20 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54    IOTRACE(("JOUT
226a0 20 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e   %p %d %lld %d\n
226b0 22 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  ", pPager, pPg->
226c0 70 67 6e 6f 2c 20 0a 20 20 20 20 20 20 20 20 20  pgno, .         
226d0 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72            pPager
226e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 70 50  ->journalOff, pP
226f0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 29  ager->pageSize))
22700 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
22710 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33 5f 70  R_INCR(sqlite3_p
22720 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f 75 6e  ager_writej_coun
22730 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  t);.          PA
22740 47 45 52 54 52 41 43 45 35 28 22 4a 4f 55 52 4e  GERTRACE5("JOURN
22750 41 4c 20 25 64 20 70 61 67 65 20 25 64 20 6e 65  AL %d page %d ne
22760 65 64 53 79 6e 63 3d 25 64 20 68 61 73 68 28 25  edSync=%d hash(%
22770 30 38 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20  08x)\n",.       
22780 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
22790 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
227a0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
227b0 63 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73  c, pager_pagehas
227c0 68 28 70 50 67 29 29 3b 0a 0a 20 20 20 20 20 20  h(pPg));..      
227d0 20 20 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20      /* An error 
227e0 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
227f0 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
22800 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
22810 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
22820 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
22830 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
22840 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
22850 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
22860 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22870 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22880 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
22890 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
228a0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
228b0 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
228c0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
228d0 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->pInJournal!=0
228e0 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71   );.          sq
228f0 6c 69 74 65 33 42 69 74 76 65 63 53 65 74 28 70  lite3BitvecSet(p
22900 50 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61  Pager->pInJourna
22910 6c 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  l, pPg->pgno);. 
22920 20 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65           pPg->ne
22930 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
22940 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20  ->noSync;.      
22950 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
22960 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
22970 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
22980 42 69 74 76 65 63 53 65 74 28 70 50 61 67 65 72  BitvecSet(pPager
22990 2d 3e 70 49 6e 53 74 6d 74 2c 20 70 50 67 2d 3e  ->pInStmt, pPg->
229a0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
229b0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
229c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
229d0 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
229e0 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  = !pPager->journ
229f0 61 6c 53 74 61 72 74 65 64 20 26 26 20 21 70 50  alStarted && !pP
22a00 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
22a10 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
22a20 34 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67  4("APPEND %d pag
22a30 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
22a40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
22a50 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
22a60 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
22a70 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
22a80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
22a90 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  f( pPg->needSync
22aa0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
22ab0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31  er->needSync = 1
22ac0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
22ad0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
22ae0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
22af0 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65   /* If the state
22b00 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20  ment journal is 
22b10 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67  open and the pag
22b20 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a  e is not in it,.
22b30 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74      ** then writ
22b40 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61  e the current pa
22b50 67 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d  ge to the statem
22b60 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f  ent journal.  No
22b70 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74  te that.    ** t
22b80 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
22b90 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66  rnal format diff
22ba0 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ers from the sta
22bb0 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f  ndard journal fo
22bc0 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74  rmat.    ** in t
22bd0 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65  hat it omits the
22be0 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74   checksums and t
22bf0 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a  he header..    *
22c00 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
22c10 2d 3e 73 74 6d 74 49 6e 55 73 65 20 0a 20 20 20  ->stmtInUse .   
22c20 20 20 26 26 20 21 70 61 67 65 49 6e 53 74 61 74    && !pageInStat
22c30 65 6d 65 6e 74 28 70 50 67 29 20 0a 20 20 20 20  ement(pPg) .    
22c40 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67   && (int)pPg->pg
22c50 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74  no<=pPager->stmt
22c60 53 69 7a 65 20 0a 20 20 20 20 29 7b 0a 20 20 20  Size .    ){.   
22c70 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
22c80 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28 69 6e  inJournal || (in
22c90 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50 61 67  t)pPg->pgno>pPag
22ca0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
22cb0 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
22cc0 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
22cd0 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
22ce0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
22cf0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
22d00 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
22d10 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29 3b 0a 20  t->pStmt==0 );. 
22d20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
22d30 74 6d 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  tmt = sqlite3_ma
22d40 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 70 61  lloc( pPager->pa
22d50 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
22d60 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74    if( pHist->pSt
22d70 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
22d80 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e 70 53  memcpy(pHist->pS
22d90 74 6d 74 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  tmt, PGHDR_TO_DA
22da0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
22db0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
22dc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 50 41      }.        PA
22dd0 47 45 52 54 52 41 43 45 33 28 22 53 54 4d 54 2d  GERTRACE3("STMT-
22de0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
22df0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
22e00 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
22e10 6f 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67 65  o);.        page
22e20 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
22e30 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 7d 65  t(pPg);.      }e
22e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 36 34  lse{.        i64
22e50 20 6f 66 66 73 65 74 20 3d 20 70 50 61 67 65 72   offset = pPager
22e60 2d 3e 73 74 6d 74 4e 52 65 63 2a 28 34 2b 70 50  ->stmtNRec*(4+pP
22e70 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
22e80 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 70  .        char *p
22e90 44 61 74 61 32 20 3d 20 43 4f 44 45 43 32 28 70  Data2 = CODEC2(p
22ea0 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
22eb0 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20  g->pgno, 7);.   
22ec0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
22ed0 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 73 74  2bits(pPager->st
22ee0 66 64 2c 20 6f 66 66 73 65 74 2c 20 70 50 67 2d  fd, offset, pPg-
22ef0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
22f00 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
22f10 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  K ){.          r
22f20 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
22f30 74 65 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  te(pPager->stfd,
22f40 20 70 44 61 74 61 32 2c 20 70 50 61 67 65 72 2d   pData2, pPager-
22f50 3e 70 61 67 65 53 69 7a 65 2c 20 6f 66 66 73 65  >pageSize, offse
22f60 74 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t+4);.        }.
22f70 20 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41          PAGERTRA
22f80 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41  CE3("STMT-JOURNA
22f90 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
22fa0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
22fb0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
22fc0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
22fd0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
22fe0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
22ff0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23000 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52    pPager->stmtNR
23010 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 73  ec++;.        as
23020 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 49  sert( pPager->pI
23030 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
23040 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
23050 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
23060 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
23070 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23080 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65    }..  /* Update
23090 20 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69   the database si
230a0 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20  ze and return.. 
230b0 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
230c0 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
230d0 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 69  ER_SHARED );.  i
230e0 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
230f0 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
23100 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
23110 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
23120 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
23130 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
23140 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
23150 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
23160 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
23170 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
23180 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
23190 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  n rc;.}../*.** T
231a0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
231b0 75 73 65 64 20 74 6f 20 6d 61 72 6b 20 61 20 64  used to mark a d
231c0 61 74 61 2d 70 61 67 65 20 61 73 20 77 72 69 74  ata-page as writ
231d0 61 62 6c 65 2e 20 49 74 20 75 73 65 73 20 0a 2a  able. It uses .*
231e0 2a 20 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  * pager_write() 
231f0 74 6f 20 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61  to open a journa
23200 6c 20 66 69 6c 65 20 28 69 66 20 69 74 20 69 73  l file (if it is
23210 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 6f 70 65   not already ope
23220 6e 29 0a 2a 2a 20 61 6e 64 20 77 72 69 74 65 20  n).** and write 
23230 74 68 65 20 70 61 67 65 20 2a 70 44 61 74 61 20  the page *pData 
23240 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
23250 2a 2a 0a 2a 2a 20 54 68 65 20 64 69 66 66 65 72  **.** The differ
23260 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
23270 73 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70  s function and p
23280 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73 20  ager_write() is 
23290 74 68 61 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e  that this.** fun
232a0 63 74 69 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73  ction also deals
232b0 20 77 69 74 68 20 74 68 65 20 73 70 65 63 69 61   with the specia
232c0 6c 20 63 61 73 65 20 77 68 65 72 65 20 32 20 6f  l case where 2 o
232d0 72 20 6d 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20  r more pages.** 
232e0 66 69 74 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20  fit on a single 
232f0 64 69 73 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20  disk sector. In 
23300 74 68 69 73 20 63 61 73 65 20 61 6c 6c 20 63 6f  this case all co
23310 2d 72 65 73 69 64 65 6e 74 20 70 61 67 65 73 0a  -resident pages.
23320 2a 2a 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ** must have bee
23330 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
23340 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 62 65   journal file be
23350 66 6f 72 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a  fore returning..
23360 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
23370 67 65 72 57 72 69 74 65 28 44 62 50 61 67 65 20  gerWrite(DbPage 
23380 2a 70 44 62 50 61 67 65 29 7b 0a 20 20 69 6e 74  *pDbPage){.  int
23390 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
233a0 0a 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  ..  PgHdr *pPg =
233b0 20 70 44 62 50 61 67 65 3b 0a 20 20 50 61 67 65   pDbPage;.  Page
233c0 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
233d0 3e 70 50 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20  >pPager;.  Pgno 
233e0 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 20 3d  nPagePerSector =
233f0 20 28 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72   (pPager->sector
23400 53 69 7a 65 2f 70 50 61 67 65 72 2d 3e 70 61 67  Size/pPager->pag
23410 65 53 69 7a 65 29 3b 0a 0a 20 20 70 61 67 65 72  eSize);..  pager
23420 45 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  Enter(pPager);. 
23430 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
23440 50 61 67 65 50 65 72 53 65 63 74 6f 72 3e 31 20  PagePerSector>1 
23450 29 7b 0a 20 20 20 20 50 67 6e 6f 20 6e 50 61 67  ){.    Pgno nPag
23460 65 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  eCount;         
23470 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
23480 20 6f 66 20 70 61 67 65 73 20 69 6e 20 64 61 74   of pages in dat
23490 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
234a0 20 20 50 67 6e 6f 20 70 67 31 3b 20 20 20 20 20    Pgno pg1;     
234b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46              /* F
234c0 69 72 73 74 20 70 61 67 65 20 6f 66 20 74 68 65  irst page of the
234d0 20 73 65 63 74 6f 72 20 70 50 67 20 69 73 20 6c   sector pPg is l
234e0 6f 63 61 74 65 64 20 6f 6e 2e 20 2a 2f 0a 20 20  ocated on. */.  
234f0 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20 20 20    int nPage;    
23500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
23510 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73  umber of pages s
23520 74 61 72 74 69 6e 67 20 61 74 20 70 67 31 20 74  tarting at pg1 t
23530 6f 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 20  o journal */.   
23540 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 69 6e 74   int ii;.    int
23550 20 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a   needSync = 0;..
23560 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20 64      /* Set the d
23570 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74 6f  oNotSync flag to
23580 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63 61   1. This is beca
23590 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61 6c  use we cannot al
235a0 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20 20  low a journal.  
235b0 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20 62    ** header to b
235c0 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65 65  e written betwee
235d0 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75 72  n the pages jour
235e0 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66 75  naled by this fu
235f0 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20  nction..    */. 
23600 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
23610 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20  r->doNotSync==0 
23620 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
23630 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a 20  oNotSync = 1;.. 
23640 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63 6b     /* This trick
23650 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62 6f   assumes that bo
23660 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a 65  th the page-size
23670 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a 65   and sector-size
23680 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20 69   are.    ** an i
23690 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66 20  nteger power of 
236a0 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69 61  2. It sets varia
236b0 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20 69  ble pg1 to the i
236c0 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a 2a  dentifier.    **
236d0 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70 61   of the first pa
236e0 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72  ge of the sector
236f0 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20   pPg is located 
23700 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70  on..    */.    p
23710 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e 6f  g1 = ((pPg->pgno
23720 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65 72  -1) & ~(nPagePer
23730 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b 0a  Sector-1)) + 1;.
23740 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74 20  .    nPageCount 
23750 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
23760 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
23770 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67  .    if( pPg->pg
23780 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29 7b  no>nPageCount ){
23790 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20 28  .      nPage = (
237a0 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31 29  pPg->pgno - pg1)
237b0 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  +1;.    }else if
237c0 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72 53  ( (pg1+nPagePerS
237d0 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43 6f  ector-1)>nPageCo
237e0 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50 61  unt ){.      nPa
237f0 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74 2b  ge = nPageCount+
23800 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73 65  1-pg1;.    }else
23810 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
23820 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b 0a  nPagePerSector;.
23830 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
23840 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20 61  (nPage>0);.    a
23850 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d 3e  ssert(pg1<=pPg->
23860 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72  pgno);.    asser
23870 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70 50  t((pg1+nPage)>pP
23880 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20 66  g->pgno);..    f
23890 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61 67  or(ii=0; ii<nPag
238a0 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  e && rc==SQLITE_
238b0 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OK; ii++){.     
238c0 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b 69   Pgno pg = pg1+i
238d0 69 3b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a  i;.      PgHdr *
238e0 70 50 61 67 65 3b 0a 20 20 20 20 20 20 69 66 28  pPage;.      if(
238f0 20 70 67 3d 3d 70 50 67 2d 3e 70 67 6e 6f 20 7c   pg==pPg->pgno |
23900 7c 20 21 73 71 6c 69 74 65 33 42 69 74 76 65 63  | !sqlite3Bitvec
23910 54 65 73 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  Test(pPager->pIn
23920 4a 6f 75 72 6e 61 6c 2c 20 70 67 29 20 29 7b 0a  Journal, pg) ){.
23930 20 20 20 20 20 20 20 20 69 66 28 20 70 67 21 3d          if( pg!=
23940 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50  PAGER_MJ_PGNO(pP
23950 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20  ager) ){.       
23960 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
23970 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c 20  agerGet(pPager, 
23980 70 67 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 20  pg, &pPage);.   
23990 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
239a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
239b0 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
239c0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
239d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
239e0 20 70 50 61 67 65 2d 3e 6e 65 65 64 53 79 6e 63   pPage->needSync
239f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
23a00 20 20 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a    needSync = 1;.
23a10 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
23a20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
23a30 33 50 61 67 65 72 55 6e 72 65 66 28 70 50 61 67  3PagerUnref(pPag
23a40 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
23a50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23a60 7d 65 6c 73 65 20 69 66 28 20 28 70 50 61 67 65  }else if( (pPage
23a70 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
23a80 70 50 61 67 65 72 2c 20 70 67 29 29 20 29 7b 0a  pPager, pg)) ){.
23a90 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
23aa0 65 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  e->needSync ){. 
23ab0 20 20 20 20 20 20 20 20 20 6e 65 65 64 53 79 6e           needSyn
23ac0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
23ad0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
23ae0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 50 67      /* If the Pg
23af0 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  Hdr.needSync fla
23b00 67 20 69 73 20 73 65 74 20 66 6f 72 20 61 6e 79  g is set for any
23b10 20 6f 66 20 74 68 65 20 6e 50 61 67 65 20 70 61   of the nPage pa
23b20 67 65 73 20 0a 20 20 20 20 2a 2a 20 73 74 61 72  ges .    ** star
23b30 74 69 6e 67 20 61 74 20 70 67 31 2c 20 74 68 65  ting at pg1, the
23b40 6e 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  n it needs to be
23b50 20 73 65 74 20 66 6f 72 20 61 6c 6c 20 6f 66 20   set for all of 
23b60 74 68 65 6d 2e 20 42 65 63 61 75 73 65 0a 20 20  them. Because.  
23b70 20 20 2a 2a 20 77 72 69 74 69 6e 67 20 74 6f 20    ** writing to 
23b80 61 6e 79 20 6f 66 20 74 68 65 73 65 20 6e 50 61  any of these nPa
23b90 67 65 20 70 61 67 65 73 20 6d 61 79 20 64 61 6d  ge pages may dam
23ba0 61 67 65 20 74 68 65 20 6f 74 68 65 72 73 2c 20  age the others, 
23bb0 74 68 65 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  the.    ** journ
23bc0 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 63 6f 6e  al file must con
23bd0 74 61 69 6e 20 73 79 6e 63 28 29 65 64 20 63 6f  tain sync()ed co
23be0 70 69 65 73 20 6f 66 20 61 6c 6c 20 6f 66 20 74  pies of all of t
23bf0 68 65 6d 0a 20 20 20 20 2a 2a 20 62 65 66 6f 72  hem.    ** befor
23c00 65 20 61 6e 79 20 6f 66 20 74 68 65 6d 20 63 61  e any of them ca
23c10 6e 20 62 65 20 77 72 69 74 74 65 6e 20 6f 75 74  n be written out
23c20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
23c30 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
23c40 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 20 29    if( needSync )
23c50 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30  {.      for(ii=0
23c60 3b 20 69 69 3c 6e 50 61 67 65 20 26 26 20 6e 65  ; ii<nPage && ne
23c70 65 64 53 79 6e 63 3b 20 69 69 2b 2b 29 7b 0a 20  edSync; ii++){. 
23c80 20 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50         PgHdr *pP
23c90 61 67 65 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b  age = pager_look
23ca0 75 70 28 70 50 61 67 65 72 2c 20 70 67 31 2b 69  up(pPager, pg1+i
23cb0 69 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  i);.        if( 
23cc0 70 50 61 67 65 20 29 20 70 50 61 67 65 2d 3e 6e  pPage ) pPage->n
23cd0 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
23ce0 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72     }.      asser
23cf0 74 28 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  t(pPager->needSy
23d00 6e 63 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  nc);.    }..    
23d10 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
23d20 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31 20 29 3b 0a  doNotSync==1 );.
23d30 20 20 20 20 70 50 61 67 65 72 2d 3e 64 6f 4e 6f      pPager->doNo
23d40 74 53 79 6e 63 20 3d 20 30 3b 0a 20 20 7d 65 6c  tSync = 0;.  }el
23d50 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  se{.    rc = pag
23d60 65 72 5f 77 72 69 74 65 28 70 44 62 50 61 67 65  er_write(pDbPage
23d70 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72 4c 65  );.  }.  pagerLe
23d80 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ave(pPager);.  r
23d90 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
23da0 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
23db0 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65 6e  f the page given
23dc0 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74   in the argument
23dd0 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20   was previously 
23de0 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c  passed.** to sql
23df0 69 74 65 33 50 61 67 65 72 57 72 69 74 65 28 29  ite3PagerWrite()
23e00 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
23e10 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69  s, return TRUE i
23e20 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f  f it is ok.** to
23e30 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74   change the cont
23e40 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e  ent of the page.
23e50 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  .*/.#ifndef NDEB
23e60 55 47 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  UG.int sqlite3Pa
23e70 67 65 72 49 73 77 72 69 74 65 61 62 6c 65 28 44  gerIswriteable(D
23e80 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72  bPage *pPg){.  r
23e90 65 74 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79  eturn pPg->dirty
23ea0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e  ;.}.#endif..#ifn
23eb0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
23ec0 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70  VACUUM./*.** Rep
23ed0 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  lace the content
23ee0 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   of a single pag
23ef0 65 20 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72  e with the infor
23f00 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68  mation in the th
23f10 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e  ird.** argument.
23f20 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
23f30 61 67 65 72 4f 76 65 72 77 72 69 74 65 28 50 61  agerOverwrite(Pa
23f40 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
23f50 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44  o pgno, void *pD
23f60 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
23f70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  Pg;.  int rc;.. 
23f80 20 70 61 67 65 72 45 6e 74 65 72 28 70 50 61 67   pagerEnter(pPag
23f90 65 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  er);.  rc = sqli
23fa0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
23fb0 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 67 29 3b  er, pgno, &pPg);
23fc0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
23fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
23fe0 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69   sqlite3PagerWri
23ff0 74 65 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28  te(pPg);.    if(
24000 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
24010 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 73  {.      memcpy(s
24020 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 44 61  qlite3PagerGetDa
24030 74 61 28 70 50 67 29 2c 20 70 44 61 74 61 2c 20  ta(pPg), pData, 
24040 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
24050 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
24060 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70  ite3PagerUnref(p
24070 50 67 29 3b 0a 20 20 7d 0a 20 20 70 61 67 65 72  Pg);.  }.  pager
24080 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20  Leave(pPager);. 
24090 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65   return rc;.}.#e
240a0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  ndif../*.** A ca
240b0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
240c0 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
240d0 65 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f  er that it is no
240e0 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a  t necessary to.*
240f0 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f  * write the info
24100 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20  rmation on page 
24110 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68 65 20  pPg back to the 
24120 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67  disk, even thoug
24130 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d  h.** that page m
24140 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61  ight be marked a
24150 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54  s dirty..**.** T
24160 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66  he overlying sof
24170 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c  tware layer call
24180 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  s this routine w
24190 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64  hen all of the d
241a0 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69  ata.** on the gi
241b0 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73  ven page is unus
241c0 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d  ed.  The pager m
241d0 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73  arks the page as
241e0 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61   clean so.** tha
241f0 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65  t it does not ge
24200 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73  t written to dis
24210 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73  k..**.** Tests s
24220 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70  how that this op
24230 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65  timization, toge
24240 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a  ther with the.**
24250 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e   sqlite3PagerDon
24260 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f  tRollback() belo
24270 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75  w, more than dou
24280 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a  ble the speed.**
24290 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54   of large INSERT
242a0 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20   operations and 
242b0 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73 70  quadruple the sp
242c0 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c  eed of large DEL
242d0 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e  ETEs..**.** When
242e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
242f0 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65   called, set the
24300 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
24310 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a  flag to true..**
24320 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c   Subsequent call
24330 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  s to sqlite3Page
24340 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20  rDontRollback() 
24350 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
24360 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
24370 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
24380 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
24390 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
243a0 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
243b0 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
243c0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
243d0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
243e0 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
243f0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
24400 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
24410 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
24420 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
24430 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
24440 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
24450 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
24460 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
24470 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
24480 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
24490 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
244a0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
244b0 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
244c0 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65 33 50  .** the sqlite3P
244d0 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b  agerDontRollback
244e0 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  () routine is ca
244f0 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63 61 75  lled.  But becau
24500 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63  se the.** page c
24510 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63 61 6c  ontains critical
24520 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20   data, we still 
24530 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72 65 20  need to be sure 
24540 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c 6c 65  it gets.** rolle
24550 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74 65 20  d back in spite 
24560 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33 50 61  of the sqlite3Pa
24570 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
24580 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
24590 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74  sqlite3PagerDont
245a0 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
245b0 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20  bPage){.  PgHdr 
245c0 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65 3b 0a  *pPg = pDbPage;.
245d0 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
245e0 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
245f0 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65    if( MEMDB ) re
24600 74 75 72 6e 3b 0a 20 20 70 61 67 65 72 45 6e 74  turn;.  pagerEnt
24610 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  er(pPager);.  pP
24620 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
24630 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
24640 2d 3e 64 69 72 74 79 20 26 26 20 21 70 50 61 67  ->dirty && !pPag
24650 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
24660 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
24670 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
24680 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20 20  R_SHARED );.    
24690 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
246a0 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70 67  ze==(int)pPg->pg
246b0 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f 72  no && pPager->or
246c0 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72 2d  igDbSize<pPager-
246d0 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  >dbSize ){.     
246e0 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67 65   /* If this page
246f0 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70 61  s is the last pa
24700 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20 61  ge in the file a
24710 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  nd the file has 
24720 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20 64  grown.      ** d
24730 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  uring the curren
24740 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20 74  t transaction, t
24750 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b 20  hen do NOT mark 
24760 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65 61  the page as clea
24770 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65 6e  n..      ** When
24780 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
24790 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75 73  le grows, we mus
247a0 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  t make sure that
247b0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a 20   the last page. 
247c0 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72 69       ** gets wri
247d0 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f 6e  tten at least on
247e0 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20 64  ce so that the d
247f0 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  isk file will be
24800 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20 20   the correct.   
24810 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20 79     ** size. If y
24820 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65 20  ou do not write 
24830 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74 68  this page and th
24840 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66 69  e size of the fi
24850 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  le.      ** on t
24860 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70 20  he disk ends up 
24870 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c  being too small,
24880 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20 74   that can lead t
24890 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  o database.     
248a0 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 64   ** corruption d
248b0 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20 74  uring the next t
248c0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
248d0 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    */.    }else{.
248e0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
248f0 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61  3("DONT_WRITE pa
24900 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20  ge %d of %d\n", 
24910 70 50 67 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  pPg->pgno, PAGER
24920 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
24930 20 20 20 49 4f 54 52 41 43 45 28 28 22 43 4c 45     IOTRACE(("CLE
24940 41 4e 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61  AN %p %d\n", pPa
24950 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 29  ger, pPg->pgno))
24960 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65 61 6e  .      makeClean
24970 28 70 50 67 29 3b 0a 23 69 66 64 65 66 20 53 51  (pPg);.#ifdef SQ
24980 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
24990 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
249a0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
249b0 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
249c0 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  if.    }.  }.  p
249d0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
249e0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  );.}../*.** A ca
249f0 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69  ll to this routi
24a00 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67  ne tells the pag
24a10 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f 6c  er that if a rol
24a20 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a 2a  lback occurs,.**
24a30 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
24a40 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65 20  sary to restore 
24a50 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65 20  the data on the 
24a60 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68 69  given page.  Thi
24a70 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  s.** means that 
24a80 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20 6e  the pager does n
24a90 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f 72  ot have to recor
24aa0 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  d the given page
24ab0 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c 62   in the.** rollb
24ac0 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ack journal..**.
24ad0 2a 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  ** If we have no
24ae0 74 20 79 65 74 20 61 63 74 75 61 6c 6c 79 20 72  t yet actually r
24af0 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
24b00 6f 66 20 74 68 69 73 20 70 61 67 65 20 28 69 66  of this page (if
24b10 0a 2a 2a 20 74 68 65 20 50 67 48 64 72 2e 6e 65  .** the PgHdr.ne
24b20 65 64 52 65 61 64 20 66 6c 61 67 20 69 73 20 73  edRead flag is s
24b30 65 74 29 20 74 68 65 6e 20 74 68 69 73 20 72 6f  et) then this ro
24b40 75 74 69 6e 65 20 61 63 74 73 20 61 73 20 61 20  utine acts as a 
24b50 70 72 6f 6d 69 73 65 0a 2a 2a 20 74 68 61 74 20  promise.** that 
24b60 77 65 20 77 69 6c 6c 20 6e 65 76 65 72 20 6e 65  we will never ne
24b70 65 64 20 74 6f 20 72 65 61 64 20 74 68 65 20 70  ed to read the p
24b80 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 6e 20 74  age content in t
24b90 68 65 20 66 75 74 75 72 65 2e 0a 2a 2a 20 73 6f  he future..** so
24ba0 20 74 68 65 20 6e 65 65 64 52 65 61 64 20 66 6c   the needRead fl
24bb0 61 67 20 63 61 6e 20 62 65 20 63 6c 65 61 72 65  ag can be cleare
24bc0 64 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74 2e  d at this point.
24bd0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
24be0 69 6e 65 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c  ine is only call
24bf0 65 64 20 66 72 6f 6d 20 61 20 73 69 6e 67 6c 65  ed from a single
24c00 20 70 6c 61 63 65 20 69 6e 20 74 68 65 20 73 71   place in the sq
24c10 6c 69 74 65 20 62 74 72 65 65 0a 2a 2a 20 63 6f  lite btree.** co
24c20 64 65 20 28 77 68 65 6e 20 61 20 6c 65 61 66 20  de (when a leaf 
24c30 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
24c40 74 68 65 20 66 72 65 65 2d 6c 69 73 74 29 2e 20  the free-list). 
24c50 54 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 0a  This allows the.
24c60 2a 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73  ** following ass
24c70 75 6d 70 74 69 6f 6e 73 20 74 6f 20 62 65 20 6d  umptions to be m
24c80 61 64 65 20 61 62 6f 75 74 20 70 50 67 3a 0a 2a  ade about pPg:.*
24c90 2a 0a 2a 2a 20 20 20 31 2e 20 50 61 67 65 72 44  *.**   1. PagerD
24ca0 6f 6e 74 57 72 69 74 65 28 29 20 68 61 73 20 62  ontWrite() has b
24cb0 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
24cc0 65 20 70 61 67 65 2c 20 4f 52 20 0a 2a 2a 20 20  e page, OR .**  
24cd0 20 20 20 20 50 61 67 65 72 57 72 69 74 65 28 29      PagerWrite()
24ce0 20 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65   has not yet bee
24cf0 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 65 20  n called on the 
24d00 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 32 2e  page..**.**   2.
24d10 20 54 68 65 20 70 61 67 65 20 65 78 69 73 74 65   The page existe
24d20 64 20 77 68 65 6e 20 74 68 65 20 74 72 61 6e 73  d when the trans
24d30 61 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74  action was start
24d40 65 64 2e 0a 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c  ed..**.** Detail
24d50 73 3a 20 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  s: DontRollback(
24d60 29 20 28 74 68 69 73 20 72 6f 75 74 69 6e 65 29  ) (this routine)
24d70 20 69 73 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20   is only called 
24d80 77 68 65 6e 20 61 20 6c 65 61 66 20 69 73 0a 2a  when a leaf is.*
24d90 2a 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74  * removed from t
24da0 68 65 20 66 72 65 65 20 6c 69 73 74 2e 20 44 6f  he free list. Do
24db0 6e 74 57 72 69 74 65 28 29 20 69 73 20 63 61 6c  ntWrite() is cal
24dc0 6c 65 64 20 77 68 65 6e 65 76 65 72 20 61 20 70  led whenever a p
24dd0 61 67 65 20 0a 2a 2a 20 62 65 63 6f 6d 65 73 20  age .** becomes 
24de0 61 20 66 72 65 65 2d 6c 69 73 74 20 6c 65 61 66  a free-list leaf
24df0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24e00 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
24e10 63 6b 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ck(DbPage *pPg){
24e20 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
24e30 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
24e40 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
24e50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ager);.  assert(
24e60 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
24e70 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
24e80 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 6a  ;..  /* If the j
24e90 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
24ea0 6f 74 20 6f 70 65 6e 2c 20 6f 72 20 44 6f 6e 74  ot open, or Dont
24eb0 57 72 69 74 65 28 29 20 68 61 73 20 62 65 65 6e  Write() has been
24ec0 20 63 61 6c 6c 65 64 20 6f 6e 0a 20 20 2a 2a 20   called on.  ** 
24ed0 74 68 69 73 20 70 61 67 65 20 28 44 6f 6e 74 57  this page (DontW
24ee0 72 69 74 65 28 29 20 73 65 74 73 20 74 68 65 20  rite() sets the 
24ef0 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
24f00 6c 61 67 29 2c 20 74 68 65 6e 20 74 68 69 73 0a  lag), then this.
24f10 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 69 73    ** function is
24f20 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
24f30 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75   if( pPager->jou
24f40 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 7c 7c 20 70  rnalOpen==0 || p
24f50 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
24f60 63 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c  ck || pPager->al
24f70 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a  waysRollback ){.
24f80 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28 70      pagerLeave(p
24f90 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
24fa0 72 6e 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  rn;.  }.  assert
24fb0 28 20 21 4d 45 4d 44 42 20 29 3b 20 20 20 20 2f  ( !MEMDB );    /
24fc0 2a 20 46 6f 72 20 61 20 6d 65 6d 64 62 2c 20 70  * For a memdb, p
24fd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
24fe0 65 6e 20 69 73 20 61 6c 77 61 79 73 20 30 20 2a  en is always 0 *
24ff0 2f 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 74 68  /..  /* Check th
25000 61 74 20 50 61 67 65 72 57 72 69 74 65 28 29 20  at PagerWrite() 
25010 68 61 73 20 6e 6f 74 20 79 65 74 20 62 65 65 6e  has not yet been
25020 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68 69 73 20   called on this 
25030 70 61 67 65 2c 20 61 6e 64 0a 20 20 2a 2a 20 74  page, and.  ** t
25040 68 61 74 20 74 68 65 20 70 61 67 65 20 65 78 69  hat the page exi
25050 73 74 65 64 20 77 68 65 6e 20 74 68 65 20 74 72  sted when the tr
25060 61 6e 73 61 63 74 69 6f 6e 20 73 74 61 72 74 65  ansaction starte
25070 64 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  d..  */.  assert
25080 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  ( !pPg->inJourna
25090 6c 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  l && (int)pPg->p
250a0 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
250b0 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 0a 20 20  rigDbSize );..  
250c0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
250d0 70 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b  pInJournal!=0 );
250e0 0a 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63  .  sqlite3Bitvec
250f0 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e 4a  Set(pPager->pInJ
25100 6f 75 72 6e 61 6c 2c 20 70 50 67 2d 3e 70 67 6e  ournal, pPg->pgn
25110 6f 29 3b 0a 20 20 70 50 67 2d 3e 69 6e 4a 6f 75  o);.  pPg->inJou
25120 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 70 50 67 2d  rnal = 1;.  pPg-
25130 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
25140 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
25150 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 61 73  tInUse ){.    as
25160 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
25170 6d 74 53 69 7a 65 20 3c 3d 20 70 50 61 67 65 72  mtSize <= pPager
25180 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a  ->origDbSize );.
25190 20 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65      sqlite3Bitve
251a0 63 53 65 74 28 70 50 61 67 65 72 2d 3e 70 49 6e  cSet(pPager->pIn
251b0 53 74 6d 74 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  Stmt, pPg->pgno)
251c0 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
251d0 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
251e0 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
251f0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
25200 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
25210 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 47 41  ;.  IOTRACE(("GA
25220 52 42 41 47 45 20 25 70 20 25 64 5c 6e 22 2c 20  RBAGE %p %d\n", 
25230 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
25240 6f 29 29 0a 20 20 70 61 67 65 72 4c 65 61 76 65  o)).  pagerLeave
25250 28 70 50 61 67 65 72 29 3b 0a 7d 0a 0a 0a 2f 2a  (pPager);.}.../*
25260 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
25270 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 69 6e   is called to in
25280 63 72 65 6d 65 6e 74 20 74 68 65 20 64 61 74 61  crement the data
25290 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e 67 65  base file change
252a0 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20 73 74 6f  -counter,.** sto
252b0 72 65 64 20 61 74 20 62 79 74 65 20 32 34 20 6f  red at byte 24 o
252c0 66 20 74 68 65 20 70 61 67 65 72 20 66 69 6c 65  f the pager file
252d0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
252e0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
252f0 65 63 6f 75 6e 74 65 72 28 50 61 67 65 72 20 2a  ecounter(Pager *
25300 70 50 61 67 65 72 2c 20 69 6e 74 20 69 73 44 69  pPager, int isDi
25310 72 65 63 74 29 7b 0a 20 20 50 67 48 64 72 20 2a  rect){.  PgHdr *
25320 70 50 67 48 64 72 3b 0a 20 20 75 33 32 20 63 68  pPgHdr;.  u32 ch
25330 61 6e 67 65 5f 63 6f 75 6e 74 65 72 3b 0a 20 20  ange_counter;.  
25340 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
25350 4f 4b 3b 0a 0a 20 20 69 66 28 20 21 70 50 61 67  OK;..  if( !pPag
25360 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75 6e 74 44  er->changeCountD
25370 6f 6e 65 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 70  one ){.    /* Op
25380 65 6e 20 70 61 67 65 20 31 20 6f 66 20 74 68 65  en page 1 of the
25390 20 66 69 6c 65 20 66 6f 72 20 77 72 69 74 69 6e   file for writin
253a0 67 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 73  g. */.    rc = s
253b0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 28 70  qlite3PagerGet(p
253c0 50 61 67 65 72 2c 20 31 2c 20 26 70 50 67 48 64  Pager, 1, &pPgHd
253d0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
253e0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
253f0 72 6e 20 72 63 3b 0a 0a 20 20 20 20 69 66 28 20  rn rc;..    if( 
25400 21 69 73 44 69 72 65 63 74 20 29 7b 0a 20 20 20  !isDirect ){.   
25410 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
25420 61 67 65 72 57 72 69 74 65 28 70 50 67 48 64 72  agerWrite(pPgHdr
25430 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
25440 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25450 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61 67        sqlite3Pag
25460 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
25470 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
25480 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rc;.      }.    
25490 7d 0a 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d  }..    /* Increm
254a0 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20 6a 75  ent the value ju
254b0 73 74 20 72 65 61 64 20 61 6e 64 20 77 72 69 74  st read and writ
254c0 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62 79 74  e it back to byt
254d0 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68 61  e 24. */.    cha
254e0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 73 71  nge_counter = sq
254f0 6c 69 74 65 33 47 65 74 34 62 79 74 65 28 28 75  lite3Get4byte((u
25500 38 2a 29 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  8*)pPager->dbFil
25510 65 56 65 72 73 29 3b 0a 20 20 20 20 63 68 61 6e  eVers);.    chan
25520 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20  ge_counter++;.  
25530 20 20 70 75 74 33 32 62 69 74 73 28 28 28 63 68    put32bits(((ch
25540 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54  ar*)PGHDR_TO_DAT
25550 41 28 70 50 67 48 64 72 29 29 2b 32 34 2c 20 63  A(pPgHdr))+24, c
25560 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 29 3b 0a  hange_counter);.
25570 0a 20 20 20 20 69 66 28 20 69 73 44 69 72 65 63  .    if( isDirec
25580 74 20 26 26 20 70 50 61 67 65 72 2d 3e 66 64 2d  t && pPager->fd-
25590 3e 70 4d 65 74 68 6f 64 73 20 29 7b 0a 20 20 20  >pMethods ){.   
255a0 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 7a     const void *z
255b0 42 75 66 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  Buf = PGHDR_TO_D
255c0 41 54 41 28 70 50 67 48 64 72 29 3b 0a 20 20 20  ATA(pPgHdr);.   
255d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
255e0 73 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 66  sWrite(pPager->f
255f0 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  d, zBuf, pPager-
25600 3e 70 61 67 65 53 69 7a 65 2c 20 30 29 3b 0a 20  >pageSize, 0);. 
25610 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 6c     }..    /* Rel
25620 65 61 73 65 20 74 68 65 20 70 61 67 65 20 72 65  ease the page re
25630 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20 20 20 20  ference. */.    
25640 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65  sqlite3PagerUnre
25650 66 28 70 50 67 48 64 72 29 3b 0a 20 20 20 20 70  f(pPgHdr);.    p
25660 50 61 67 65 72 2d 3e 63 68 61 6e 67 65 43 6f 75  Pager->changeCou
25670 6e 74 44 6f 6e 65 20 3d 20 31 3b 0a 20 20 7d 0a  ntDone = 1;.  }.
25680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
25690 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 64  /*.** Sync the d
256a0 61 74 61 62 61 73 65 20 66 69 6c 65 20 66 6f 72  atabase file for
256b0 20 74 68 65 20 70 61 67 65 72 20 70 50 61 67 65   the pager pPage
256c0 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74  r. zMaster point
256d0 73 20 74 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a  s to the name.**
256e0 20 6f 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   of a master jou
256f0 72 6e 61 6c 20 66 69 6c 65 20 74 68 61 74 20 73  rnal file that s
25700 68 6f 75 6c 64 20 62 65 20 77 72 69 74 74 65 6e  hould be written
25710 20 69 6e 74 6f 20 74 68 65 20 69 6e 64 69 76 69   into the indivi
25720 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  dual.** journal 
25730 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61  file. zMaster ma
25740 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68  y be NULL, which
25750 20 69 73 20 69 6e 74 65 72 70 72 65 74 65 64 20   is interpreted 
25760 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20  as no master.** 
25770 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c  journal (a singl
25780 65 20 64 61 74 61 62 61 73 65 20 74 72 61 6e 73  e database trans
25790 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54  action)..**.** T
257a0 68 69 73 20 72 6f 75 74 69 6e 65 20 65 6e 73 75  his routine ensu
257b0 72 65 73 20 74 68 61 74 20 74 68 65 20 6a 6f 75  res that the jou
257c0 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 2c 20  rnal is synced, 
257d0 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20  all dirty pages 
257e0 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68  written.** to th
257f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
25800 61 6e 64 20 74 68 65 20 64 61 74 61 62 61 73 65  and the database
25810 20 66 69 6c 65 20 73 79 6e 63 65 64 2e 20 54 68   file synced. Th
25820 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20 74 68 61  e only thing tha
25830 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20  t.** remains to 
25840 63 6f 6d 6d 69 74 20 74 68 65 20 74 72 61 6e 73  commit the trans
25850 61 63 74 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c  action is to del
25860 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ete the journal 
25870 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74  file (or.** mast
25880 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
25890 69 66 20 73 70 65 63 69 66 69 65 64 29 2e 0a 2a  if specified)..*
258a0 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 69  *.** Note that i
258b0 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c  f zMaster==NULL,
258c0 20 74 68 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f   this does not o
258d0 76 65 72 77 72 69 74 65 20 61 20 70 72 65 76 69  verwrite a previ
258e0 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73  ous value.** pas
258f0 73 65 64 20 74 6f 20 61 6e 20 73 71 6c 69 74 65  sed to an sqlite
25900 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73  3PagerCommitPhas
25910 65 4f 6e 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a  eOne() call..**.
25920 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20  ** If parameter 
25930 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65  nTrunc is non-ze
25940 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67  ro, then the pag
25950 65 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63  er file is trunc
25960 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e  ated to.** nTrun
25970 63 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73  c pages (this is
25980 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61   used by auto-va
25990 63 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e  cuum databases).
259a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
259b0 61 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f  agerCommitPhaseO
259c0 6e 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ne(Pager *pPager
259d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
259e0 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75  aster, Pgno nTru
259f0 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  nc){.  int rc = 
25a00 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41  SQLITE_OK;..  PA
25a10 47 45 52 54 52 41 43 45 34 28 22 44 41 54 41 42  GERTRACE4("DATAB
25a20 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
25a30 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
25a40 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
25a50 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
25a60 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
25a70 72 75 6e 63 29 3b 0a 20 20 70 61 67 65 72 45 6e  runc);.  pagerEn
25a80 74 65 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  ter(pPager);..  
25a90 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 6e  /* If this is an
25aa0 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f   in-memory db, o
25ab0 72 20 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20  r no pages have 
25ac0 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c  been written to,
25ad0 20 6f 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75   or this.  ** fu
25ae0 6e 63 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61  nction has alrea
25af0 64 79 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20  dy been called, 
25b00 69 74 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20  it is a no-op.. 
25b10 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
25b20 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53  ->state!=PAGER_S
25b30 59 4e 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20  YNCED && !MEMDB 
25b40 26 26 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79  && pPager->dirty
25b50 43 61 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48  Cache ){.    PgH
25b60 64 72 20 2a 70 50 67 3b 0a 0a 23 69 66 64 65 66  dr *pPg;..#ifdef
25b70 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 41   SQLITE_ENABLE_A
25b80 54 4f 4d 49 43 5f 57 52 49 54 45 0a 20 20 20 20  TOMIC_WRITE.    
25b90 2f 2a 20 54 68 65 20 61 74 6f 6d 69 63 2d 77 72  /* The atomic-wr
25ba0 69 74 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  ite optimization
25bb0 20 63 61 6e 20 62 65 20 75 73 65 64 20 69 66 20   can be used if 
25bc0 61 6c 6c 20 6f 66 20 74 68 65 0a 20 20 20 20 2a  all of the.    *
25bd0 2a 20 66 6f 6c 6c 6f 77 69 6e 67 20 61 72 65 20  * following are 
25be0 74 72 75 65 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  true:.    **.   
25bf0 20 2a 2a 20 20 20 20 2b 20 54 68 65 20 66 69 6c   **    + The fil
25c00 65 2d 73 79 73 74 65 6d 20 73 75 70 70 6f 72 74  e-system support
25c10 73 20 74 68 65 20 61 74 6f 6d 69 63 2d 77 72 69  s the atomic-wri
25c20 74 65 20 70 72 6f 70 65 72 74 79 20 66 6f 72 0a  te property for.
25c30 20 20 20 20 2a 2a 20 20 20 20 20 20 62 6c 6f 63      **      bloc
25c40 6b 73 20 6f 66 20 73 69 7a 65 20 70 61 67 65 2d  ks of size page-
25c50 73 69 7a 65 2c 20 61 6e 64 0a 20 20 20 20 2a 2a  size, and.    **
25c60 20 20 20 20 2b 20 54 68 69 73 20 63 6f 6d 6d 69      + This commi
25c70 74 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66  t is not part of
25c80 20 61 20 6d 75 6c 74 69 2d 66 69 6c 65 20 74 72   a multi-file tr
25c90 61 6e 73 61 63 74 69 6f 6e 2c 20 61 6e 64 0a 20  ansaction, and. 
25ca0 20 20 20 2a 2a 20 20 20 20 2b 20 45 78 61 63 74     **    + Exact
25cb0 6c 79 20 6f 6e 65 20 70 61 67 65 20 68 61 73 20  ly one page has 
25cc0 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 61 6e  been modified an
25cd0 64 20 73 74 6f 72 65 20 69 6e 20 74 68 65 20 6a  d store in the j
25ce0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
25cf0 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
25d00 65 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 20 63  e optimization c
25d10 61 6e 20 62 65 20 75 73 65 64 2c 20 74 68 65 6e  an be used, then
25d20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
25d30 65 20 77 69 6c 6c 20 6e 65 76 65 72 0a 20 20 20  e will never.   
25d40 20 2a 2a 20 62 65 20 63 72 65 61 74 65 64 20 66   ** be created f
25d50 6f 72 20 74 68 69 73 20 74 72 61 6e 73 61 63 74  or this transact
25d60 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ion..    */.    
25d70 69 6e 74 20 75 73 65 41 74 6f 6d 69 63 57 72 69  int useAtomicWri
25d80 74 65 20 3d 20 28 0a 20 20 20 20 20 20 20 20 21  te = (.        !
25d90 7a 4d 61 73 74 65 72 20 26 26 20 0a 20 20 20 20  zMaster && .    
25da0 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
25db0 6e 61 6c 4f 66 66 3d 3d 6a 72 6e 6c 42 75 66 66  nalOff==jrnlBuff
25dc0 65 72 53 69 7a 65 28 70 50 61 67 65 72 29 20 26  erSize(pPager) &
25dd0 26 20 0a 20 20 20 20 20 20 20 20 6e 54 72 75 6e  & .        nTrun
25de0 63 3d 3d 30 20 26 26 20 0a 20 20 20 20 20 20 20  c==0 && .       
25df0 20 28 30 3d 3d 70 50 61 67 65 72 2d 3e 70 44 69   (0==pPager->pDi
25e00 72 74 79 20 7c 7c 20 30 3d 3d 70 50 61 67 65 72  rty || 0==pPager
25e10 2d 3e 70 44 69 72 74 79 2d 3e 70 44 69 72 74 79  ->pDirty->pDirty
25e20 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
25e30 20 75 73 65 41 74 6f 6d 69 63 57 72 69 74 65 20   useAtomicWrite 
25e40 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 70 64 61  ){.      /* Upda
25e50 74 65 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  te the nRec fiel
25e60 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
25e70 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20   file. */.      
25e80 69 6e 74 20 6f 66 66 73 65 74 20 3d 20 70 50 61  int offset = pPa
25e90 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20  ger->journalHdr 
25ea0 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  + sizeof(aJourna
25eb0 6c 4d 61 67 69 63 29 3b 0a 20 20 20 20 20 20 61  lMagic);.      a
25ec0 73 73 65 72 74 28 70 50 61 67 65 72 2d 3e 6e 52  ssert(pPager->nR
25ed0 65 63 3d 3d 31 29 3b 0a 20 20 20 20 20 20 72 63  ec==1);.      rc
25ee0 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 70   = write32bits(p
25ef0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6f 66 66 73  Pager->jfd, offs
25f00 65 74 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  et, pPager->nRec
25f10 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 55 70 64  );..      /* Upd
25f20 61 74 65 20 74 68 65 20 64 62 20 66 69 6c 65 20  ate the db file 
25f30 63 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 2e 20  change counter. 
25f40 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
25f50 6c 6c 20 77 69 6c 6c 20 6d 6f 64 69 66 79 0a 20  ll will modify. 
25f60 20 20 20 20 20 2a 2a 20 74 68 65 20 69 6e 2d 6d       ** the in-m
25f70 65 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61  emory representa
25f80 74 69 6f 6e 20 6f 66 20 70 61 67 65 20 31 20 74  tion of page 1 t
25f90 6f 20 69 6e 63 6c 75 64 65 20 74 68 65 20 75 70  o include the up
25fa0 64 61 74 65 64 0a 20 20 20 20 20 20 2a 2a 20 63  dated.      ** c
25fb0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 20 61 6e  hange counter an
25fc0 64 20 74 68 65 6e 20 77 72 69 74 65 20 70 61 67  d then write pag
25fd0 65 20 31 20 64 69 72 65 63 74 6c 79 20 74 6f 20  e 1 directly to 
25fe0 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20  the database.   
25ff0 20 20 20 2a 2a 20 66 69 6c 65 2e 20 42 65 63 61     ** file. Beca
26000 75 73 65 20 6f 66 20 74 68 65 20 61 74 6f 6d 69  use of the atomi
26010 63 2d 77 72 69 74 65 20 70 72 6f 70 65 72 74 79  c-write property
26020 20 6f 66 20 74 68 65 20 68 6f 73 74 20 66 69 6c   of the host fil
26030 65 2d 73 79 73 74 65 6d 2c 20 0a 20 20 20 20 20  e-system, .     
26040 20 2a 2a 20 74 68 69 73 20 69 73 20 73 61 66 65   ** this is safe
26050 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
26060 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26070 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  OK ){.        rc
26080 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68   = pager_incr_ch
26090 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67  angecounter(pPag
260a0 65 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 0a  er, 1);.      }.
260b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
260c0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4a 6f 75   rc = sqlite3Jou
260d0 72 6e 61 6c 43 72 65 61 74 65 28 70 50 61 67 65  rnalCreate(pPage
260e0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 7d 0a 0a  r->jfd);.    }..
260f0 20 20 20 20 69 66 28 20 21 75 73 65 41 74 6f 6d      if( !useAtom
26100 69 63 57 72 69 74 65 20 26 26 20 72 63 3d 3d 53  icWrite && rc==S
26110 51 4c 49 54 45 5f 4f 4b 20 29 0a 23 65 6e 64 69  QLITE_OK ).#endi
26120 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  f..    /* If a m
26130 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
26140 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
26150 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
26160 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
26170 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
26180 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
26190 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
261a0 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
261b0 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
261c0 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
261d0 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
261e0 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
261f0 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
26200 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
26210 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
26220 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
26230 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
26240 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
26250 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
26260 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
26270 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
26280 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
26290 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
262a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
262b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
262c0 65 6e 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  en );.      rc =
262d0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
262e0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
262f0 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
26300 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
26310 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
26320 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
26330 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
26340 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
26350 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
26360 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
26370 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
26380 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
26390 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
263a0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
263b0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
263c0 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
263d0 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
263e0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
263f0 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
26400 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
26410 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
26420 20 20 20 69 6e 74 20 69 53 6b 69 70 20 3d 20 50     int iSkip = P
26430 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
26440 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  ger);.        fo
26450 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b 20 69  r( i=nTrunc+1; i
26460 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
26470 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20 20 20  Size; i++ ){.   
26480 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
26490 74 65 33 42 69 74 76 65 63 54 65 73 74 28 70 50  te3BitvecTest(pP
264a0 61 67 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c  ager->pInJournal
264b0 2c 20 69 29 20 26 26 20 69 21 3d 69 53 6b 69 70  , i) && i!=iSkip
264c0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
264d0 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65  rc = sqlite3Page
264e0 72 47 65 74 28 70 50 61 67 65 72 2c 20 69 2c 20  rGet(pPager, i, 
264f0 26 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  &pPg);.         
26500 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
26510 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
26520 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20  _exit;.         
26530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
26540 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b 0a  agerWrite(pPg);.
26550 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26560 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
26570 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
26580 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26590 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
265a0 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  it;.          }.
265b0 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20          } .     
265c0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
265d0 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72  rc = writeMaster
265e0 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20  Journal(pPager, 
265f0 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20  zMaster);.      
26600 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
26610 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
26620 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  it;.      rc = s
26630 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
26640 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
26650 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
26660 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
26670 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ;..#ifndef SQLIT
26680 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55  E_OMIT_AUTOVACUU
26690 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63  M.    if( nTrunc
266a0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20  !=0 ){.      rc 
266b0 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  = sqlite3PagerTr
266c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
266d0 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
266e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
266f0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
26700 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
26710 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
26720 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
26730 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
26740 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
26750 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
26760 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
26770 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
26780 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
26790 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
267a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
267b0 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
267c0 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c  =SQLITE_IOERR_BL
267d0 4f 43 4b 45 44 20 29 3b 0a 20 20 20 20 20 20 2f  OCKED );.      /
267e0 2a 20 54 68 65 20 65 72 72 6f 72 20 6d 69 67 68  * The error migh
267f0 74 20 68 61 76 65 20 6c 65 66 74 20 74 68 65 20  t have left the 
26800 64 69 72 74 79 20 6c 69 73 74 20 61 6c 6c 20 66  dirty list all f
26810 6f 75 6c 65 64 20 75 70 20 68 65 72 65 2c 0a 20  ouled up here,. 
26820 20 20 20 20 20 2a 2a 20 62 75 74 20 74 68 61 74       ** but that
26830 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72   does not matter
26840 20 62 65 63 61 75 73 65 20 69 66 20 74 68 65 20   because if the 
26850 69 66 20 74 68 65 20 64 69 72 74 79 20 6c 69 73  if the dirty lis
26860 74 20 64 69 64 0a 20 20 20 20 20 20 2a 2a 20 67  t did.      ** g
26870 65 74 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  et corrupted, th
26880 65 6e 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  en the transacti
26890 6f 6e 20 77 69 6c 6c 20 72 6f 6c 6c 20 62 61 63  on will roll bac
268a0 6b 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20 64  k and.      ** d
268b0 69 73 63 61 72 64 20 74 68 65 20 64 69 72 74 79  iscard the dirty
268c0 20 6c 69 73 74 2e 20 20 54 68 65 72 65 20 69 73   list.  There is
268d0 20 61 6e 20 61 73 73 65 72 74 20 69 6e 0a 20 20   an assert in.  
268e0 20 20 20 20 2a 2a 20 70 61 67 65 72 5f 67 65 74      ** pager_get
268f0 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
26900 28 29 20 74 68 61 74 20 76 65 72 69 66 69 65 73  () that verifies
26910 20 74 68 61 74 20 6e 6f 20 61 74 74 65 6d 70 74   that no attempt
26920 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 6d 61 64  .      ** is mad
26930 65 20 74 6f 20 75 73 65 20 61 6e 20 69 6e 76 61  e to use an inva
26940 6c 69 64 20 64 69 72 74 79 20 6c 69 73 74 2e 0a  lid dirty list..
26950 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 67        */.      g
26960 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
26970 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
26980 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a 20 20  >pDirty = 0;..  
26990 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64 61    /* Sync the da
269a0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f 0a  tabase file. */.
269b0 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
269c0 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  >noSync ){.     
269d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
269e0 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64 2c 20  ync(pPager->fd, 
269f0 70 50 61 67 65 72 2d 3e 73 79 6e 63 5f 66 6c 61  pPager->sync_fla
26a00 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 49  gs);.    }.    I
26a10 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43 20  OTRACE(("DBSYNC 
26a20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29 0a  %p\n", pPager)).
26a30 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
26a40 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45  te = PAGER_SYNCE
26a50 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 4d  D;.  }else if( M
26a60 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21 3d  EMDB && nTrunc!=
26a70 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  0 ){.    rc = sq
26a80 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61  lite3PagerTrunca
26a90 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75 6e  te(pPager, nTrun
26aa0 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  c);.  }..sync_ex
26ab0 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  it:.  if( rc==SQ
26ac0 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43 4b  LITE_IOERR_BLOCK
26ad0 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61 67  ED ){.    /* pag
26ae0 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
26af0 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74 65  unter() may atte
26b00 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61 6e  mpt to obtain an
26b10 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20 20   exclusive.     
26b20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c 20  * lock to spill 
26b30 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72 65  the cache and re
26b40 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43 4b  turn IOERR_BLOCK
26b50 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a 20  ED. But since . 
26b60 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20 6e      * there is n
26b70 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61 63  o chance the cac
26b80 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74 65  he is inconsiste
26b90 6e 74 2c 20 69 74 20 69 73 0a 20 20 20 20 20 2a  nt, it is.     *
26ba0 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
26bb0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
26bc0 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
26bd0 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
26be0 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28 70 50  .  pagerLeave(pP
26bf0 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
26c00 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  rc;.}.../*.** Co
26c10 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  mmit all changes
26c20 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
26c30 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
26c40 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a   write lock..**.
26c50 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74  ** If the commit
26c60 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72   fails for any r
26c70 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63  eason, a rollbac
26c80 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64  k attempt is mad
26c90 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f  e.** and an erro
26ca0 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e  r code is return
26cb0 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d  ed.  If the comm
26cc0 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54  it worked, SQLIT
26cd0 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72  E_OK.** is retur
26ce0 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ned..*/.int sqli
26cf0 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
26d00 61 73 65 54 77 6f 28 50 61 67 65 72 20 2a 70 50  aseTwo(Pager *pP
26d10 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
26d20 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a  .  PgHdr *pPg;..
26d30 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
26d40 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 65 74  rCode ){.    ret
26d50 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
26d60 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
26d70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
26d80 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
26d90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
26da0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 70 61  _ERROR;.  }.  pa
26db0 67 65 72 45 6e 74 65 72 28 70 50 61 67 65 72 29  gerEnter(pPager)
26dc0 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
26dd0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
26de0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
26df0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
26e00 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
26e10 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
26e20 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
26e30 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
26e40 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
26e50 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
26e60 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
26e70 72 29 3b 0a 20 20 20 20 20 20 63 6c 65 61 72 48  r);.      clearH
26e80 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20  istory(pHist);. 
26e90 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
26ea0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
26eb0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
26ec0 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74       pHist->inSt
26ed0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
26ee0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
26ef0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 50  .      pHist->pP
26f00 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73 74 2d  revStmt = pHist-
26f10 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
26f20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d        pPg = pPg-
26f30 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20  >pDirty;.    }. 
26f40 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72 74     pPager->pDirt
26f50 79 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 4e  y = 0;.#ifndef N
26f60 44 45 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50  DEBUG.    for(pP
26f70 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
26f80 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
26f90 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
26fa0 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
26fb0 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
26fc0 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
26fd0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67      assert( !pPg
26fe0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
26ff0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
27000 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20  ( !pHist->pOrig 
27010 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
27020 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29   !pHist->pStmt )
27030 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
27040 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
27050 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
27060 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
27070 53 48 41 52 45 44 3b 0a 20 20 20 20 70 61 67 65  SHARED;.    page
27080 72 4c 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a  rLeave(pPager);.
27090 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
270a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
270b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
270c0 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67  nalOpen || !pPag
270d0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
270e0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
270f0 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
27100 5f 53 59 4e 43 45 44 20 7c 7c 20 21 70 50 61 67  _SYNCED || !pPag
27110 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29  er->dirtyCache )
27120 3b 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65  ;.  rc = pager_e
27130 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 70  nd_transaction(p
27140 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70  Pager);.  rc = p
27150 61 67 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65  ager_error(pPage
27160 72 2c 20 72 63 29 3b 0a 20 20 70 61 67 65 72 4c  r, rc);.  pagerL
27170 65 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20  eave(pPager);.  
27180 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
27190 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
271a0 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
271b0 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
271c0 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
271d0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
271e0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
271f0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
27200 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
27210 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
27220 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
27230 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
27240 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
27250 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
27260 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
27270 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
27280 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
27290 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
272a0 6f 6c 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d  ol or unless som
272b0 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65  e other.** proce
272c0 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72  ss is writing tr
272d0 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ash into the jou
272e0 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54  rnal file (SQLIT
272f0 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a  E_CORRUPT) or.**
27300 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20   unless a prior 
27310 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
27320 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20  (SQLITE_NOMEM). 
27330 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   Appropriate err
27340 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20  or.** codes are 
27350 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c  returned for all
27360 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73   these occasions
27370 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a  .  Otherwise,.**
27380 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
27390 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  turned..*/.int s
273a0 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
273b0 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
273c0 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
273d0 50 41 47 45 52 54 52 41 43 45 32 28 22 52 4f 4c  PAGERTRACE2("ROL
273e0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
273f0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
27400 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
27410 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20    PgHdr *p;.    
27420 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
27430 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
27440 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
27450 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20  istory *pHist;. 
27460 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 2d       assert( !p-
27470 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
27480 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d  );.      if( !p-
27490 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
274a0 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
274b0 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
274c0 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
274d0 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  ))->pOrig );.   
274e0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28       assert( !((
274f0 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44  PgHistory *)PGHD
27500 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61  R_TO_HIST(p, pPa
27510 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a  ger))->pStmt );.
27520 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
27530 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
27540 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54   pHist = PGHDR_T
27550 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
27560 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48 69  );.      if( pHi
27570 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20  st->pOrig ){.   
27580 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44       memcpy(PGHD
27590 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48  R_TO_DATA(p), pH
275a0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67  ist->pOrig, pPag
275b0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
275c0 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
275d0 45 33 28 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47  E3("ROLLBACK-PAG
275e0 45 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  E %d of %d\n", p
275f0 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
27600 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
27610 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 50  }else{.        P
27620 41 47 45 52 54 52 41 43 45 33 28 22 50 41 47 45  AGERTRACE3("PAGE
27630 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e 20   %d is clean on 
27640 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
27650 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
27660 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
27670 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48 69  clearHistory(pHi
27680 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64 69  st);.      p->di
27690 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
276a0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b  ->inJournal = 0;
276b0 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69 6e  .      pHist->in
276c0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
276d0 70 48 69 73 74 2d 3e 70 50 72 65 76 53 74 6d 74  pHist->pPrevStmt
276e0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
276f0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  tmt = 0;.      i
27700 66 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e  f( pPager->xRein
27710 69 74 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  iter ){.        
27720 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
27730 72 28 70 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  r(p, pPager->pag
27740 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 0a  eSize);.      }.
27750 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
27760 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
27770 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20    pPager->pStmt 
27780 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
27790 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72  >dbSize = pPager
277a0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 0a 20 20  ->origDbSize;.  
277b0 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65    pager_truncate
277c0 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
277d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
277e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
277f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
27800 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
27810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
27820 4b 3b 0a 20 20 7d 0a 0a 20 20 70 61 67 65 72 45  K;.  }..  pagerE
27830 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
27840 69 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72  if( !pPager->dir
27850 74 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67  tyCache || !pPag
27860 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
27870 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
27880 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f  r_end_transactio
27890 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  n(pPager);.    p
278a0 61 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72  agerLeave(pPager
278b0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
278c0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 50 61  ;.  }..  if( pPa
278d0 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 26 26 20  ger->errCode && 
278e0 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 21  pPager->errCode!
278f0 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a  =SQLITE_FULL ){.
27900 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
27910 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
27920 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
27930 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
27940 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d  Pager, 0);.    }
27950 0a 20 20 20 20 70 61 67 65 72 4c 65 61 76 65 28  .    pagerLeave(
27960 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
27970 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43  urn pPager->errC
27980 6f 64 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ode;.  }.  if( p
27990 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
279a0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a  GER_RESERVED ){.
279b0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
279c0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
279d0 62 61 63 6b 28 70 50 61 67 65 72 2c 20 30 29 3b  back(pPager, 0);
279e0 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72  .    rc2 = pager
279f0 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
27a00 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
27a10 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
27a20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
27a30 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  2;.    }.  }else
27a40 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
27a50 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
27a60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20 70  , 0);.  }.  /* p
27a70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67 65  ager_reset(pPage
27a80 72 29 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d  r); */.  pPager-
27a90 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 0a 20  >dbSize = -1;.. 
27aa0 20 2f 2a 20 49 66 20 61 6e 20 65 72 72 6f 72 20   /* If an error 
27ab0 6f 63 63 75 72 73 20 64 75 72 69 6e 67 20 61 20  occurs during a 
27ac0 52 4f 4c 4c 42 41 43 4b 2c 20 77 65 20 63 61 6e  ROLLBACK, we can
27ad0 20 6e 6f 20 6c 6f 6e 67 65 72 20 74 72 75 73 74   no longer trust
27ae0 20 74 68 65 20 70 61 67 65 72 0a 20 20 2a 2a 20   the pager.  ** 
27af0 63 61 63 68 65 2e 20 53 6f 20 63 61 6c 6c 20 70  cache. So call p
27b00 61 67 65 72 5f 65 72 72 6f 72 28 29 20 6f 6e 20  ager_error() on 
27b10 74 68 65 20 77 61 79 20 6f 75 74 20 74 6f 20 6d  the way out to m
27b20 61 6b 65 20 61 6e 79 20 65 72 72 6f 72 20 0a 20  ake any error . 
27b30 20 2a 2a 20 70 65 72 73 69 73 74 65 6e 74 2e 0a   ** persistent..
27b40 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65    */.  rc = page
27b50 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20  r_error(pPager, 
27b60 72 63 29 3b 0a 20 20 70 61 67 65 72 4c 65 61 76  rc);.  pagerLeav
27b70 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  e(pPager);.  ret
27b80 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27b90 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
27ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
27bb0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
27bc0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
27bd0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
27be0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
27bf0 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
27c00 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27c10 61 67 65 72 49 73 72 65 61 64 6f 6e 6c 79 28 50  agerIsreadonly(P
27c20 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
27c30 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
27c40 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
27c50 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
27c60 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
27c70 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 72 2e  es to the pager.
27c80 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
27c90 61 67 65 72 52 65 66 63 6f 75 6e 74 28 50 61 67  agerRefcount(Pag
27ca0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
27cb0 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 52  eturn pPager->nR
27cc0 65 66 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51  ef;.}..#ifdef SQ
27cd0 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a 20  LITE_TEST./*.** 
27ce0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  This routine is 
27cf0 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67  used for testing
27d00 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e   and analysis on
27d10 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69  ly..*/.int *sqli
27d20 74 65 33 50 61 67 65 72 53 74 61 74 73 28 50 61  te3PagerStats(Pa
27d30 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
27d40 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
27d50 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
27d60 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
27d70 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
27d80 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
27d90 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
27da0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
27db0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
27dc0 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
27dd0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 43  ] = pPager->errC
27de0 6f 64 65 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ode;.  a[6] = pP
27df0 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
27e00 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
27e10 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 30 3b 20  ss;.  a[8] = 0; 
27e20 20 2f 2a 20 55 73 65 64 20 74 6f 20 62 65 20 70   /* Used to be p
27e30 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 20 2a 2f 0a  Pager->nOvfl */.
27e40 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
27e50 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
27e60 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
27e70 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
27e80 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 65  #endif../*.** Se
27e90 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
27ea0 72 6f 6c 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a  rollback point..
27eb0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
27ec0 6e 65 20 73 68 6f 75 6c 64 20 62 65 20 63 61 6c  ne should be cal
27ed0 6c 65 64 20 77 69 74 68 20 74 68 65 20 74 72 61  led with the tra
27ee0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
27ef0 20 61 6c 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e   already.** open
27f00 2e 20 20 41 20 6e 65 77 20 73 74 61 74 65 6d 65  .  A new stateme
27f10 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72  nt journal is cr
27f20 65 61 74 65 64 20 74 68 61 74 20 63 61 6e 20 62  eated that can b
27f30 65 20 75 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61  e used to rollba
27f40 63 6b 0a 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66  ck.** changes of
27f50 20 61 20 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f   a single SQL co
27f60 6d 6d 61 6e 64 20 77 69 74 68 69 6e 20 61 20 6c  mmand within a l
27f70 61 72 67 65 72 20 74 72 61 6e 73 61 63 74 69 6f  arger transactio
27f80 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
27f90 20 70 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28   pagerStmtBegin(
27fa0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
27fb0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
27fc0 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
27fd0 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
27fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
27ff0 65 3e 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e>=PAGER_SHARED 
28000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
28010 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30 20 29  ger->dbSize>=0 )
28020 3b 0a 20 20 50 41 47 45 52 54 52 41 43 45 32 28  ;.  PAGERTRACE2(
28030 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e  "STMT-BEGIN %d\n
28040 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
28050 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
28060 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
28070 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
28080 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53     pPager->stmtS
28090 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
280a0 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e  Size;.    return
280b0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
280c0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
280d0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
280e0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75    pPager->stmtAu
280f0 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  toopen = 1;.    
28100 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
28110 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
28120 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
28130 70 65 6e 20 29 3b 0a 20 20 70 61 67 65 72 4c 65  pen );.  pagerLe
28140 61 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 61  ave(pPager);.  a
28150 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70  ssert( pPager->p
28160 49 6e 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70  InStmt==0 );.  p
28170 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 20 3d  Pager->pInStmt =
28180 20 73 71 6c 69 74 65 33 42 69 74 76 65 63 43 72   sqlite3BitvecCr
28190 65 61 74 65 28 70 50 61 67 65 72 2d 3e 64 62 53  eate(pPager->dbS
281a0 69 7a 65 29 3b 0a 20 20 70 61 67 65 72 45 6e 74  ize);.  pagerEnt
281b0 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  er(pPager);.  if
281c0 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d  ( pPager->pInStm
281d0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  t==0 ){.    /* s
281e0 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70 50 61  qlite3OsLock(pPa
281f0 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
28200 4c 4f 43 4b 29 3b 20 2a 2f 0a 20 20 20 20 72 65  LOCK); */.    re
28210 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
28220 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e  M;.  }.#ifndef N
28230 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c  DEBUG.  rc = sql
28240 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
28250 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
28260 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
28270 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
28280 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
28290 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
282a0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
282b0 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
282c0 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
282d0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
282e0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
282f0 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
28300 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
28310 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
28320 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
28330 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
28340 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
28350 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
28360 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
28370 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
28380 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
28390 65 72 4f 70 65 6e 74 65 6d 70 28 70 50 61 67 65  erOpentemp(pPage
283a0 72 2d 3e 70 56 66 73 2c 20 70 50 61 67 65 72 2d  r->pVfs, pPager-
283b0 3e 73 74 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  >stfd, pPager->z
283c0 53 74 6d 74 4a 72 6e 6c 2c 0a 20 20 20 20 20 20  StmtJrnl,.      
283d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
283e0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4f          SQLITE_O
283f0 50 45 4e 5f 53 55 42 4a 4f 55 52 4e 41 4c 29 3b  PEN_SUBJOURNAL);
28400 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
28410 20 20 20 20 20 67 6f 74 6f 20 73 74 6d 74 5f 62       goto stmt_b
28420 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20  egin_failed;.   
28430 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73   }.    pPager->s
28440 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  tmtOpen = 1;.   
28450 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
28460 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61  c = 0;.  }.  pPa
28470 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
28480 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   1;.  return SQL
28490 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d 74 5f 62  ITE_OK;. .stmt_b
284a0 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a 20 20 69  egin_failed:.  i
284b0 66 28 20 70 50 61 67 65 72 2d 3e 70 49 6e 53 74  f( pPager->pInSt
284c0 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  mt ){.    sqlite
284d0 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28 70  3BitvecDestroy(p
284e0 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29 3b  Pager->pInStmt);
284f0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 49 6e  .    pPager->pIn
28500 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Stmt = 0;.  }.  
28510 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 69 6e 74  return rc;.}.int
28520 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
28530 74 42 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  tBegin(Pager *pP
28540 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
28550 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28 70 50  .  pagerEnter(pP
28560 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 70 61  ager);.  rc = pa
28570 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50 61  gerStmtBegin(pPa
28580 67 65 72 29 3b 0a 20 20 70 61 67 65 72 4c 65 61  ger);.  pagerLea
28590 76 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65  ve(pPager);.  re
285a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
285b0 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
285c0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
285d0 69 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d  ite3PagerStmtCom
285e0 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  mit(Pager *pPage
285f0 72 29 7b 0a 20 20 70 61 67 65 72 45 6e 74 65 72  r){.  pagerEnter
28600 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
28610 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
28620 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a  e ){.    PgHdr *
28630 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20  pPg, *pNext;.   
28640 20 50 41 47 45 52 54 52 41 43 45 32 28 22 53 54   PAGERTRACE2("ST
28650 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c  MT-COMMIT %d\n",
28660 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
28670 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44  );.    if( !MEMD
28680 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  B ){.      /* sq
28690 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28  lite3OsTruncate(
286a0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
286b0 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  ; */.      sqlit
286c0 65 33 42 69 74 76 65 63 44 65 73 74 72 6f 79 28  e3BitvecDestroy(
286d0 70 50 61 67 65 72 2d 3e 70 49 6e 53 74 6d 74 29  pPager->pInStmt)
286e0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
286f0 70 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  pInStmt = 0;.   
28700 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f   }else{.      fo
28710 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
28720 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
28730 65 78 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67  ext){.        Pg
28740 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
28750 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
28760 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
28770 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70 48 69       pNext = pHi
28780 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  st->pNextStmt;. 
28790 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
287a0 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a  Hist->inStmt );.
287b0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 69          pHist->i
287c0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
287d0 20 20 20 70 48 69 73 74 2d 3e 70 50 72 65 76 53     pHist->pPrevS
287e0 74 6d 74 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65  tmt = pHist->pNe
287f0 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  xtStmt = 0;.    
28800 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28810 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a  (pHist->pStmt);.
28820 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
28830 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
28840 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  }.    }.    pPag
28850 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
28860 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
28870 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20  mtInUse = 0;.   
28880 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
28890 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72   0;.  }.  pPager
288a0 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d  ->stmtAutoopen =
288b0 20 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65   0;.  pagerLeave
288c0 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75  (pPager);.  retu
288d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
288e0 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
288f0 61 20 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a  a statement..*/.
28900 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
28910 53 74 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67  StmtRollback(Pag
28920 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
28930 6e 74 20 72 63 3b 0a 20 20 70 61 67 65 72 45 6e  nt rc;.  pagerEn
28940 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  ter(pPager);.  i
28950 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
28960 6e 55 73 65 20 29 7b 0a 20 20 20 20 50 41 47 45  nUse ){.    PAGE
28970 52 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f  RTRACE2("STMT-RO
28980 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
28990 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
289a0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
289b0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
289c0 67 3b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  g;.      PgHisto
289d0 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20  ry *pHist;.     
289e0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
289f0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
28a00 3d 70 48 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d  =pHist->pNextStm
28a10 74 29 7b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t){.        pHis
28a20 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
28a30 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
28a40 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
28a50 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
28a60 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
28a70 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
28a80 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
28a90 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
28aa0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
28ab0 74 65 33 5f 66 72 65 65 28 70 48 69 73 74 2d 3e  te3_free(pHist->
28ac0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20  pStmt);.        
28ad0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
28ae0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
28af0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67      }.      pPag
28b00 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
28b10 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20  ger->stmtSize;. 
28b20 20 20 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63       pager_trunc
28b30 61 74 65 5f 63 61 63 68 65 28 70 50 61 67 65 72  ate_cache(pPager
28b40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
28b50 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c  LITE_OK;.    }el
28b60 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70  se{.      rc = p
28b70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61  ager_stmt_playba
28b80 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
28b90 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  }.    sqlite3Pag
28ba0 65 72 53 74 6d 74 43 6f 6d 6d 69 74 28 70 50 61  erStmtCommit(pPa
28bb0 67 65 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ger);.  }else{. 
28bc0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
28bd0 4b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  K;.  }.  pPager-
28be0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
28bf0 30 3b 0a 20 20 70 61 67 65 72 4c 65 61 76 65 28  0;.  pagerLeave(
28c00 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
28c10 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
28c20 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
28c30 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
28c40 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
28c50 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
28c60 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
28c70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
28c80 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28c90 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
28ca0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
28cb0 65 20 56 46 53 20 73 74 72 75 63 74 75 72 65 20  e VFS structure 
28cc0 66 6f 72 20 74 68 65 20 70 61 67 65 72 2e 0a 2a  for the pager..*
28cd0 2f 0a 63 6f 6e 73 74 20 73 71 6c 69 74 65 33 5f  /.const sqlite3_
28ce0 76 66 73 20 2a 73 71 6c 69 74 65 33 50 61 67 65  vfs *sqlite3Page
28cf0 72 56 66 73 28 50 61 67 65 72 20 2a 70 50 61 67  rVfs(Pager *pPag
28d00 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28d10 61 67 65 72 2d 3e 70 56 66 73 3b 0a 7d 0a 0a 2f  ager->pVfs;.}../
28d20 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
28d30 66 69 6c 65 20 68 61 6e 64 6c 65 20 66 6f 72 20  file handle for 
28d40 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
28d50 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20  e associated.** 
28d60 77 69 74 68 20 74 68 65 20 70 61 67 65 72 2e 20  with the pager. 
28d70 20 54 68 69 73 20 6d 69 67 68 74 20 72 65 74 75   This might retu
28d80 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66  rn NULL if the f
28d90 69 6c 65 20 68 61 73 0a 2a 2a 20 6e 6f 74 20 79  ile has.** not y
28da0 65 74 20 62 65 65 6e 20 6f 70 65 6e 65 64 2e 0a  et been opened..
28db0 2a 2f 0a 73 71 6c 69 74 65 33 5f 66 69 6c 65 20  */.sqlite3_file 
28dc0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 46 69 6c  *sqlite3PagerFil
28dd0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
28de0 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
28df0 72 2d 3e 66 64 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  r->fd;.}../*.** 
28e00 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
28e10 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
28e20 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
28e30 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
28e40 33 50 61 67 65 72 44 69 72 6e 61 6d 65 28 50 61  3PagerDirname(Pa
28e50 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
28e60 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a  return pPager->z
28e70 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a  Directory;.}../*
28e80 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
28e90 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
28ea0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
28eb0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
28ec0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 4a 6f 75  *sqlite3PagerJou
28ed0 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a  rnalname(Pager *
28ee0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
28ef0 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  n pPager->zJourn
28f00 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  al;.}../*.** Ret
28f10 75 72 6e 20 74 72 75 65 20 69 66 20 66 73 79 6e  urn true if fsyn
28f20 63 28 29 20 63 61 6c 6c 73 20 61 72 65 20 64 69  c() calls are di
28f30 73 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20  sabled for this 
28f40 70 61 67 65 72 2e 20 20 52 65 74 75 72 6e 20 46  pager.  Return F
28f50 41 4c 53 45 0a 2a 2a 20 69 66 20 66 73 79 6e 63  ALSE.** if fsync
28f60 28 29 73 20 61 72 65 20 65 78 65 63 75 74 65 64  ()s are executed
28f70 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 2a 2f 0a 69 6e   normally..*/.in
28f80 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4e 6f  t sqlite3PagerNo
28f90 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67  sync(Pager *pPag
28fa0 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
28fb0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 7d 0a  ager->noSync;.}.
28fc0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
28fd0 41 53 5f 43 4f 44 45 43 0a 2f 2a 0a 2a 2a 20 53  AS_CODEC./*.** S
28fe0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
28ff0 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
29000 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65 72  oid sqlite3Pager
29010 53 65 74 43 6f 64 65 63 28 0a 20 20 50 61 67 65  SetCodec(.  Page
29020 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69  r *pPager,.  voi
29030 64 20 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69  d *(*xCodec)(voi
29040 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e  d*,void*,Pgno,in
29050 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64  t),.  void *pCod
29060 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65  ecArg.){.  pPage
29070 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64  r->xCodec = xCod
29080 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43  ec;.  pPager->pC
29090 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63  odecArg = pCodec
290a0 41 72 67 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  Arg;.}.#endif..#
290b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
290c0 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a  IT_AUTOVACUUM./*
290d0 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67  .** Move the pag
290e0 65 20 70 50 67 20 74 6f 20 6c 6f 63 61 74 69 6f  e pPg to locatio
290f0 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69  n pgno in the fi
29100 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  le..**.** There 
29110 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
29120 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
29130 65 20 70 72 65 76 69 6f 75 73 6c 79 20 6c 6f 63  e previously loc
29140 61 74 65 64 20 61 74 0a 2a 2a 20 70 67 6e 6f 20  ated at.** pgno 
29150 28 77 68 69 63 68 20 77 65 20 63 61 6c 6c 20 70  (which we call p
29160 50 67 4f 6c 64 29 20 74 68 6f 75 67 68 20 74 68  PgOld) though th
29170 61 74 20 70 61 67 65 20 69 73 20 61 6c 6c 6f 77  at page is allow
29180 65 64 20 74 6f 20 62 65 0a 2a 2a 20 69 6e 20 63  ed to be.** in c
29190 61 63 68 65 2e 20 20 49 66 20 74 68 65 20 70 61  ache.  If the pa
291a0 67 65 20 70 72 65 76 69 6f 75 73 20 6c 6f 63 61  ge previous loca
291b0 74 65 64 20 61 74 20 70 67 6e 6f 20 69 73 20 6e  ted at pgno is n
291c0 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
291d0 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f   the rollback jo
291e0 75 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74  urnal, it is not
291f0 20 70 75 74 20 74 68 65 72 65 20 62 79 20 62 79   put there by by
29200 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
29210 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
29220 74 6f 20 74 68 65 20 70 61 67 65 20 70 50 67 20  to the page pPg 
29230 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
29240 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
29250 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
29260 65 64 20 77 69 74 68 20 70 50 67 20 28 69 2e 65  ed with pPg (i.e
29270 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e  . data stored in
29280 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65   the nExtra byte
29290 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61  s.** allocated a
292a0 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61  long with the pa
292b0 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f  ge) is the respo
292c0 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
292d0 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   caller..**.** A
292e0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73   transaction mus
292f0 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e  t be active when
29300 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
29310 20 63 61 6c 6c 65 64 2e 20 49 74 20 75 73 65 64   called. It used
29320 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71 75 69 72   to be.** requir
29330 65 64 20 74 68 61 74 20 61 20 73 74 61 74 65 6d  ed that a statem
29340 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ent transaction 
29350 77 61 73 20 6e 6f 74 20 61 63 74 69 76 65 2c 20  was not active, 
29360 62 75 74 20 74 68 69 73 20 72 65 73 74 72 69 63  but this restric
29370 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62 65 65 6e  tion.** has been
29380 20 72 65 6d 6f 76 65 64 20 28 43 52 45 41 54 45   removed (CREATE
29390 20 49 4e 44 45 58 20 6e 65 65 64 73 20 74 6f 20   INDEX needs to 
293a0 6d 6f 76 65 20 61 20 70 61 67 65 20 77 68 65 6e  move a page when
293b0 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a 20   a statement.** 
293c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61  transaction is a
293d0 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e 74 20 73  ctive)..*/.int s
293e0 71 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70  qlite3PagerMovep
293f0 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
29400 72 2c 20 44 62 50 61 67 65 20 2a 70 50 67 2c 20  r, DbPage *pPg, 
29410 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67  Pgno pgno){.  Pg
29420 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 20 2f 2a  Hdr *pPgOld;  /*
29430 20 54 68 65 20 70 61 67 65 20 62 65 69 6e 67 20   The page being 
29440 6f 76 65 72 77 72 69 74 74 65 6e 2e 20 2a 2f 0a  overwritten. */.
29450 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
29460 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
29470 3b 0a 0a 20 20 70 61 67 65 72 45 6e 74 65 72 28  ;..  pagerEnter(
29480 70 50 61 67 65 72 29 3b 0a 20 20 61 73 73 65 72  pPager);.  asser
29490 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29  t( pPg->nRef>0 )
294a0 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43 45 35  ;..  PAGERTRACE5
294b0 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25  ("MOVE %d page %
294c0 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20  d (needSync=%d) 
294d0 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20  moves to %d\n", 
294e0 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70  .      PAGERID(p
294f0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
29500 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
29510 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54 52 41  , pgno);.  IOTRA
29520 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25 64 20  CE(("MOVE %p %d 
29530 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
29540 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f 29 29  Pg->pgno, pgno))
29550 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f 63 6f  ..  pager_get_co
29560 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 69 66  ntent(pPg);.  if
29570 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
29580 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
29590 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
295a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
295b0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
295c0 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
295d0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
295e0 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
295f0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
29600 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
29610 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
29620 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
29630 6f 6d 20 69 74 73 20 68 61 73 68 2d 63 68 61 69  om its hash-chai
29640 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
29650 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
29660 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
29670 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
29680 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
29690 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
296a0 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
296b0 6f 6d 20 69 74 73 20 68 61 73 68 20 63 68 61 69  om its hash chai
296c0 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20  n. Also, if the 
296d0 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77  PgHdr.needSync w
296e0 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a  as set for .  **
296f0 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72   page pgno befor
29700 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65  e the 'move' ope
29710 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73  ration, it needs
29720 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20   to be retained 
29730 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61  .  ** for the pa
29740 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a  ge moved there..
29750 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 6e 65 65 64    */.  pPg->need
29760 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 67 4f  Sync = 0;.  pPgO
29770 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
29780 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
29790 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
297a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
297b0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
297c0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
297d0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
297e0 6c 64 29 3b 0a 20 20 20 20 6d 61 6b 65 43 6c 65  ld);.    makeCle
297f0 61 6e 28 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  an(pPgOld);.    
29800 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
29810 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
29820 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
29830 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
29840 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 69 6e 4a  ;.  }.  pPg->inJ
29850 6f 75 72 6e 61 6c 20 3d 20 73 71 6c 69 74 65 33  ournal = sqlite3
29860 42 69 74 76 65 63 54 65 73 74 28 70 50 61 67 65  BitvecTest(pPage
29870 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70  r->pInJournal, p
29880 67 6e 6f 29 3b 0a 0a 20 20 2f 2a 20 43 68 61 6e  gno);..  /* Chan
29890 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
298a0 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
298b0 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
298c0 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
298d0 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  . */.  assert( p
298e0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d  gno!=0 );.  pPg-
298f0 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
29900 68 20 3d 20 70 67 6e 6f 20 26 20 28 70 50 61 67  h = pgno & (pPag
29910 65 72 2d 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20  er->nHash-1);.  
29920 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  if( pPager->aHas
29930 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65  h[h] ){.    asse
29940 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
29950 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d  h[h]->pPrevHash=
29960 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
29970 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65  ->aHash[h]->pPre
29980 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d  vHash = pPg;.  }
29990 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  .  pPg->pNextHas
299a0 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
299b0 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  h[h];.  pPager->
299c0 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a  aHash[h] = pPg;.
299d0 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
299e0 20 3d 20 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72   = 0;..  makeDir
299f0 74 79 28 70 50 67 29 3b 0a 20 20 70 50 61 67 65  ty(pPg);.  pPage
29a00 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20  r->dirtyCache = 
29a10 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79  1;..  if( needSy
29a20 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a  ncPgno ){.    /*
29a30 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f   If needSyncPgno
29a40 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
29a50 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  en the journal f
29a60 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ile needs to be 
29a70 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64  .    ** sync()ed
29a80 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61   before any data
29a90 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64   is written to d
29aa0 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67  atabase file pag
29ab0 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a  e needSyncPgno..
29ac0 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79      ** Currently
29ad0 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65  , no such page e
29ae0 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67  xists in the pag
29af0 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20  e-cache and the 
29b00 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 70 49  .    ** Pager.pI
29b10 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73  nJournal bit has
29b20 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20   been set. This 
29b30 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65  needs to be reme
29b40 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a  died by loading.
29b50 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20      ** the page 
29b60 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63  into the pager-c
29b70 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67  ache and setting
29b80 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
29b90 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a  ync flag..    **
29ba0 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 61  .    ** If the a
29bb0 74 74 65 6d 70 74 20 74 6f 20 6c 6f 61 64 20 74  ttempt to load t
29bc0 68 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65  he page into the
29bd0 20 70 61 67 65 2d 63 61 63 68 65 20 66 61 69 6c   page-cache fail
29be0 73 2c 20 28 64 75 65 0a 20 20 20 20 2a 2a 20 74  s, (due.    ** t
29bf0 6f 20 61 20 6d 61 6c 6c 6f 63 28 29 20 6f 72 20  o a malloc() or 
29c00 49 4f 20 66 61 69 6c 75 72 65 29 2c 20 63 6c 65  IO failure), cle
29c10 61 72 20 74 68 65 20 62 69 74 20 69 6e 20 74 68  ar the bit in th
29c20 65 20 70 49 6e 4a 6f 75 72 6e 61 6c 5b 5d 0a 20  e pInJournal[]. 
29c30 20 20 20 2a 2a 20 61 72 72 61 79 2e 20 4f 74 68     ** array. Oth
29c40 65 72 77 69 73 65 2c 20 69 66 20 74 68 65 20 70  erwise, if the p
29c50 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 61 6e  age is loaded an
29c60 64 20 77 72 69 74 74 65 6e 20 61 67 61 69 6e 20  d written again 
29c70 69 6e 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 74  in.    ** this t
29c80 72 61 6e 73 61 63 74 69 6f 6e 2c 20 69 74 20 6d  ransaction, it m
29c90 61 79 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f  ay be written to
29ca0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
29cb0 6c 65 20 62 65 66 6f 72 65 0a 20 20 20 20 2a 2a  le before.    **
29cc0 20 69 74 20 69 73 20 73 79 6e 63 65 64 20 69 6e   it is synced in
29cd0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
29ce0 69 6c 65 2e 20 54 68 69 73 20 77 61 79 2c 20 69  ile. This way, i
29cf0 74 20 6d 61 79 20 65 6e 64 20 75 70 20 69 6e 0a  t may end up in.
29d00 20 20 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e      ** the journ
29d10 61 6c 20 66 69 6c 65 20 74 77 69 63 65 2c 20 62  al file twice, b
29d20 75 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  ut that is not a
29d30 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20 2a 2a   problem..    **
29d40 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69  .    ** The sqli
29d50 74 65 33 50 61 67 65 72 47 65 74 28 29 20 63 61  te3PagerGet() ca
29d60 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
29d70 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
29d80 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
29d90 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
29da0 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
29db0 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
29dc0 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
29dd0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
29de0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
29df0 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
29e00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29e10 50 61 67 65 72 47 65 74 28 70 50 61 67 65 72 2c  PagerGet(pPager,
29e20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26   needSyncPgno, &
29e30 70 50 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28  pPgHdr);.    if(
29e40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
29e50 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  {.      if( pPag
29e60 65 72 2d 3e 70 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->pInJournal &
29e70 26 20 28 69 6e 74 29 6e 65 65 64 53 79 6e 63 50  & (int)needSyncP
29e80 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69  gno<=pPager->ori
29e90 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
29ea0 20 20 20 73 71 6c 69 74 65 33 42 69 74 76 65 63     sqlite3Bitvec
29eb0 43 6c 65 61 72 28 70 50 61 67 65 72 2d 3e 70 49  Clear(pPager->pI
29ec0 6e 4a 6f 75 72 6e 61 6c 2c 20 6e 65 65 64 53 79  nJournal, needSy
29ed0 6e 63 50 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ncPgno);.      }
29ee0 0a 20 20 20 20 20 20 70 61 67 65 72 4c 65 61 76  .      pagerLeav
29ef0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
29f00 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
29f10 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  }.    pPager->ne
29f20 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
29f30 70 50 67 48 64 72 2d 3e 6e 65 65 64 53 79 6e 63  pPgHdr->needSync
29f40 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 48 64 72   = 1;.    pPgHdr
29f50 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
29f60 0a 20 20 20 20 6d 61 6b 65 44 69 72 74 79 28 70  .    makeDirty(p
29f70 50 67 48 64 72 29 3b 0a 20 20 20 20 73 71 6c 69  PgHdr);.    sqli
29f80 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 70 50  te3PagerUnref(pP
29f90 67 48 64 72 29 3b 0a 20 20 7d 0a 0a 20 20 70 61  gHdr);.  }..  pa
29fa0 67 65 72 4c 65 61 76 65 28 70 50 61 67 65 72 29  gerLeave(pPager)
29fb0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
29fc0 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  E_OK;.}.#endif..
29fd0 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70  /*.** Return a p
29fe0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64 61  ointer to the da
29ff0 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63 69  ta for the speci
2a000 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76 6f  fied page..*/.vo
2a010 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65 72  id *sqlite3Pager
2a020 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20 2a  GetData(DbPage *
2a030 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20 50  pPg){.  return P
2a040 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
2a050 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
2a060 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
2a070 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72 61  the Pager.nExtra
2a080 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72 61   bytes of "extra
2a090 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c 6f  " space .** allo
2a0a0 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
2a0b0 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
2a0c0 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  age..*/.void *sq
2a0d0 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78 74  lite3PagerGetExt
2a0e0 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b  ra(DbPage *pPg){
2a0f0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
2a100 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
2a110 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65 72    return (pPager
2a120 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28  ?PGHDR_TO_EXTRA(
2a130 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29 3b  pPg, pPager):0);
2a140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73 65  .}../*.** Get/se
2a150 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d 6f  t the locking-mo
2a160 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  de for this page
2a170 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d 6f  r. Parameter eMo
2a180 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a 2a  de must be one.*
2a190 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b 49  * of PAGER_LOCKI
2a1a0 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50 41  NGMODE_QUERY, PA
2a1b0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a1c0 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50 41  NORMAL or .** PA
2a1d0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a1e0 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74 68  EXCLUSIVE. If th
2a1f0 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6e  e parameter is n
2a200 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e 0a  ot _QUERY, then.
2a210 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  ** the locking-m
2a220 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ode is set to th
2a230 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69 65  e value specifie
2a240 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74  d..**.** The ret
2a250 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20 65  urned value is e
2a260 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43 4b  ither PAGER_LOCK
2a270 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 6f  INGMODE_NORMAL o
2a280 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b 49  r.** PAGER_LOCKI
2a290 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2a2a0 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 65  , indicating the
2a2b0 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69 62   current (possib
2a2c0 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20 6c  ly updated).** l
2a2d0 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f 0a  ocking-mode..*/.
2a2e0 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
2a2f0 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67 65  LockingMode(Page
2a300 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 65  r *pPager, int e
2a310 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74 28  Mode){.  assert(
2a320 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f   eMode==PAGER_LO
2a330 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 0a  CKINGMODE_QUERY.
2a340 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
2a350 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
2a360 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a 20  INGMODE_NORMAL. 
2a370 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65 4d             || eM
2a380 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b 49  ode==PAGER_LOCKI
2a390 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
2a3a0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41   );.  assert( PA
2a3b0 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45 5f  GER_LOCKINGMODE_
2a3c0 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73 73  QUERY<0 );.  ass
2a3d0 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b 49  ert( PAGER_LOCKI
2a3e0 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d 30  NGMODE_NORMAL>=0
2a3f0 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49 4e   && PAGER_LOCKIN
2a400 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45 3e  GMODE_EXCLUSIVE>
2a410 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f 64  =0 );.  if( eMod
2a420 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72 2d  e>=0 && !pPager-
2a430 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
2a440 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69   pPager->exclusi
2a450 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b 0a  veMode = eMode;.
2a460 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69 6e    }.  return (in
2a470 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  t)pPager->exclus
2a480 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66 64  iveMode;.}..#ifd
2a490 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f  ef SQLITE_TEST./
2a4a0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
2a4b0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
2a4c0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
2a4d0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
2a4e0 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2a4f0 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
2a500 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
2a510 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
2a520 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
2a530 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
2a540 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
2a550 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
2a560 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2a570 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
2a580 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
2a590 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
2a5a0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
2a5b0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
2a5c0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
2a5d0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
2a5e0 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
2a5f0 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
2a600 20 2a 2f 0a                                       */.