/ Hex Artifact Content
Login

Artifact 05d23abbcfa3133f716a99589e53883c10551b1f:


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 31 38  : pager.c,v 1.18
0350: 34 20 32 30 30 35 2f 30 31 2f 32 30 20 31 31 3a  4 2005/01/20 11:
0360: 33 32 3a 32 34 20 64 61 6e 69 65 6c 6b 31 39 37  32:24 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35  ).#define TRACE5
04f0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69  (X,Y,Z,W,V) sqli
0500: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0510: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a  ,Y,Z,W,V).#else.
0520: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
0530: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0540: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0550: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0560: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0570: 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,W).#define TRAC
0580: 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65  E5(X,Y,Z,W,V).#e
0590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
05a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
05b0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
05c0: 74 68 69 6e 20 74 68 65 20 54 52 41 43 45 58 28  thin the TRACEX(
05d0: 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a  ) macros above.*
05e0: 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66  * to print out f
05f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e  ile-descriptors.
0600: 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
0610: 65 64 20 73 6f 20 74 68 61 74 20 74 72 61 63 69  ed so that traci
0620: 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20 74 75 72  ng.** can be tur
0630: 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75 73 69 6e  ned on when usin
0640: 67 20 62 6f 74 68 20 74 68 65 20 72 65 67 75 6c  g both the regul
0650: 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6e 64  ar os_unix.c and
0660: 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a 20 62 61   os_test.c.** ba
0670: 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 50 41  ckends..**.** PA
0680: 47 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20  GERID() takes a 
0690: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
06a0: 65 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27  er struct as it'
06b0: 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a  s argument. The.
06c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  ** associated fi
06d0: 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73  le-descriptor is
06e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48   returned. FILEH
06f0: 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20  ANDLEID() takes 
0700: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72  an OsFile.** str
0710: 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75  uct as it's argu
0720: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ment..*/.#ifdef 
0730: 4f 53 5f 54 45 53 54 0a 23 64 65 66 69 6e 65 20  OS_TEST.#define 
0740: 50 41 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66  PAGERID(p) (p->f
0750: 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65  d->fd.h).#define
0760: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0770: 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a 23 65 6c  ) (fd->fd.h).#el
0780: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0790: 49 44 28 70 29 20 28 70 2d 3e 66 64 2e 68 29 0a  ID(p) (p->fd.h).
07a0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
07b0: 4c 45 49 44 28 66 64 29 20 28 66 64 2e 68 29 0a  LEID(fd) (fd.h).
07c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
07e0: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
07f0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0800: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0810: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
0820: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
0830: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0840: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0880: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0890: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
08c0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
08d0: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0900: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0910: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
0920: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0930: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0940: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
0960: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
0970: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0980: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
09a0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
09b0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
09c0: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
09f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0a00: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0a10: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
0a20: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
0a30: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
0a40: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
0a70: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a80: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a90: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0ac0: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0ad0: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0ae0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b00: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0b10: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0b20: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0b50: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0b60: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0ba0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0bb0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0bc0: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0bd0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0c00: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0c10: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0c40: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0c50: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0c60: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c80: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c90: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0ca0: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0cb0: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0cc0: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0cd0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0ce0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cf0: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0d00: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0d10: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0d20: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0d50: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0d60: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d90: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0da0: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0db0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
0dd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74  urnal file and t
0de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
0df0: 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ill be.**       
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0e20: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0e30: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0e40: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0e50: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0e60: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
0e70: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0e80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e90: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0ea0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
0eb0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
0ec0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0ed0: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0ee0: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0ef0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0f00: 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  to PAGER_UNLOCK.
0f10: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0f20: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33  .** that sqlite3
0f30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
0f40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f60: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f70: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f80: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69   sqlite_page_wri
0f90: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0fa0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0fc0: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0fd0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0fe0: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0ff0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
1000: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
1010: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1020: 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ).** The transit
1030: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1040: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 77 68  LUSIVE occurs wh
1050: 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  en before any ch
1060: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
1070: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1080: 65 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61  e file.  After a
1090: 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  n sqlite3pager_r
10a0: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
10b0: 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d  sqlite_pager_com
10c0: 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61 74 65  mit(), the state
10d0: 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41   goes back to PA
10e0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23  GER_SHARED..*/.#
10f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c  define PAGER_UNL
1100: 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69  OCK      0.#defi
1110: 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ne PAGER_SHARED 
1120: 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65       1   /* same
1130: 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   as SHARED_LOCK 
1140: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1150: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20  _RESERVED    2  
1160: 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45   /* same as RESE
1170: 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  RVED_LOCK */.#de
1180: 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55  fine PAGER_EXCLU
1190: 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61  SIVE   4   /* sa
11a0: 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f  me as EXCLUSIVE_
11b0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
11c0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
11d0: 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68    5../*.** If th
11e0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
11f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72  SERVED_LOCK macr
1200: 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  o is set to true
1210: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1220: 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64  ,.** then failed
1230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74   attempts to get
1240: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1250: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
1260: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a   busy callback..
1270: 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62  ** This is off b
1280: 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73  y default.  To s
1290: 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72  ee why, consider
12a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
12b0: 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20  cenario:.** .** 
12c0: 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41  Suppose thread A
12d0: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73   already has a s
12e0: 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  hared lock and w
12f0: 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20  ants a reserved 
1300: 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20  lock..** Thread 
1310: 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  B already has a 
1320: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e  reserved lock an
1330: 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75  d wants an exclu
1340: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a  sive lock.  If.*
1350: 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61  * both threads a
1360: 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62  re using their b
1370: 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69  usy callbacks, i
1380: 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e  t might be a lon
1390: 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72  g time.** be for
13a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65   one of the thre
13b0: 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20  ads give up and 
13c0: 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72  allows the other
13d0: 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20   to proceed..** 
13e0: 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61  But if the threa
13f0: 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20  d trying to get 
1400: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
1410: 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b  k gives up quick
1420: 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76  ly.** (if it nev
1430: 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62  er invokes its b
1440: 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68  usy callback) th
1450: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f  en the contentio
1460: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73  n will be.** res
1470: 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a  olved quickly..*
1480: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1490: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14a0: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
14b0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14c0: 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a  D_LOCK 0.#endif.
14d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
14e0: 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20  o rounds values 
14f0: 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  up so that if th
1500: 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64  e value is an ad
1510: 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67  dress it.** is g
1520: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1530: 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20  an address that 
1540: 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e  is aligned to an
1550: 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
1560: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52  ..*/.#define FOR
1570: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20  CE_ALIGNMENT(X) 
1580: 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a    (((X)+7)&~7)..
1590: 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65  /*.** Each in-me
15a0: 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20  mory image of a 
15b0: 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68  page begins with
15c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
15d0: 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68  eader..** This h
15e0: 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69  eader is only vi
15f0: 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61  sible to this pa
1600: 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65  ger module.  The
1610: 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20   client.** code 
1620: 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72  that calls pager
1630: 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64   sees only the d
1640: 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1650: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1660: 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73  ** Client code s
1670: 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74  hould call sqlit
1680: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1690: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
16a0: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
16b0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
16c0: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
16d0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
16e0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16f0: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
1700: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
1710: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
1720: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1730: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1740: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
1750: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1760: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1770: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1780: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1790: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
17a0: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
17b0: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
17c0: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
17d0: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
17e0: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
17f0: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
1800: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1810: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
1820: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
1830: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
1840: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1850: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1860: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1870: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1880: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1890: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
18a0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67   when sqlite3pag
18b0: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
18c0: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
18d0: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
18e0: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
18f0: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1900: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1910: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1920: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
1930: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
1940: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
1950: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
1960: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1970: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1980: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
1990: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
19a0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
19d0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
1a00: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
1a10: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
1a20: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
1a30: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
1a40: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
1a50: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
1a60: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
1a70: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
1a80: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
1aa0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
1ab0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53  .  PgHdr *pNextS
1ac0: 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b  tmt, *pPrevStmt;
1ad0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
1ae0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
1af0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ent journal */. 
1b00: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
1b30: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
1b40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b50: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b70: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
1b80: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1b90: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1bd0: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1be0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1c10: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1c20: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1c30: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1c40: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1c50: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1c60: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1c70: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68  his page */.  sh
1c80: 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ort int nRef;   
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  Number of users 
1cb0: 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  of this page */.
1cc0: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20   /* Dirty pages 
1cf0: 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72 2e  sorted by PgHdr.
1d00: 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  pgno */.  /* pPa
1d10: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 62  ger->psAligned b
1d20: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
1d30: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
1d40: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1d50: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1d60: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1d70: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1d80: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1d90: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
1da0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
1db0: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
1dc0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
1dd0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
1de0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
1df0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
1e00: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
1e10: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
1e20: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
1e30: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e40: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
1e50: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
1e60: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
1e70: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
1e80: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
1e90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ea0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1eb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
1ec0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
1ed0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1ee0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
1ef0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
1f00: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
1f10: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
1f20: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
1f30: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
1f40: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
1f50: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
1f60: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
1f70: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
1f80: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
1f90: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
1fa0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
1fb0: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
1fc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1fd0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
1fe0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
1ff0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2000: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2010: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2020: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2030: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2040: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2050: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2060: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2070: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2080: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2090: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
20a0: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
20b0: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
20c0: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
20d0: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
20e0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
20f0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2100: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2110: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
2120: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
2130: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
2140: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2150: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
2160: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
2170: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
2180: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
2190: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
21a0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
21b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
21c0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
21d0: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
21e0: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
21f0: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
2200: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
2210: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2220: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
2230: 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  id*)&((char*)(&(
2240: 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73 41  G)[1]))[(P)->psA
2250: 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e 65  ligned]).#define
2260: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
2270: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
2280: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
2290: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
22a0: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73 41  [1]))[(PGR)->psA
22b0: 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e 45  ligned+(PGR)->nE
22c0: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  xtra])../*.** Ho
22d0: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
22e0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
22f0: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
2300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
2310: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
2320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50  ..*/.#define N_P
2330: 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a  G_HASH 2048../*.
2340: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
2350: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
2360: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
2370: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2380: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2390: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
23a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
23b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23c0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
23d0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68  uct Pager {.  ch
23e0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
23f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
2420: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2440: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2450: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2460: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
2470: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
2480: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
2490: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
24a0: 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64  s */.  OsFile fd
24b0: 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20  , jfd;          
24c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
24d0: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
24e0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
24f0: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64  */.  OsFile stfd
2500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2510: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2520: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
2530: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
2540: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2570: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2580: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2590: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
25a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
25b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
25c0: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
25d0: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
25e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
25f0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2600: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2610: 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73 74  in() */.  i64 st
2620: 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mtJSize;        
2630: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2640: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
2650: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
2660: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
2670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2680: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
2690: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
26a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
26b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
26c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
26d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
26e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
26f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
2700: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
2710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2720: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
2730: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2740: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
2770: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
2780: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2790: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
27a0: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
27b0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
27c0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
27d0: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
27e0: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
27f0: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
2800: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2810: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
2820: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2830: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2840: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2850: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2860: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 73  page */.  int ps
2870: 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20 20  Aligned;        
2880: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69 7a        /* pageSiz
2890: 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  e rounded up to 
28a0: 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 20  a multiple of 8 
28b0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
28e0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
28f0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
2900: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2910: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2920: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2930: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2940: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2950: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2960: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2970: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2980: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
29a0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
29b0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
29c0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
29d0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
29e0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
29f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2a00: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2a10: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ead/written */. 
2a20: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
2a30: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2a40: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2a50: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2a60: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2a70: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a90: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2aa0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
2ab0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2ac0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ad0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2ae0: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2af0: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2b00: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b20: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2b30: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2b40: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b60: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
2b70: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
2b80: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
2b90: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2ba0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2bc0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2bd0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2be0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2bf0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2c00: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2c10: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2c20: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2c30: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2c40: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2c50: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2c60: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2c70: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2ca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2cb0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2cc0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2cd0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2ce0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2cf0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2d00: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2d10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2d20: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2d30: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2d40: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2d50: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2d80: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2d90: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
2da0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2db0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2dc0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2dd0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2de0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2df0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2e00: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2e10: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2e20: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e40: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2e50: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2e60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2e70: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2e80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e90: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2ea0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2eb0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2ec0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2ed0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2ee0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2ef0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2f00: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f20: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2f30: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2f40: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f60: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f70: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
2f90: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
2fb0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2fc0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fd0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2fe0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2ff0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3000: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3010: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3020: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
3030: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3040: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3050: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
3060: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
3070: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
3080: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3090: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
30a0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
30b0: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
30c0: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
30d0: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
30e0: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
30f0: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3100: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3110: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3120: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3140: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
3150: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3160: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
3170: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3190: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
31a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
31b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
31c0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
31d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
31e0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
31f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3200: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3210: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3220: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3230: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3240: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3250: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3260: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3270: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
3280: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
3290: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e   started */.  in
32a0: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
32c0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
32d0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
32e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
32f0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3300: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3310: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3320: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d  er to PgHdr */.}
3330: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
3340: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
3350: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
3360: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
3370: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
3380: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
3390: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
33a0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
33b0: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
33c0: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
33d0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
33e0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
33f0: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
3400: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
3410: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
3420: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3430: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
3440: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
3450: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
3460: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
3470: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
3480: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
3490: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
34a0: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
34b0: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ve? */../*.** Jo
34c0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
34d0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
34e0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
34f0: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3500: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3510: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3520: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3530: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3540: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3550: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3560: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3570: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3580: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3590: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
35a0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
35b0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
35c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
35d0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
35e0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
35f0: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3600: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3610: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3620: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3630: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3640: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3650: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3660: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3670: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3680: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3690: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
36a0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
36b0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
36c0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
36d0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
36e0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
36f0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3700: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3710: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3720: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3730: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3740: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3750: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3760: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3770: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3780: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3790: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
37a0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
37b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
37c0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
37d0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
37e0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
37f0: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3800: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3810: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3820: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3830: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3840: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3850: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3860: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3870: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
3880: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
3890: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
38a0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
38b0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
38c0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
38d0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
38e0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
38f0: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3900: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3910: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3920: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3930: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3940: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3950: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3960: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3970: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
3980: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
3990: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
39a0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
39b0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
39c0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
39d0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
39e0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
39f0: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3a00: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3a10: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3a20: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3a40: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3a50: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3a60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
3a80: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
3a90: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
3aa0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
3ab0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
3ac0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
3ad0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3af0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3b00: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3b10: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3b20: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3b30: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3b40: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3b50: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3b60: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3b70: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
3b80: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3b90: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3ba0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3bb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3bc0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3bd0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3be0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3bf0: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3c00: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3c10: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3c20: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3c30: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3c40: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3c50: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3c60: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3c70: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3c80: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3c90: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3ca0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3cb0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3cc0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3cd0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3ce0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3cf0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3d00: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3d10: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3d20: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3d30: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3d40: 54 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65  The default size
3d50: 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f   of a disk secto
3d60: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  r.*/.#define PAG
3d70: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35  ER_SECTOR_SIZE 5
3d80: 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  12../*.** Page n
3d90: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
3da0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3db0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3dc0: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3dd0: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3de0: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3df0: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3e00: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3e10: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3e30: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3e40: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
3e50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
3e60: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
3e70: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
3e80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
3e90: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3ea0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3eb0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3ec0: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3ed0: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3ee0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3ef0: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3f00: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3f10: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3f20: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3f30: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3f40: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3f50: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
3f60: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
3f70: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
3f80: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
3f90: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
3fa0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
3fb0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
3fc0: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
3fd0: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
3fe0: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
3ff0: 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e  ng (for debuggin
4000: 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64  g) here:.*/.#ifd
4010: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4020: 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66    int pager3_ref
4030: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b  info_enable = 0;
4040: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
4050: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48  ager_refinfo(PgH
4060: 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74  dr *p){.    stat
4070: 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  ic int cnt = 0;.
4080: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f      if( !pager3_
4090: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29  refinfo_enable )
40a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
40b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
40c0: 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a  .       "REFCNT:
40d0: 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %4d addr=%p nRe
40e0: 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f=%d\n",.       
40f0: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4100: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4110: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
4120: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
4130: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
4140: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
4150: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
4160: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
4170: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
4180: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4190: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
41a0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
41b0: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
41c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
41d0: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
41e0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
41f0: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
4200: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
4210: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
4220: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
4230: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
4240: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4250: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
4260: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
4270: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
4280: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
4290: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
42a0: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
42b0: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33  u32 *pRes){.  u3
42c0: 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b  2 res;.  int rc;
42d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
42e0: 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  sRead(fd, &res, 
42f0: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
4300: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4310: 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  K ){.    unsigne
4320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4330: 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65    memcpy(ac, &re
4340: 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d  s, 4);.    res =
4350: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4360: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4370: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4380: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72  .  }.  *pRes = r
4390: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
43a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
43b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
43c0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
43d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
43e0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
43f0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4400: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4410: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4420: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4430: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4440: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4450: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
4460: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
4470: 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  ;.  ac[0] = (val
4480: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4490: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
44a0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
44b0: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
44c0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
44d0: 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74  al & 0xff;.  ret
44e0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
44f0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
4500: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
4510: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
4520: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
4530: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4540: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4550: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4560: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4570: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4580: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4590: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
45a0: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
45b0: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
45c0: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
45d0: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
45e0: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
45f0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4600: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4610: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4620: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4630: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4640: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4650: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4660: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
4670: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
4680: 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68  'offset' from th
4690: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
46a0: 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61  d by.** page hea
46b0: 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74  der 'p'..*/.stat
46c0: 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33  ic u32 retrieve3
46d0: 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20  2bits(PgHdr *p, 
46e0: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
46f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
4700: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
4710: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
4720: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
4730: 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  set];.  return (
4740: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
4750: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
4760: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d  ]<<8) | ac[3];.}
4770: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
4780: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
4790: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
47a0: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
47b0: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
47c0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
47d0: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
47e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
47f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4800: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
4810: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4820: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
4830: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
4840: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
4850: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4860: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29  PAGER_ERR_DISK )
4870: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4880: 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61  IOERR;.  if( pPa
4890: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
48a0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20  AGER_ERR_FULL ) 
48b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
48c0: 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ULL;.  if( pPage
48d0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
48e0: 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20  ER_ERR_MEM )    
48f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4900: 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  EM;.  if( pPager
4910: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4920: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20  R_ERR_CORRUPT ) 
4930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
4940: 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  UPT;.  return rc
4950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
4960: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
4970: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4980: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
4990: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
49a0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
49b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
49c0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
49d0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
49e0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
49f0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4a00: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4a10: 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73  Malloc(). *pzMas
4a20: 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ter is.** set to
4a30: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65   point at the me
4a40: 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
4a50: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
4a60: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
4a70: 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a  sqliteFree() *pz
4a80: 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  Master..**.** If
4a90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4aa0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4ab0: 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65  present *pzMaste
4ac0: 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  r is set to 0 an
4ad0: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
4ae0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
4af0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
4b00: 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20  rJournal(OsFile 
4b10: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70  *pJrnl, char **p
4b20: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
4b30: 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20  rc;.  u32 len;. 
4b40: 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20   i64 szJ;.  u32 
4b50: 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  cksum;.  int i;.
4b60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4b70: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
4b80: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
4b90: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
4ba0: 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  */..  *pzMaster 
4bb0: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
4bc0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
4bd0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  Jrnl, &szJ);.  i
4be0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4bf0: 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74   || szJ<16 ) ret
4c00: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
4c10: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
4c20: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20  rnl, szJ-16);.  
4c30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4c40: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
4c50: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
4c60: 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b  ts(pJrnl, &len);
4c70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4c80: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
4c90: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
4ca0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73  bits(pJrnl, &cks
4cb0: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
4cc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4cd0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
4ce0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
4cf0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20  l, aMagic, 8);. 
4d00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4d10: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
4d20: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
4d30: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
4d40: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
4d50: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
4d60: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
4d70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4d80: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4d90: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63    *pzMaster = (c
4da0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
4db0: 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28  oc(len+1);.  if(
4dc0: 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20   !*pzMaster ){. 
4dd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4de0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
4df0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4e00: 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65  (pJrnl, *pzMaste
4e10: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
4e20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4e30: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
4e40: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
4e50: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
4e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4e70: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
4e80: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
4e90: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
4ea0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
4eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
4ec0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
4ed0: 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69  -= (*pzMaster)[i
4ee0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
4ef0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
4f00: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
4f10: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
4f20: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
4f30: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
4f40: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
4f50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
4f60: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
4f70: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
4f80: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
4f90: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
4fa0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
4fb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
4fc0: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
4fd0: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
4fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
4ff0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5000: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5010: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5020: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 0;.  }else{.
5030: 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b      (*pzMaster)[
5040: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  len] = '\0';.  }
5050: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
5060: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5070: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
5080: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
5090: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
50a0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
50b0: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
50c0: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
50d0: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
50e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
50f0: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5100: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5110: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5120: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5130: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5140: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
5160: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5220: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
5230: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5240: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
5250: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
5260: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
5270: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
5280: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
5290: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
52a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
52b0: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
52c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
52d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
52e0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
52f0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
5300: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
5310: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
5320: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
5330: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5340: 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72  ger) );.  pPager
5350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f  ->journalOff = o
5360: 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20  ffset;.  return 
5370: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
5380: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5390: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
53a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
53b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
53c0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
53d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
53e0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
53f0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5400: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5410: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5430: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5440: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5450: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5460: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5470: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5480: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5490: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
54a0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
54b0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
54c0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
54d0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
54e0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
54f0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5500: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5510: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5520: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5530: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5540: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5550: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5560: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5570: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5580: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5590: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
55a0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
55b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
55c0: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
55d0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
55e0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
55f0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5600: 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74  *pPager){..  int
5610: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
5620: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
5630: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5640: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
5650: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
5660: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
5670: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
5680: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
5690: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
56a0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
56b0: 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a  journalHdr;.  }.
56c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
56d0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
56e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
56f0: 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20  .  /* FIX ME: . 
5700: 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c   **.  ** Possibl
5710: 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f  y for a pager no
5720: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
5730: 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  e, the journal m
5740: 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  agic should not.
5750: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
5760: 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69  until nRec is fi
5770: 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20  lled in as part 
5780: 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72  of next syncJour
5790: 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a  nal(). .  **.  *
57a0: 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65  * Actually maybe
57b0: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
57c0: 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64  al header should
57d0: 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69   be delayed unti
57e0: 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e  l that.  ** poin
57f0: 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  t. Think about t
5800: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  his..  */.  rc =
5810: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5820: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
5830: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
5840: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
5850: 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  c));..  if( rc==
5860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5870: 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65   /* The nRec Fie
5880: 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66  ld. 0xFFFFFFFF f
5890: 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e  or no-sync journ
58a0: 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  als. */.    rc =
58b0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
58c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
58d0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
58e0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d  ffffff : 0);.  }
58f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
5910: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
5920: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
5930: 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33   */ .    sqlite3
5940: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
5950: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
5960: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
5970: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
5980: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
5990: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
59a0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
59b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
59c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
59d0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
59e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
59f0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5a00: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5a10: 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
5a20: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ze);.  }.  if( r
5a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5a40: 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d      /* The assum
5a50: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
5a60: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
5a70: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
5a80: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5a90: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65  >jfd, pPager->se
5aa0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ctorSize);.  }..
5ab0: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
5ac0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
5ad0: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
5ae0: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
5af0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
5b00: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5b10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5b20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
5b30: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
5b40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5b50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
5b60: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
5b70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
5b80: 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20  lOff-1);.    rc 
5b90: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
5ba0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  (&pPager->jfd, "
5bb0: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20  \000", 1);.  }. 
5bc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5bd0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5be0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5bf0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
5c00: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5c10: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
5c20: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5c30: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
5c40: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
5c50: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5c60: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
5c70: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
5c80: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
5c90: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
5ca0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5cb0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
5cc0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
5cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
5ce0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
5cf0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
5d00: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
5d10: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
5d20: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
5d30: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
5d40: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
5d50: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
5d60: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
5d70: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
5d80: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
5d90: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
5da0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
5db0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
5dc0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
5dd0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5de0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
5df0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
5e00: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
5e10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
5e20: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
5e30: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
5e40: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
5e50: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
5e60: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
5e70: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
5e80: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
5e90: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
5ea0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
5eb0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
5ec0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
5ed0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5ef0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
5f00: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5f10: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
5f20: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
5f30: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
5f40: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
5f50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5f60: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5f70: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5f80: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5f90: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
5fa0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5fb0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
5fc0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
5fd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5fe0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
5ff0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
6000: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
6010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6020: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6030: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
6040: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
6050: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6060: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
6070: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6080: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6090: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
60a0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
60b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
60c0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
60d0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
60e0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
60f0: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
6100: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6110: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6120: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
6130: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6140: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
6150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6160: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6170: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  &pPager->jfd, pD
6180: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
61a0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
61b0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
61c0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
61d0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
61e0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
61f0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
6200: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
6210: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
6220: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
6230: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
6240: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
6250: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
6260: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
6270: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
6280: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6290: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
62a0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
62b0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
62c0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
62d0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
62e0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
62f0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
6300: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
6310: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
6320: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
6330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
6340: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6350: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6360: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6370: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6380: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
6390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
63a0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
63b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
63c0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
63d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
63e0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
63f0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6400: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6410: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6420: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6430: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6440: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6450: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6460: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6470: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6480: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
6490: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
64a0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
64b0: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
64c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
64d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
64e0: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
64f0: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
6500: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
6510: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
6520: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
6530: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
6540: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6550: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
6560: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
6570: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
6580: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
6590: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
65a0: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
65b0: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
65c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
65d0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
65e0: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
65f0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
6600: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
6610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
6620: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
6630: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
6640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
6650: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
6660: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
6670: 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73  nt i; .  u32 cks
6680: 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20  um = 0; ..  if( 
6690: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
66a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
66b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
66c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
66d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
66e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
66f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
6700: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
6710: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
6720: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
6730: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
6740: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
6750: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
6760: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
6770: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
6780: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6790: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
67a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
67b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
67c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
67d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
67e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
67f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
6800: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
6810: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6820: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
6830: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6850: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
6860: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
6870: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6880: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6890: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
68a0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
68b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
68c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
68d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
68e0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
68f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  , zMaster, len);
6900: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6910: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6920: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6930: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6940: 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  fd, len);.  if( 
6950: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6960: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6970: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6980: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
6990: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
69a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
69b0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
69c0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
69d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
69e0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
69f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
6a10: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65 74 75  Sync = 1;.  retu
6a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6a30: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
6a40: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
6a50: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
6a60: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
6a70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
6a80: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
6a90: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
6aa0: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
6ab0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
6ac0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
6ad0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
6ae0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
6af0: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
6b00: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
6b10: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
6b20: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
6b30: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
6b40: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
6b50: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
6b60: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
6b70: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
6b80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6b90: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
6ba0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
6bb0: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
6bc0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
6bd0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
6be0: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
6bf0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
6c00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
6c10: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
6c20: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
6c30: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
6c40: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
6c50: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
6c60: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
6c70: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
6c80: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
6c90: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
6ca0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
6cb0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
6cc0: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
6cd0: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
6ce0: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
6cf0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
6d00: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
6d10: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
6d20: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
6d30: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
6d40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
6d50: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
6d60: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
6d70: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
6d80: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
6d90: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6db0: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
6dc0: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
6dd0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6de0: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
6df0: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
6e00: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
6e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6e20: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
6e30: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
6e40: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
6e50: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
6e60: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
6e70: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
6e80: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
6e90: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
6ea0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
6eb0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
6ec0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
6ed0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
6ee0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
6ef0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
6f00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
6f10: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
6f20: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
6f30: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
6f40: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
6f50: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
6f60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
6f70: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
6f80: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
6f90: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
6fa0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
6fb0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
6fc0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
6fd0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
6fe0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
6ff0: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
7000: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
7010: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
7020: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
7030: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
7040: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
7050: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
7060: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
7070: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
7080: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
7090: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
70a0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
70b0: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
70c0: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
70d0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
70e0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
70f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
7100: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
7110: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
7120: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
7130: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
7140: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
7150: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
7160: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
7170: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
7180: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
7190: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
71a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
71b0: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
71c0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
71d0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
71e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
71f0: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
7200: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
7210: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
7220: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
7230: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7240: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
7260: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
7270: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
7280: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
7290: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
72a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
72b0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
72c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
72d0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
72e0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
72f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
7300: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
7310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
7320: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7330: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7340: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7350: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7360: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7370: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7380: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7390: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
73a0: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
73b0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
73c0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
73d0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
73e0: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
73f0: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7400: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7410: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7420: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7440: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
7450: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
7460: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
7470: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
7480: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
7490: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
74a0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
74b0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
74c0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
74d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
74e0: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
74f0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7500: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
7510: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
7520: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7530: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
7540: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
7550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7560: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
7570: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
7580: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7590: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
75a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
75b0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
75c0: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
75d0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
75e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
75f0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
7600: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7610: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
7620: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7630: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7640: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7650: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7660: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
7670: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
7680: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
7690: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
76a0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
76b0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
76c0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
76d0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
76e0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
76f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7700: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7710: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7720: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
7730: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7740: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7750: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7760: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7770: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
7780: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
7790: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
77a0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
77b0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
77c0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
77d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
77e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
77f0: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
7800: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
7810: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
7820: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
7830: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7840: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
7850: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
7860: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
7870: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
7880: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
7890: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
78a0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
78b0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
78c0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
78d0: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
78e0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
78f0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
7900: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
7910: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
7920: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
7930: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
7940: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
7950: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
7960: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
7970: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
7980: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
7990: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
79a0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
79b0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
79c0: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
79d0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
79e0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
79f0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
7a00: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
7a10: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
7a20: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
7a30: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
7a40: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
7a50: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
7a60: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
7a70: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
7a80: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
7a90: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
7aa0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
7ab0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
7ac0: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
7ad0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
7ae0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
7af0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
7b00: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
7b10: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
7b20: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
7b30: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
7b40: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
7b50: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
7b60: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
7b70: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
7b80: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
7b90: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
7ba0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
7bb0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
7bc0: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
7bd0: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
7be0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
7bf0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
7c00: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
7c10: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
7c20: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
7c30: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
7c40: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
7c50: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
7c60: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
7c70: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
7c80: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61  onst char *aData
7c90: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
7ca0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7cb0: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
7cc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
7cd0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
7ce0: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
7cf0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
7d00: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
7d10: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
7d20: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
7d30: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
7d40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7d50: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
7d60: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
7d70: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
7d80: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
7d90: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
7da0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
7db0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
7dc0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
7dd0: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
7de0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
7df0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
7e00: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
7e10: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
7e20: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
7e30: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
7e40: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7e50: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
7e60: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
7e70: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
7e80: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
7e90: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
7ea0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ec0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
7ed0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
7ee0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
7f10: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
7f20: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
7f30: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f50: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
7f60: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
7f70: 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b  g */.  u8 aData[
7f80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
7f90: 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20  SIZE];  /* Temp 
7fa0: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
7fb0: 67 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65  ge */..  rc = re
7fc0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70  ad32bits(jfd, &p
7fd0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
7fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7ff0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
8000: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
8010: 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d   &aData, pPager-
8020: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
8030: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8040: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
8050: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8060: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
8070: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
8080: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
8090: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
80a0: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
80b0: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
80c0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
80d0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
80e0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
80f0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8100: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
8110: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
8120: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
8130: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
8140: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
8150: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
8160: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
8170: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
8180: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
8190: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
81a0: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
81b0: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
81c0: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
81d0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
81e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
81f0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
8200: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
8210: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
8220: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8230: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
8240: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
8250: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8260: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
8270: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8280: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
8290: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
82a0: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
82b0: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67  cksum(pPager, pg
82c0: 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  no, aData)!=cksu
82d0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
82e0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
82f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
8300: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
8310: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
8320: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
8330: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
8340: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
8350: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
8360: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
8370: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
8380: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
8390: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
83a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
83b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
83c0: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
83d0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
83e0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
83f0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
8400: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
8410: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
8420: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
8430: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
8440: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
8450: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
8460: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
8470: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
8480: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
8490: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
84a0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  ot dirty..  */. 
84b0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
84c0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
84d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
84e0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
84f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
8500: 50 67 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22  Pg );.  TRACE3("
8510: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
8520: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
8530: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
8540: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8550: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
8560: 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  SIVE ){.    sqli
8570: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
8580: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
8590: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
85a0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
85b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
85c0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  &pPager->fd, aDa
85d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
85e0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Size);.  }.  if(
85f0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
8600: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
8610: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
8620: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
8630: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
8640: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
8650: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
8660: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
8670: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
8680: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
8690: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
86a0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
86b0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
86c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
86d0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
86e0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
86f0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
8700: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
8710: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
8720: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
8730: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
8740: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
8750: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
8760: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
8770: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
8780: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
8790: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
87a0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
87b0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
87c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
87d0: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
87e0: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
87f0: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
8800: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
8810: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
8820: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
8830: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
8840: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
8850: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8860: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8870: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
8880: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
8890: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
88a0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
88b0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
88c0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
88d0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
88e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
88f0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
8900: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
8910: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
8920: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
8930: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
8940: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
8950: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
8960: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
8970: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
8980: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
8990: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
89a0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
89b0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
89c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
89d0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
89e0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
89f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8a00: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
8a10: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
8a20: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
8a30: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
8a40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
8a50: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
8a60: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
8a70: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
8a80: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
8a90: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
8aa0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
8ab0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
8ac0: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
8ad0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
8ae0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
8af0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
8b00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8b10: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
8b20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
8b30: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8b40: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
8b50: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
8b60: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
8b70: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
8b80: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
8b90: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
8ba0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
8bb0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
8bc0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8bd0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
8be0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
8bf0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
8c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
8c10: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
8c20: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8c30: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
8c40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8c50: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
8c60: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
8c70: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
8c80: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74  /.  memset(&mast
8c90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61  er, 0, sizeof(ma
8ca0: 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73  ster));.  rc = s
8cb0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
8cc0: 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d  Only(zMaster, &m
8cd0: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
8ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8cf0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8d00: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
8d10: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
8d20: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d  te3OsFileSize(&m
8d30: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
8d40: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
8d50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
8d60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8d70: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
8d80: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
8d90: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8da0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
8db0: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
8dc0: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
8dd0: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
8de0: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
8df0: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
8e00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
8e10: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
8e20: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
8e30: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
8e40: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
8e50: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
8e60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
8e70: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
8e80: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
8e90: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
8ea0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8eb0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
8ec0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
8ed0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8ee0: 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20  OsRead(&master, 
8ef0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
8f00: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
8f10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8f20: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
8f30: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
8f40: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
8f50: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
8f60: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
8f70: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
8f80: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
8f90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
8fa0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
8fb0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
8fc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
8fd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
8fe0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
8ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
9000: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
9010: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
9020: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
9030: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
9040: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
9050: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
9060: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
9070: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
9080: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
9090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
90a0: 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20  File journal;.  
90b0: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
90c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f        memset(&jo
90d0: 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  urnal, 0, sizeof
90e0: 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20  (journal));.    
90f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9100: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
9110: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
9120: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
9130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9140: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9150: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9160: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
9170: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
9180: 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61  rJournal(&journa
9190: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
91a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
91b0: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
91c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
91d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
91e0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
91f0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9200: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
9210: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21   c = zMasterPtr!
9220: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
9230: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
9240: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71  )==0;.        sq
9250: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
9260: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Ptr);.        if
9270: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
9280: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
9290: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
92a0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
92b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
92c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
92d0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92f0: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
9300: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
9310: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
9320: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  .  .  sqlite3OsD
9330: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
9340: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
9350: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
9360: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
9370: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
9380: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
9390: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
93a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
93b0: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
93c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
93d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  .}../*.** Make e
93e0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
93f0: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
9400: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
9410: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
9420: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
9430: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
9440: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
9450: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
9460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9470: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
9480: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
9490: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
94a0: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
94b0: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
94c0: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
94d0: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
94e0: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
94f0: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
9500: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
9510: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
9520: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
9530: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
9540: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
9550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9560: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
9570: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
9580: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
9590: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
95a0: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
95b0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
95c0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
95d0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
95e0: 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58   zBuf[SQLITE_MAX
95f0: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20  _PAGE_SIZE];.   
9600: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
9610: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9620: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
9630: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
9640: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
9650: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
9660: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
9670: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
9680: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
9690: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
96a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
96b0: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
96c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
96d0: 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
96e0: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
96f0: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
9700: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
9710: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
9720: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
9730: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a   CODEC(pPager, z
9740: 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Buf, pPg->pgno, 
9750: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
9760: 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66       memset(zBuf
9770: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
9780: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9790: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
97a0: 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75  =0 || memcmp(zBu
97b0: 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  f, PGHDR_TO_DATA
97c0: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
97d0: 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
97e0: 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
97f0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75  O_DATA(pPg), zBu
9800: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
9810: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
9820: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
9830: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
9840: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
9850: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9860: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
9870: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
9880: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
9890: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
98a0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
98b0: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
98c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
98d0: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
98e0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
98f0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
9900: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9910: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
9920: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
9930: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
9940: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9950: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
9960: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
9970: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
9980: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
9990: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 72   int nPage){.  r
99a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54  eturn sqlite3OsT
99b0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
99c0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
99d0: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
99e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
99f0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
9a00: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
9a10: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
9a20: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
9a30: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
9a40: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
9a50: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
9a60: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
9a70: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
9a80: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
9a90: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
9aa0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
9ab0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
9ac0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
9ad0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
9ae0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
9af0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9b00: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9b10: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
9b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
9b30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
9b40: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
9b50: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
9b60: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
9b70: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
9b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
9b90: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
9ba0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
9bb0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
9bc0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
9bd0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
9be0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
9bf0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
9c00: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
9c10: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
9c20: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
9c30: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
9c40: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
9c50: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
9c60: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
9c70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9c80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9c90: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
9ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
9cb0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
9cc0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
9cd0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
9ce0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
9cf0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
9d00: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
9d10: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
9d20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9d30: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
9d40: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
9d50: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
9d60: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
9d70: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
9d80: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
9d90: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
9da0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
9db0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
9dc0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
9dd0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
9de0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
9df0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
9e00: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
9e10: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
9e20: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
9e30: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
9e40: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
9e50: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
9e60: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
9e70: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
9e80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
9e90: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
9ea0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
9eb0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
9ec0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
9ee0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
9ef0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
9f00: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
9f10: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
9f20: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
9f30: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
9f40: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
9f50: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
9f60: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
9f70: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
9f80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
9f90: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
9fa0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
9fb0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
9fc0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
9fd0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
9fe0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
9ff0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
a000: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
a010: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
a020: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
a030: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a040: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
a050: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
a060: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
a070: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
a080: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a090: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
a0a0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
a0b0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
a0c0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
a0d0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
a0e0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
a0f0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
a100: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
a110: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a120: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
a130: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
a140: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
a150: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
a160: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
a170: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
a180: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
a190: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
a1a0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
a1b0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
a1c0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
a1d0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
a1e0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
a1f0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
a200: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
a210: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
a220: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
a230: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
a240: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
a250: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
a260: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
a270: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
a280: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
a290: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
a2a0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
a2b0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
a2c0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
a2d0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
a2e0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
a2f0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
a300: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
a310: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
a320: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
a330: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
a340: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
a350: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
a360: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
a370: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
a380: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a390: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
a3a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
a3b0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
a3c0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
a3d0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
a3e0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
a3f0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
a400: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
a410: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
a420: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
a430: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
a440: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
a450: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
a460: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a470: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
a480: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
a490: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
a4a0: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
a4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
a4e0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
a4f0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
a500: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a510: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
a520: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
a530: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a540: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a550: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
a560: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
a570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
a580: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
a590: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
a5a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a5b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
a5c0: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
a5d0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
a5e0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
a5f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a600: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a610: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
a620: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
a630: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
a640: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
a650: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
a660: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
a670: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
a680: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
a690: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
a6a0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
a6b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
a6c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
a6d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
a6f0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a700: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
a710: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a720: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
a730: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
a740: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
a750: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
a760: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
a770: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
a780: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
a790: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
a7a0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
a7b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
a7c0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
a7d0: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
a7e0: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
a7f0: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
a800: 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67  terJournal(&pPag
a810: 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65  er->jfd, &zMaste
a820: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  r);.  assert( rc
a830: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
a840: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a850: 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72  E_OK || (zMaster
a860: 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69   && !sqlite3OsFi
a870: 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72  leExists(zMaster
a880: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
a890: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
a8a0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
a8b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a8c0: 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
a8d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
a8e0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a8f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
a900: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
a910: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
a920: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
a930: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
a940: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
a950: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
a960: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
a970: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
a980: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
a990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
a9a0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
a9b0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
a9c0: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
a9d0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
a9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
a9f0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
aa00: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
aa10: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
aa20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
aa30: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
aa40: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
aa50: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
aa60: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
aa70: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
aa80: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
aa90: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
aaa0: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
aab0: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
aac0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
aad0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
aae0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
aaf0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
ab00: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
ab10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
ab20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
ab30: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
ab40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ab50: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
ab60: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
ab70: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
ab80: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
ab90: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
aba0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
abb0: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
abc0: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
abd0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
abe0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
abf0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
ac00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
ac10: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
ac20: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
ac30: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
ac40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
ac50: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
ac60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ac70: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
ac80: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
ac90: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
aca0: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
acb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
acc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
acd0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
ace0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
acf0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
ad00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ad10: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
ad20: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
ad30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
ad40: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
ad50: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
ad60: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
ad70: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
ad80: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ad90: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
ada0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
adb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
adc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
add0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ade0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
adf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ae00: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
ae10: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
ae20: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
ae30: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
ae40: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
ae50: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
ae60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ae70: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
ae80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ae90: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
aea0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
aeb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72  .    }..    /* r
aec0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
aed0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
aee0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
aef0: 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20  Pager)); */.    
af00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
af10: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  K ) goto end_pla
af20: 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a  yback;.  .    /*
af30: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
af40: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
af50: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
af60: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
af70: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
af80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
af90: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
afa0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
afb0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
afc0: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
afd0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
afe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aff0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
b000: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b010: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b030: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
b040: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
b050: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b060: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b070: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
b080: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
b090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b0a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
b0b0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
b0c0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
b0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
b0e0: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
b0f0: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
b100: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
b110: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
b120: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
b130: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
b140: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
b150: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
b160: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
b170: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
b180: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
b190: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
b1a0: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
b1b0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
b1c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b1d0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b1e0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
b1f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
b200: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
b210: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
b220: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
b230: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
b240: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
b250: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
b260: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
b270: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
b280: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  ter journal. If 
b290: 65 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f  errors .    ** o
b2a0: 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 69 73  ccur during this
b2b0: 20 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65   process, ignore
b2c0: 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20   them..    */.  
b2d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b2e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
b2f0: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61  er_delmaster(zMa
b300: 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ster);.    }.   
b310: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b320: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
b330: 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
b340: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
b350: 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
b360: 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
b370: 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
b380: 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
b390: 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
b3a0: 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45  a different PAGE
b3b0: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  R_SECTOR_SIZE.  
b3c0: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
b3d0: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
b3e0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
b3f0: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
b400: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
b410: 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54  ize = PAGER_SECT
b420: 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  OR_SIZE;.  retur
b430: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
b440: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
b450: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
b460: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
b470: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
b480: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
b490: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
b4a0: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
b4b0: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
b4c0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
b4d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
b4e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
b4f0: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
b500: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
b510: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
b520: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
b530: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
b540: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
b550: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
b560: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
b570: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
b580: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
b590: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b5a0: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
b5b0: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
b5c0: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
b5d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
b5e0: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
b5f0: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
b600: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
b610: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
b620: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
b630: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
b640: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
b650: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
b660: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b670: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
b680: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
b690: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6b0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
b6c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b6f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
b700: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
b710: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
b720: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
b730: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
b740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b750: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
b760: 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
b770: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b780: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b790: 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
b7a0: 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
b7b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
b7c0: 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
b7d0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
b7e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
b7f0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a   header written.
b800: 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d    ** this statem
b810: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
b820: 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
b830: 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
b840: 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
b850: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
b860: 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
b870: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
b880: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
b890: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
b8a0: 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
b8b0: 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
b8c0: 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
b8d0: 20 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75 6e   }.  ..  /* Trun
b8e0: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
b8f0: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
b900: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
b910: 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
b920: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
b930: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
b940: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
b950: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
b960: 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  mtSize;..  /* Fi
b970: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
b980: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
b990: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b9a0: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
b9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
b9c0: 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
b9d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
b9e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65  );.  sqlite3OsSe
b9f0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  ek(&pPager->stfd
ba00: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
ba10: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
ba20: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
ba30: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
ba40: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
ba50: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
ba60: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
ba70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ba80: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
ba90: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
baa0: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
bab0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
bac0: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
bad0: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
bae0: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
baf0: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
bb00: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
bb10: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
bb20: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
bb30: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
bb40: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
bb50: 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
bb60: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
bb70: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
bb80: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
bb90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bba0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
bbb0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
bbc0: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
bbd0: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
bbe0: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
bbf0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
bc00: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
bc10: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
bc20: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bc30: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
bc40: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
bc50: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
bc60: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
bc70: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
bc80: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
bc90: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
bca0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
bcb0: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
bcc0: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
bcd0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
bce0: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
bcf0: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
bd00: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bd10: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
bd20: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
bd30: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
bd40: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
bd50: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
bd60: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
bd70: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
bd80: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
bd90: 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
bda0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bdb0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
bdc0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
bdd0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
bde0: 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
bdf0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
be00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
be10: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
be20: 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  ksum;.  assert( 
be30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
be40: 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e  Pager)<(pPager->
be50: 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20  pageSize+8) );. 
be60: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
be70: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68  journalOff <= (h
be80: 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70  drOff-(pPager->p
be90: 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20  ageSize+8)) ){. 
bea0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
beb0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
bec0: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
bed0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
bee0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
bef0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
bf00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bf10: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
bf20: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
bf30: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
bf40: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
bf50: 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b  ){.    u32 nRec;
bf60: 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
bf70: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
bf80: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
bf90: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d  szJ, &nRec, &dum
bfa0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
bfb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bfc0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
bfd0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
bfe0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
bff0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
c000: 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d   }.    if( nRec=
c010: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  =0 ){.      nRec
c020: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
c030: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
c040: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
c050: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
c060: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
c070: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
c080: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
c090: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
c0a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c0b0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c0c0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
c0d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c0e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c0f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
c100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
c110: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c120: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
c130: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
c140: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a  alOff = szJ;.  .
c150: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
c160: 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  k:.  if( rc!=SQL
c170: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
c180: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
c190: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
c1a0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
c1b0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a  ITE_CORRUPT;  /*
c1c0: 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f   bkpt-CORRUPT */
c1d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
c1e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c1f0: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70   = szJ;.    /* p
c200: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
c210: 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  e(pPager); */.  
c220: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c240: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
c250: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
c260: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
c270: 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lowed..**.** The
c280: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
c290: 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20  is the absolute 
c2a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50  value of the mxP
c2b0: 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  age parameter..*
c2c0: 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e  * If mxPage is n
c2d0: 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53  egative, the noS
c2e0: 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  ync flag is also
c2f0: 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79   set.  noSync by
c300: 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20  passes.** calls 
c310: 74 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  to sqlite3OsSync
c320: 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72  ().  The pager r
c330: 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20  uns much faster 
c340: 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a  with noSync on,.
c350: 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70  ** but if the op
c360: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
c370: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
c380: 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  is an abrupt pow
c390: 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20  er .** failure, 
c3a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c3b0: 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  e might be left 
c3c0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
c3d0: 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61  nt and.** unrepa
c3e0: 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a  irable state.  .
c3f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
c400: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
c410: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c420: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
c430: 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29   if( mxPage>=0 )
c440: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
c450: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
c460: 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28  empFile;.    if(
c470: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c480: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
c490: 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65  nc = 0; .  }else
c4a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
c4b0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78  Sync = 1;.    mx
c4c0: 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a  Page = -mxPage;.
c4d0: 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65    }.  if( mxPage
c4e0: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
c4f0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
c500: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
c510: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
c520: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
c530: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
c540: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
c550: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
c560: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
c570: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
c580: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
c590: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
c5a0: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
c5b0: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
c5c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
c5d0: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
c5e0: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
c5f0: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
c600: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
c610: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
c620: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
c630: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
c640: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
c650: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
c660: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
c670: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
c680: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
c690: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
c6a0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
c6b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c6c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
c6d0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
c6e0: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
c6f0: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
c700: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
c710: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
c720: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
c730: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
c740: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
c750: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
c760: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
c770: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
c780: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
c790: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
c7a0: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
c7b0: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
c7c0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
c7d0: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
c7e0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
c7f0: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
c800: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
c810: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
c820: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
c830: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
c840: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
c850: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
c860: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
c870: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
c880: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
c890: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
c8a0: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
c8b0: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
c8c0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
c8e0: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
c8f0: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
c900: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
c910: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
c920: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
c930: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
c940: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
c950: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
c960: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
c970: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
c980: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
c990: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c9a0: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
c9b0: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
c9c0: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
c9d0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
c9e0: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
c9f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ca00: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
ca10: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
ca20: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
ca30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ca40: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
ca50: 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  _level(Pager *pP
ca60: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29  ager, int level)
ca70: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
ca80: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
ca90: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
caa0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
cab0: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
cac0: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
cad0: 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
cae0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
caf0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
cb00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  = 0;.}../*.** Op
cb10: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
cb20: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
cb30: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
cb40: 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28   into zName.** (
cb50: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74  zName must be at
cb60: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
cb70: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
cb80: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
cb90: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
cba0: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
cbb0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
cbc0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
cbd0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
cbe0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
cbf0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
cc00: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
cc10: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
cc20: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
cc30: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
cc40: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
cc50: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
cc60: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
cc70: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66  zFile, OsFile *f
cc80: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
cc90: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  8;.  int rc;.  d
cca0: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
ccb0: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
ccc0: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
ccd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cce0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
ccf0: 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20  zFile, fd, 1);. 
cd00: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
cd10: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
cd20: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
cd30: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
cd40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
cd50: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
cd60: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
cd70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
cd80: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
cd90: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
cda0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
cdb0: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
cdc0: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
cdd0: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
cde0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
cdf0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
ce00: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
ce10: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
ce20: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
ce30: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
ce40: 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72  ing sqlite3pager
ce50: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
ce60: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
ce70: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
ce80: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
ce90: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
cea0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
ceb0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
cec0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
ced0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
cee0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
cef0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
cf00: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
cf10: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
cf20: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
cf30: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
cf40: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
cf50: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
cf60: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
cf70: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
cf80: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
cf90: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
cfa0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
cfb0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
cfc0: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
cfd0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
cfe0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
cff0: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
d000: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
d010: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
d020: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
d030: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
d040: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
d050: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
d060: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
d070: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
d080: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
d090: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
d0a0: 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nal           /*
d0b0: 20 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72   TRUE to use a r
d0c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d0d0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
d0e0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
d0f0: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  er;.  char *zFul
d100: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
d110: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
d120: 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74  OsFile fd;.  int
d130: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d140: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d150: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
d160: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
d170: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
d180: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
d190: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
d1a0: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
d1b0: 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  er = 0;.  memset
d1c0: 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&fd, 0, sizeof(
d1d0: 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fd));.  if( sqli
d1e0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
d1f0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
d200: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d210: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
d220: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
d230: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
d240: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
d250: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
d260: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
d270: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
d280: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
d290: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
d2a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
d2b0: 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ("");.      rc =
d2c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d2d0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
d2e0: 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61   {.      zFullPa
d2f0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
d300: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
d310: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
d320: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
d330: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  me ){.        rc
d340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d350: 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50  ReadWrite(zFullP
d360: 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  athname, &fd, &r
d370: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  eadOnly);.      
d380: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
d390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d3a0: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
d3b0: 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20  zTemp, &fd);.   
d3c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65   zFilename = zTe
d3d0: 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74  mp;.    zFullPat
d3e0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
d3f0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
d400: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
d410: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d420: 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  ){.      tempFil
d430: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
d440: 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74  .  if( !zFullPat
d450: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  hname ){.    sql
d460: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
d470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d480: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d490: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d4a0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
d4b0: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
d4c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
d4d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
d4e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d4f0: 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72  .  nameLen = str
d500: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
d510: 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  e);.  pPager = s
d520: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
d530: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
d540: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
d550: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
d560: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
d570: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
d580: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
d590: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
d5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d5b0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  MEM;.  }.  TRACE
d5c0: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
d5d0: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
d5e0: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
d5f0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
d600: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
d610: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
d620: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
d630: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
d640: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
d650: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
d660: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
d670: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
d680: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
d690: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
d6a0: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
d6b0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
d6c0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
d6d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
d6e0: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
d6f0: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
d700: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
d710: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
d720: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
d730: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
d740: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
d750: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
d760: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
d770: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
d780: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d790: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
d7a0: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
d7b0: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
d7c0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
d7d0: 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  fd;.#if OS_UNIX.
d7e0: 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61    pPager->fd.pPa
d7f0: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65  ger = pPager;.#e
d800: 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ndif.  pPager->j
d810: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
d820: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
d830: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
d840: 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
d850: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
d860: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
d870: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
d880: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
d890: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
d8a0: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
d8b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d8c0: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
d8d0: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70  T_PAGE_SIZE;.  p
d8e0: 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64  Pager->psAligned
d8f0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
d900: 4e 54 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  NT(pPager->pageS
d910: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
d920: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
d930: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
d940: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
d950: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
d960: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
d970: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
d980: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
d990: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
d9a0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
d9b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
d9c0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d9d0: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
d9e0: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
d9f0: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
da00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
da10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
da20: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
da30: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
da40: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
da50: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
da60: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
da70: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
da80: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
da90: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
daa0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
dab0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
dac0: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
dad0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
dae0: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
daf0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
db00: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
db10: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
db20: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
db30: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
db40: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
db50: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
db60: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
db70: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
db80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
db90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
dba0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
dbb0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
dbc0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
dbd0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
dbe0: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
dbf0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
dc00: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
dc10: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
dc20: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
dc30: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
dc40: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
dc50: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
dc60: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
dc70: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
dc80: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
dc90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
dca0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
dcb0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
dcc0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
dcd0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
dce0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
dcf0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
dd00: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
dd10: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
dd20: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
dd30: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
dd40: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
dd50: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
dd60: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
dd70: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
dd80: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
dd90: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
dda0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ddb0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ddc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ddd0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
dde0: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
ddf0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
de00: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
de10: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
de20: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
de30: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
de40: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
de50: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
de60: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
de70: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
de80: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
de90: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
dea0: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
deb0: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
dec0: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ded0: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
dee0: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
def0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
df00: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
df10: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
df20: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
df30: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
df40: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
df50: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
df60: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
df70: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
df80: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
df90: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
dfa0: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
dfb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
dfc0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
dfd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
dfe0: 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68   must only be ch
dff0: 61 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63  anged when the c
e000: 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  ache is empty..*
e010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
e020: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
e030: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e040: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
e050: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
e060: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
e070: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
e080: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50  AGE_SIZE );.  pP
e090: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
e0a0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61   pageSize;.  pPa
e0b0: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 3d  ger->psAligned =
e0c0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
e0d0: 28 70 61 67 65 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  (pageSize);.}../
e0e0: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
e0f0: 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
e100: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e110: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
e120: 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
e130: 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
e140: 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
e150: 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76  ng is done..*/.v
e160: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
e170: 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72  _read_fileheader
e180: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e190: 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
e1a0: 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
e1b0: 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
e1c0: 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   N);.  if( MEMDB
e1d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
e1e0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
e1f0: 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->fd, 0);.    sq
e200: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
e210: 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
e220: 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  N);.  }.}../*.**
e230: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
e240: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
e250: 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
e260: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e270: 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f  th.** pPager..*/
e280: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e290: 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
e2a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
e2b0: 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 n;.  assert( p
e2c0: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
e2d0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
e2e0: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
e2f0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
e300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
e310: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
e320: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
e330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e340: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
e350: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49   |= PAGER_ERR_DI
e360: 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SK;.    return 0
e370: 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61  ;.  }.  n /= pPa
e380: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
e390: 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
e3a0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
e3b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e3c0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
e3d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e3e0: 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
e3f0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
e400: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
e410: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
e420: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
e430: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
e440: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
e450: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
e460: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
e470: 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
e480: 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
e490: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
e4a0: 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
e4b0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
e4c0: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
e4d0: 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
e4e0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
e4f0: 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
e500: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76  sqlite3pager_mov
e510: 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
e520: 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
e530: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
e540: 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
e550: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
e560: 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
e570: 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
e580: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
e590: 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
e5a0: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
e5b0: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
e5c0: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
e5d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
e5e0: 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  umber is zero, t
e5f0: 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
e600: 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68   not in any hash
e610: 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72   chain. */.    r
e620: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
e630: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
e640: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
e650: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
e660: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
e670: 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
e680: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
e690: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e6a0: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
e6b0: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21  ash(pPg->pgno)]!
e6c0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
e6d0: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
e6e0: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
e6f0: 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
e700: 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67  .    int h = pag
e710: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
e720: 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
e730: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
e740: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
e750: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
e760: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
e770: 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f    }..  pPg->pgno
e780: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
e790: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
e7a0: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
e7b0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
e7c0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
e7d0: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
e7e0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
e7f0: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
e800: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
e810: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
e820: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
e830: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
e840: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
e850: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
e860: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
e870: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
e880: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
e890: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
e8a0: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
e8b0: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
e8c0: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
e8d0: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
e8e0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
e8f0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
e900: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
e910: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
e920: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
e930: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e940: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
e950: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
e960: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
e970: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
e980: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
e990: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
e9a0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
e9b0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
e9c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
e9d0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
e9e0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
e9f0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
ea00: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
ea10: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
ea20: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
ea30: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
ea40: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
ea50: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
ea60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ea70: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
ea80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
ea90: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
eaa0: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
eab0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
eac0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
ead0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
eae0: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
eaf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
eb00: 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
eb10: 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e  r, pPg);.}..#ifn
eb20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
eb30: 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54  MEMORYDB./*.** T
eb40: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
eb50: 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20  sed to truncate 
eb60: 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  an in-memory dat
eb70: 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a  abase.  Delete.*
eb80: 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  * all pages whos
eb90: 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72  e pgno is larger
eba0: 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62   than pPager->db
ebb0: 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65  Size and is unre
ebc0: 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66  ferenced..** Ref
ebd0: 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61  erenced pages la
ebe0: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
ebf0: 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72  ->dbSize are zer
ec00: 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  oed..*/.static v
ec10: 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61  oid memoryTrunca
ec20: 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
ec30: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
ec40: 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b  .  PgHdr **ppPg;
ec50: 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20  .  int dbSize = 
ec60: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
ec70: 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65  .  ppPg = &pPage
ec80: 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65  r->pAll;.  while
ec90: 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21  ( (pPg = *ppPg)!
eca0: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  =0 ){.    if( pP
ecb0: 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20  g->pgno<=dbSize 
ecc0: 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  ){.      ppPg = 
ecd0: 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
ece0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50      }else if( pP
ecf0: 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20  g->nRef>0 ){.   
ed00: 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
ed10: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c  TO_DATA(pPg), 0,
ed20: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
ed30: 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d  e);.      ppPg =
ed40: 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b   &pPg->pNextAll;
ed50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
ed60: 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70    *ppPg = pPg->p
ed70: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75  NextAll;.      u
ed80: 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a  nlinkPage(pPg);.
ed90: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
eda0: 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61  (pPg);.      pPa
edb0: 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20  ger->nPage--;.  
edc0: 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a    }.  }.}.#else.
edd0: 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72  #define memoryTr
ede0: 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66  uncate(p).#endif
edf0: 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65  ../*.** Truncate
ee00: 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74 68 65   the file to the
ee10: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
ee20: 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69   specified..*/.i
ee30: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
ee40: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
ee50: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61  pPager, Pgno nPa
ee60: 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ge){.  int rc;. 
ee70: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
ee80: 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
ee90: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
eea0: 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
eeb0: 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
eec0: 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
eed0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
eee0: 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e    if( nPage>=(un
eef0: 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e 64  signed)pPager->d
ef00: 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74  bSize ){.    ret
ef10: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
ef20: 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
ef30: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  {.    pPager->db
ef40: 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20  Size = nPage;.  
ef50: 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65    memoryTruncate
ef60: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
ef70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
ef80: 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a    }.  rc = syncJ
ef90: 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a  ournal(pPager);.
efa0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
efb0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72  _OK ){.    retur
efc0: 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  n rc;.  }.  rc =
efd0: 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28   pager_truncate(
efe0: 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a  pPager, nPage);.
eff0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
f000: 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  _OK ){.    pPage
f010: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67  r->dbSize = nPag
f020: 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  e;.  }.  return 
f030: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
f040: 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
f050: 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
f060: 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
f070: 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
f080: 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
f090: 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
f0a0: 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
f0b0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
f0c0: 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
f0d0: 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
f0e0: 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
f0f0: 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
f100: 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
f110: 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
f120: 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
f130: 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
f140: 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
f150: 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
f160: 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
f170: 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
f180: 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
f190: 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
f1a0: 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73  redump..*/.int s
f1b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
f1c0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
f1d0: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20  {.  PgHdr *pPg, 
f1e0: 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74 63 68  *pNext;.  switch
f1f0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20  ( pPager->state 
f200: 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41 47 45  ){.    case PAGE
f210: 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20 20 20  R_RESERVED:.    
f220: 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e 43 45  case PAGER_SYNCE
f230: 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50 41 47  D: .    case PAG
f240: 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a  ER_EXCLUSIVE: {.
f250: 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
f260: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
f270: 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  er);.      if( !
f280: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
f290: 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b   sqlite3OsUnlock
f2a0: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f  (&pPager->fd, NO
f2b0: 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a  _LOCK);.      }.
f2c0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
f2d0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f2e0: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  n==0 );.      br
f2f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
f300: 61 73 65 20 50 41 47 45 52 5f 53 48 41 52 45 44  ase PAGER_SHARED
f310: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 4d  : {.      if( !M
f320: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
f330: 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
f340: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
f350: 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
f360: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
f370: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
f380: 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74  .      /* Do not
f390: 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20 62 72  hing */.      br
f3a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
f3b0: 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
f3c0: 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
f3d0: 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65 66 20  pNext){.#ifndef 
f3e0: 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28 20 4d  NDEBUG.    if( M
f3f0: 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50 67  EMDB ){.      Pg
f400: 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
f410: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
f420: 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
f430: 20 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d     assert( !pPg-
f440: 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
f450: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
f460: 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29   !pHist->pOrig )
f470: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
f480: 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b  !pHist->pStmt );
f490: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
f4a0: 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70    pNext = pPg->p
f4b0: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c  NextAll;.    sql
f4c0: 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20 20  iteFree(pPg);.  
f4d0: 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c 4f 53  }.  TRACE2("CLOS
f4e0: 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  E %d\n", PAGERID
f4f0: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 73 71 6c  (pPager));.  sql
f500: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
f510: 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73 73 65  ger->fd);.  asse
f520: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
f530: 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20  nalOpen==0 );.  
f540: 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61 72  /* Temp files ar
f550: 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  e automatically 
f560: 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20 4f  deleted by the O
f570: 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67 65  S.  ** if( pPage
f580: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
f590: 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73 44   **   sqlite3OsD
f5a0: 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 46  elete(pPager->zF
f5b0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d  ilename);.  ** }
f5c0: 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74 65 46  .  */..  sqliteF
f5d0: 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ree(pPager);.  r
f5e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f5f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
f600: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
f610: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70   for the given p
f620: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e  age data..*/.Pgn
f630: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70  o sqlite3pager_p
f640: 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64 20 2a  agenumber(void *
f650: 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20  pData){.  PgHdr 
f660: 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  *p = DATA_TO_PGH
f670: 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74  DR(pData);.  ret
f680: 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a  urn p->pgno;.}..
f690: 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72  /*.** The page_r
f6a0: 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e  ef() function in
f6b0: 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66  crements the ref
f6c0: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
f6d0: 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74   a page..** If t
f6e0: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
f6f0: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
f700: 6c 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65  list (the refere
f710: 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72  nce count is zer
f720: 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76  o) then.** remov
f730: 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72  e it from the fr
f740: 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f  eelist..**.** Fo
f750: 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65  r non-test syste
f760: 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69  ms, page_ref() i
f770: 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63  s a macro that c
f780: 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29  alls _page_ref()
f790: 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68  .** online of th
f7a0: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
f7b0: 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20  t is zero.  For 
f7c0: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
f7d0: 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61  ge_ref().** is a
f7e0: 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73   real function s
f7f0: 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65  o that we can se
f800: 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e  t breakpoints an
f810: 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73  d trace it..*/.s
f820: 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65  tatic void _page
f830: 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29  _ref(PgHdr *pPg)
f840: 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  {.  if( pPg->nRe
f850: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  f==0 ){.    /* T
f860: 68 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65  he page is curre
f870: 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65  ntly on the free
f880: 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74  list.  Remove it
f890: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67  . */.    if( pPg
f8a0: 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70  ==pPg->pPager->p
f8b0: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
f8c0: 20 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20       PgHdr *p = 
f8d0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
f8e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26        while( p &
f8f0: 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  & p->needSync ){
f900: 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65   p = p->pNextFre
f910: 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e  e; }.      pPg->
f920: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
f930: 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a  nced = p;.    }.
f940: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72      if( pPg->pPr
f950: 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20  evFree ){.      
f960: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e  pPg->pPrevFree->
f970: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
f980: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
f990: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67  }else{.      pPg
f9a0: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
f9b0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
f9c0: 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  e;.    }.    if(
f9d0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
f9e0: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  ){.      pPg->pN
f9f0: 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
fa00: 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
fa10: 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ree;.    }else{.
fa20: 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
fa30: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
fa40: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d  pPrevFree;.    }
fa50: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
fa60: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nRef++;.  }.  
fa70: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52  pPg->nRef++;.  R
fa80: 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23  EFINFO(pPg);.}.#
fa90: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42  ifdef SQLITE_DEB
faa0: 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64  UG.  static void
fab0: 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20   page_ref(PgHdr 
fac0: 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70  *pPg){.    if( p
fad0: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
fae0: 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70       _page_ref(p
faf0: 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
fb00: 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b        pPg->nRef+
fb10: 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f  +;.      REFINFO
fb20: 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (pPg);.    }.  }
fb30: 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
fb40: 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28  page_ref(P)   ((
fb50: 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67  P)->nRef==0?_pag
fb60: 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28  e_ref(P):(void)(
fb70: 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64  P)->nRef++).#end
fb80: 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d  if../*.** Increm
fb90: 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63  ent the referenc
fba0: 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61  e count for a pa
fbb0: 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70  ge.  The input p
fbc0: 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72  ointer is.** a r
fbd0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
fbe0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e  page data..*/.in
fbf0: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
fc00: 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  ef(void *pData){
fc10: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
fc20: 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
fc30: 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65 66  ata);.  page_ref
fc40: 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
fc50: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
fc60: 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75  .** Sync the jou
fc70: 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72 20  rnal.  In other 
fc80: 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72 65  words, make sure
fc90: 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20 74   all the pages t
fca0: 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65 6e  hat have.** been
fcb0: 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
fcc0: 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63 74  journal have act
fcd0: 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74 68  ually reached th
fce0: 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68 65  e surface of the
fcf0: 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69 73  .** disk.  It is
fd00: 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f 64   not safe to mod
fd10: 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ify the original
fd20: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
fd30: 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74 68  ntil after.** th
fd40: 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62 65  e journal has be
fd50: 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20 74  en synced.  If t
fd60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
fd70: 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65 64  base is modified
fd80: 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20 6a   before.** the j
fd90: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
fda0: 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61 69   and a power fai
fdb0: 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68 65  lure occurs, the
fdc0: 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e 61   unsynced journa
fdd0: 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64 20  l.** data would 
fde0: 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20 77  be lost and we w
fdf0: 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20 74  ould be unable t
fe00: 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f 6c  o completely rol
fe10: 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61 74  lback the.** dat
fe20: 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20 20  abase changes.  
fe30: 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70 74  Database corrupt
fe40: 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72 2e  ion would occur.
fe50: 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f 75  .** .** This rou
fe60: 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74 65  tine also update
fe70: 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64  s the nRec field
fe80: 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20 6f   in the header o
fe90: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  f the journal..*
fea0: 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20  * (See comments 
feb0: 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c 61  on the pager_pla
fec0: 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  yback() routine 
fed0: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
fee0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20  nformation.).** 
fef0: 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64 65  If the sync mode
ff00: 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73 79   is FULL, two sy
ff10: 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e 20  ncs will occur. 
ff20: 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c 65   First the whole
ff30: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20 73   journal.** is s
ff40: 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65 20  ynced, then the 
ff50: 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
ff60: 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73 65  dated, then a se
ff70: 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72 73  cond sync occurs
ff80: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d 70  ..**.** For temp
ff90: 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73 2c  orary databases,
ffa0: 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
ffb0: 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20 74  if we are able t
ffc0: 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66  o rollback.** af
ffd0: 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69 6c  ter a power fail
ffe0: 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63 63  ure, so sync occ
fff0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  urs..**.** This 
10000 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20 74  routine clears t
10010 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65 6c  he needSync fiel
10020 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65 20  d of every page 
10030 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e 0a  current held in.
10040 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74  ** memory..*/.st
10050 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75  atic int syncJou
10060 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67  rnal(Pager *pPag
10070 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
10080 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  g;.  int rc = SQ
10090 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53  LITE_OK;..  /* S
100a0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
100b0 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e 67  before modifying
100c0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
100d0 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69 6e  se.  ** (assumin
100e0 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f 75  g there is a jou
100f0 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65 64  rnal and it need
10100 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e 29  s to be synced.)
10110 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
10120 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  er->needSync ){.
10130 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72 2d      if( !pPager-
10140 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 20  >tempFile ){.   
10150 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
10160 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
10170 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65 72  ;.      /* asser
10180 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79  t( !pPager->noSy
10190 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20  nc ); // noSync 
101a0 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66 20  might be set if 
101b0 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20 20  synchronous.    
101c0 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64 20    ** was turned 
101d0 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74 72  off after the tr
101e0 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73 74  ansaction was st
101f0 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20 23  arted.  Ticket #
10200 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20 4e  615 */.#ifndef N
10210 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20 20  DEBUG.      {.  
10220 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73 75        /* Make su
10230 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e 6e  re the pPager->n
10240 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20 61  Rec counter we a
10250 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65 65  re keeping agree
10260 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69 74  s.        ** wit
10270 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70 75  h the nRec compu
10280 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69 7a  ted from the siz
10290 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
102a0 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a   file..        *
102b0 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a 53  /.        i64 jS
102c0 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  z;.        rc = 
102d0 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
102e0 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
102f0 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  &jSz);.        i
10300 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72  f( rc!=0 ) retur
10310 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61 73  n rc;.        as
10320 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
10330 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b  urnalOff==jSz );
10340 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
10350 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
10360 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52 65  /* Write the nRe
10370 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68 65  c value into the
10380 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 65   journal file he
10390 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20 20  ader. If in.    
103a0 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63      ** full-sync
103b0 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73 79  hronous mode, sy
103c0 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  nc the journal f
103d0 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75 72  irst. This ensur
103e0 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  es that.        
103f0 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73 20  ** all data has 
10400 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20 64  really hit the d
10410 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63 20  isk before nRec 
10420 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d 61  is updated to ma
10430 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74  rk.        ** it
10440 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65 20   as a candidate 
10450 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20  for rollback. . 
10460 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
10470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
10480 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
10490 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43      TRACE2("SYNC
104a0 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e   journal of %d\n
104b0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
104c0 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  r));.          r
104d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
104e0 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
104f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
10500 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
10510 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
10520 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
10530 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
10540 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48  pPager->journalH
10550 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f 75  dr + sizeof(aJou
10560 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 20  rnalMagic));.   
10570 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33       rc = write3
10580 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
10590 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  fd, pPager->nRec
105a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
105b0 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
105c0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
105d0 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
105e0 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
105f0 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20 7d  nalOff);.      }
10600 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53  .      TRACE2("S
10610 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
10620 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
10630 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72 63  ager));.      rc
10640 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63   = sqlite3OsSync
10650 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a  (&pPager->jfd);.
10660 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
10670 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
10680 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
10690 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a 20  alStarted = 1;. 
106a0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
106b0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 0a  >needSync = 0;..
106c0 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68 65      /* Erase the
106d0 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 66   needSync flag f
106e0 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e 0a  rom every page..
106f0 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 70      */.    for(p
10700 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
10710 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
10720 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20  NextAll){.      
10730 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
10740 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61  0;.    }.    pPa
10750 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10760 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  d = pPager->pFir
10770 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66  st;.  }..#ifndef
10780 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66 20   NDEBUG.  /* If 
10790 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79  the Pager.needSy
107a0 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61 72  nc flag is clear
107b0 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72 2e   then the PgHdr.
107c0 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66 6c  needSync.  ** fl
107d0 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65 20  ag must also be 
107e0 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70 61  clear for all pa
107f0 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68 61  ges.  Verify tha
10800 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76 61  t this.  ** inva
10810 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a 20  riant is true.. 
10820 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20 20   */.  else{.    
10830 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
10840 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
10850 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
10860 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
10870 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29 3b  ->needSync==0 );
10880 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
10890 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  t( pPager->pFirs
108a0 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72 2d  tSynced==pPager-
108b0 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a 23  >pFirst );.  }.#
108c0 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e 20  endif..  return 
108d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  rc;.}../*.** Try
108e0 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63   to obtain a loc
108f0 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e  k on a file.  In
10900 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63 61  voke the busy ca
10910 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c 6f  llback if the lo
10920 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e 74  ck.** is current
10930 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ly not available
10940 2e 20 20 52 65 70 65 61 74 65 20 75 6e 74 69 6c  .  Repeate until
10950 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
10960 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61  ck returns.** fa
10970 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68 65  lse or until the
10980 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e 0a   lock succeeds..
10990 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c  **.** Return SQL
109a0 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
109b0 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63  s and an error c
109c0 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f 74  ode if we cannot
109d0 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c   obtain.** the l
109e0 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ock..*/.static i
109f0 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e  nt pager_wait_on
10a00 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50 61  _lock(Pager *pPa
10a10 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70  ger, int locktyp
10a20 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  e){.  int rc;.  
10a30 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53 48  assert( PAGER_SH
10a40 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43  ARED==SHARED_LOC
10a50 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  K );.  assert( P
10a60 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d 52  AGER_RESERVED==R
10a70 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a  ESERVED_LOCK );.
10a80 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
10a90 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55  EXCLUSIVE==EXCLU
10aa0 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69  SIVE_LOCK );.  i
10ab0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
10ac0 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20  >=locktype ){.  
10ad0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
10ae0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
10af0 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20 20  nt busy = 1;.   
10b00 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
10b10 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
10b20 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b  pPager->fd, lock
10b30 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c  type);.    }whil
10b40 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  e( rc==SQLITE_BU
10b50 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20 70  SY && .        p
10b60 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
10b70 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20 20  ler && .        
10b80 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10b90 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a  dler->xFunc && .
10ba0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
10bb0 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46  pBusyHandler->xF
10bc0 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75 73  unc(pPager->pBus
10bd0 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20  yHandler->pArg, 
10be0 62 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20  busy++).    );. 
10bf0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
10c00 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  E_OK ){.      pP
10c10 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f  ager->state = lo
10c20 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20  cktype;.    }.  
10c30 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
10c40 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61 20  ../*.** Given a 
10c50 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28 63  list of pages (c
10c60 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65 20  onnected by the 
10c70 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f 69  PgHdr.pDirty poi
10c80 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20 65  nter) write.** e
10c90 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f 73  very one of thos
10ca0 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20 74  e pages out to t
10cb0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
10cc0 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20 61   and mark them a
10cd0 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e 0a  ll.** as clean..
10ce0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
10cf0 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69  ger_write_pageli
10d00 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74 29  st(PgHdr *pList)
10d10 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
10d20 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  r;.  int rc;..  
10d30 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
10d40 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
10d50 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69 73  .  pPager = pLis
10d60 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  t->pPager;..  /*
10d70 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74   At this point t
10d80 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74 68  here may be eith
10d90 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f 72  er a RESERVED or
10da0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
10db0 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  on the.  ** data
10dc0 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74 68  base file. If th
10dd0 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20 61  ere is already a
10de0 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  n EXCLUSIVE lock
10df0 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  , the following.
10e00 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71    ** calls to sq
10e10 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61 72  lite3OsLock() ar
10e20 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20  e no-ops..  **. 
10e30 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20 6c   ** Moving the l
10e40 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56 45  ock from RESERVE
10e50 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20 61  D to EXCLUSIVE a
10e60 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65 73  ctually involves
10e70 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72 6f   going.  ** thro
10e80 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64 69  ugh an intermedi
10e90 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49 4e  ate state PENDIN
10ea0 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20 6c  G.   A PENDING l
10eb0 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65 77  ock prevents new
10ec0 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66 72  .  ** readers fr
10ed0 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f 20  om attaching to 
10ee0 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75 74  the database but
10ef0 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e 74   is unsufficient
10f00 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a 20   for us to.  ** 
10f10 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65 61  write.  The idea
10f20 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c 6f   of a PENDING lo
10f30 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e 74  ck is to prevent
10f40 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72 6f   new readers fro
10f50 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e  m.  ** coming in
10f60 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20 66   while we wait f
10f70 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61 64  or existing read
10f80 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20 20  ers to clear..  
10f90 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74 68  **.  ** While th
10fa0 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74 68  e pager is in th
10fb0 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74 65  e RESERVED state
10fc0 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  , the original d
10fd0 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20 2a  atabase file.  *
10fe0 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20 61  * is unchanged a
10ff0 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62 61  nd we can rollba
11000 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69 6e  ck without havin
11010 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74 68  g to playback th
11020 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69  e.  ** journal i
11030 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  nto the original
11040 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
11050 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69 74   Once we transit
11060 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43 4c  ion to.  ** EXCL
11070 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73 20  USIVE, it means 
11080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
11090 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e 67  e has been chang
110a0 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c 62  ed and any rollb
110b0 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72 65  ack.  ** will re
110c0 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c 20  quire a journal 
110d0 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20  playback..  */. 
110e0 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
110f0 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
11100 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
11110 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
11120 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
11130 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 77  urn rc;.  }..  w
11140 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a 20  hile( pList ){. 
11150 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
11160 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 73  ->dirty );.    s
11170 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
11180 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73 74  ager->fd, (pList
11190 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70  ->pgno-1)*(i64)p
111a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
111b0 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72  ;.    /* If ther
111c0 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65  e are dirty page
111d0 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  s in the page ca
111e0 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75  che with page nu
111f0 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20  mbers greater.  
11200 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e    ** than Pager.
11210 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61  dbSize, this mea
11220 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ns sqlite3pager_
11230 74 72 75 6e 63 61 74 65 28 29 20 77 61 73 20 63  truncate() was c
11240 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20  alled to.    ** 
11250 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d  make the file sm
11260 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c  aller (presumabl
11270 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  y by auto-vacuum
11280 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77   code). Do not w
11290 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20  rite.    ** any 
112a0 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74 68  such pages to th
112b0 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
112c0 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67     if( pList->pg
112d0 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69  no<=pPager->dbSi
112e0 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f 44 45  ze ){.      CODE
112f0 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
11300 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
11310 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b  pList->pgno, 6);
11320 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53  .      TRACE3("S
11330 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
11340 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11350 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
11360 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  );.      rc = sq
11370 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
11380 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
11390 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
113a0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
113b0 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70  );.      CODEC(p
113c0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
113d0 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
113e0 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20  st->pgno, 0);.  
113f0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 57 72 69      pPager->nWri
11400 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  te++;.    }.#ifn
11410 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 65  def NDEBUG.    e
11420 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45  lse{.      TRACE
11430 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20 70 61  3("NOSTORE %d pa
11440 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
11450 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73 74  D(pPager), pList
11460 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23  ->pgno);.    }.#
11470 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20 72 63  endif.    if( rc
11480 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
11490 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 3d    pList->dirty =
114a0 20 30 3b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   0;.    pList = 
114b0 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
114c0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
114d0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
114e0 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
114f0 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
11500 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
11510 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
11520 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
11530 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
11540 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
11550 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
11560 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
11570 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
11580 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
11590 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
115a0 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
115b0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 2c 20 2a  ){.  PgHdr *p, *
115c0 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73 74 20 3d  pList;.  pList =
115d0 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70 50 61 67   0;.  for(p=pPag
115e0 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20 70 3d 70  er->pAll; p; p=p
115f0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
11600 20 69 66 28 20 70 2d 3e 64 69 72 74 79 20 29 7b   if( p->dirty ){
11610 0a 20 20 20 20 20 20 70 2d 3e 70 44 69 72 74 79  .      p->pDirty
11620 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20 20 20 20   = pList;.      
11630 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20 20 20 7d  pList = p;.    }
11640 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
11650 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63  ist;.}../*.** Ac
11660 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a 2a  quire a page..**
11670 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b 20  .** A read lock 
11680 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  on the disk file
11690 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68 65   is obtained whe
116a0 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67 65  n the first page
116b0 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a 2a   is acquired. .*
116c0 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63 6b  * This read lock
116d0 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65 6e   is dropped when
116e0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
116f0 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a  s released..**.*
11700 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20 66  * A _get works f
11710 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d 62  or any page numb
11720 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e 20  er greater than 
11730 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  0.  If the datab
11740 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20 73  ase.** file is s
11750 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 20  maller than the 
11760 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c 20  requested page, 
11770 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20 64  then no actual d
11780 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63 75  isk.** read occu
11790 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f 72  rs and the memor
117a0 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20 70  y image of the p
117b0 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  age is initializ
117c0 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72  ed to.** all zer
117d0 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20 64  os.  The extra d
117e0 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ata appended to 
117f0 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79 73  a page is always
11800 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a 20   initialized.** 
11810 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69 72  to zeros the fir
11820 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20 69  st time a page i
11830 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d 65  s loaded into me
11840 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  mory..**.** The 
11850 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67 68  acquisition migh
11860 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65 72  t fail for sever
11870 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e 20  al reasons.  In 
11880 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61 6e  all cases,.** an
11890 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72   appropriate err
118a0 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
118b0 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65 20  ned and *ppPage 
118c0 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a  is set to NULL..
118d0 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73  **.** See also s
118e0 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
118f0 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69 73  up().  Both this
11900 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c 6f   routine and _lo
11910 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a 2a  okup() attempt.*
11920 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67 65  * to find a page
11930 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72   in the in-memor
11940 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20 20  y cache first.  
11950 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  If the page is n
11960 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69 6e  ot already.** in
11970 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72 6f   memory, this ro
11980 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64 69  utine goes to di
11990 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69 6e  sk to read it in
119a0 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75 70   whereas _lookup
119b0 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75 72  ().** just retur
119c0 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75 74  ns 0.  This rout
119d0 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20 72  ine acquires a r
119e0 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69 72  ead-lock the fir
119f0 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68 61  st time it.** ha
11a00 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b 2c  s to go to disk,
11a10 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f 20   and could also 
11a20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64 20  playback an old 
11a30 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65 73  journal if neces
11a40 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f  sary..** Since _
11a50 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20 67  lookup() never g
11a60 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74 20  oes to disk, it 
11a70 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65 61  never has to dea
11a80 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20  l with locks.** 
11a90 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 73  or journal files
11aa0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
11ab0 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72 20  pager_get(Pager 
11ac0 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
11ad0 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61 67  no, void **ppPag
11ae0 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  e){.  PgHdr *pPg
11af0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
11b00 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70 61  * The maximum pa
11b10 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e 33  ge number is 2^3
11b20 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  1. Return SQLITE
11b30 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70 61  _CORRUPT if a pa
11b40 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20 67  ge.  ** number g
11b50 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69 73  reater than this
11b60 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72 65  , or zero, is re
11b70 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20 20  quested..  */.  
11b80 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f 4d  if( pgno>PAGER_M
11b90 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d  AX_PGNO || pgno=
11ba0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
11bb0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
11bc0 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20  .  }..  /* Make 
11bd0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
11be0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
11bf0 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
11c00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11c10 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65  !=0 );.  *ppPage
11c20 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
11c30 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
11c40 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
11c50 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61  ){.    return pa
11c60 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
11c70 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  er);.  }..  /* I
11c80 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
11c90 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65  rst page accesse
11ca0 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48  d, then get a SH
11cb0 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f  ARED lock.  ** o
11cc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11cd0 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ile..  */.  if( 
11ce0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
11cf0 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
11d00 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
11d10 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
11d20 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
11d30 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
11d40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65  E_OK ){.      re
11d50 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a  turn rc;.    }..
11d60 20 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72      /* If a jour
11d70 6e 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c  nal file exists,
11d80 20 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f   and there is no
11d90 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f   RESERVED lock o
11da0 6e 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74  n the.    ** dat
11db0 61 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e  abase file, then
11dc0 20 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73   it either needs
11dd0 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61   to be played ba
11de0 63 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20  ck or deleted.. 
11df0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50     */.    if( pP
11e00 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
11e10 20 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c   && .        sql
11e20 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73  ite3OsFileExists
11e30 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
11e40 6c 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 73  l) &&.        !s
11e50 71 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73  qlite3OsCheckRes
11e60 65 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65  ervedLock(&pPage
11e70 72 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20  r->fd) .    ){. 
11e80 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20        int rc;.. 
11e90 20 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20        /* Get an 
11ea0 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
11eb0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11ec0 69 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69  ile. At this poi
11ed0 6e 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20  nt it is.       
11ee0 2a 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  ** important tha
11ef0 74 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63  t a RESERVED loc
11f00 6b 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65  k is not obtaine
11f10 64 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20  d on the way to 
11f20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58  the.       ** EX
11f30 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66  CLUSIVE lock. If
11f40 20 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65   it were, anothe
11f50 72 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20  r process might 
11f60 6f 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20  open the.       
11f70 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11f80 2c 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53  , detect the RES
11f90 45 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20  ERVED lock, and 
11fa0 63 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68  conclude that th
11fb0 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  e.       ** data
11fc0 62 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20  base is safe to 
11fd0 72 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20  read while this 
11fe0 70 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c  process is still
11ff0 20 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20   rolling it .   
12000 20 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20      ** back..   
12010 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a      ** .       *
12020 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e  * Because the in
12030 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52  termediate RESER
12040 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20  VED lock is not 
12050 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20  requested, the. 
12060 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20        ** second 
12070 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74  process will get
12080 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69   to this point i
12090 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66  n the code and f
120a0 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a  ail to.       **
120b0 20 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e   obtain it's own
120c0 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20   EXCLUSIVE lock 
120d0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
120e0 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  file..       */.
120f0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12100 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65  te3OsLock(&pPage
12110 72 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45  r->fd, EXCLUSIVE
12120 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69  _LOCK);.       i
12130 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12140 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
12150 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
12160 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
12170 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
12180 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
12190 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
121a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
121b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
121c0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
121d0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a  AGER_EXCLUSIVE;.
121e0 0a 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20  .       /* Open 
121f0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20  the journal for 
12200 72 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52  reading only.  R
12210 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
12220 59 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77  Y if.       ** w
12230 65 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20  e are unable to 
12240 6f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  open the journal
12250 20 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a   file. .       *
12260 2a 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20  *.       ** The 
12270 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65  journal file doe
12280 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
12290 20 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20   locked itself. 
122a0 20 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a   The.       ** j
122b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e  ournal file is n
122c0 65 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73  ever open unless
122d0 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
122e0 73 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20  se file holds.  
122f0 20 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20       ** a write 
12300 6c 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69  lock, so there i
12310 73 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e  s never any chan
12320 63 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72  ce of two or mor
12330 65 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63  e.       ** proc
12340 65 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68  esses opening th
12350 65 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65  e journal at the
12360 20 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20   same time..    
12370 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
12380 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
12390 65 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e  eadOnly(pPager->
123a0 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65  zJournal, &pPage
123b0 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20  r->jfd);.       
123c0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
123d0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71  K ){.         sq
123e0 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
123f0 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f  Pager->fd, NO_LO
12400 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50  CK);.         pP
12410 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
12420 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20  GER_UNLOCK;.    
12430 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12440 54 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20  TE_BUSY;.       
12450 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
12460 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31  >journalOpen = 1
12470 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
12480 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
12490 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67  = 0;.       pPag
124a0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
124b0 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
124c0 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
124d0 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  ;.       pPager-
124e0 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
124f0 0a 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79  ..       /* Play
12500 62 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  back and delete 
12510 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72  the journal.  Dr
12520 6f 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20  op the database 
12530 77 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20  write.       ** 
12540 6c 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69  lock and reacqui
12550 72 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b  re the read lock
12560 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
12570 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
12580 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
12590 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
125a0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
125b0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
125c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20         }.    }. 
125d0 20 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65     pPg = 0;.  }e
125e0 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72  lse{.    /* Sear
125f0 63 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63  ch for page in c
12600 61 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20  ache */.    pPg 
12610 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
12620 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
12630 20 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70    if( MEMDB && p
12640 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
12650 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20  GER_UNLOCK ){.  
12660 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
12670 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
12680 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
12690 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
126a0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
126b0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
126c0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
126d0 2a 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20  */.    int h;.  
126e0 20 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b    pPager->nMiss+
126f0 2b 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  +;.    if( pPage
12700 72 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d  r->nPage<pPager-
12710 3e 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65  >mxPage || pPage
12720 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20  r->pFirst==0 || 
12730 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f  MEMDB ){.      /
12740 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70  * Create a new p
12750 61 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67  age */.      pPg
12760 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
12770 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29  aw( sizeof(*pPg)
12780 20 2b 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69   + pPager->psAli
12790 67 6e 65 64 0a 20 20 20 20 20 20 20 20 20 20 20  gned.           
127a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127b0 20 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29     + sizeof(u32)
127c0 20 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72   + pPager->nExtr
127d0 61 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a.              
127e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127f0 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50  + MEMDB*sizeof(P
12800 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20  gHistory) );.   
12810 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
12820 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 4d 45  .        if( !ME
12830 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20  MDB ){.         
12840 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
12850 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12860 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
12870 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
12880 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a   PAGER_ERR_MEM;.
12890 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
128a0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
128b0 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65     }.      memse
128c0 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66  t(pPg, 0, sizeof
128d0 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69  (*pPg));.      i
128e0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
128f0 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
12900 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
12910 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66  ager), 0, sizeof
12920 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20  (PgHistory));.  
12930 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
12940 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
12950 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
12960 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e  xtAll = pPager->
12970 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67  pAll;.      pPag
12980 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a  er->pAll = pPg;.
12990 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
129a0 61 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65  age++;.    }else
129b0 7b 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20  {.      /* Find 
129c0 61 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c  a page to recycl
129d0 65 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74  e.  Try to locat
129e0 65 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  e a page that do
129f0 65 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20  es not.      ** 
12a00 72 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f  require us to do
12a10 20 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74   an fsync() on t
12a20 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  he journal..    
12a30 20 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d    */.      pPg =
12a40 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
12a50 79 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a  ynced;..      /*
12a60 20 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74   If we could not
12a70 20 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61   find a page tha
12a80 74 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69  t does not requi
12a90 72 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20  re an fsync().  
12aa0 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f      ** on the jo
12ab0 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20  urnal file then 
12ac0 66 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61  fsync the journa
12ad0 6c 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73  l file.  This is
12ae0 20 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79   a.      ** very
12af0 20 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c   slow operation,
12b00 20 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64   so we work hard
12b10 20 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42   to avoid it.  B
12b20 75 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20  ut sometimes.   
12b30 20 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62     ** it can't b
12b40 65 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20  e helped..      
12b50 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
12b60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
12b70 6e 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  nt rc = syncJour
12b80 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
12b90 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
12ba0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12bb0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
12bc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
12bd0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12be0 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
12bf0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
12c00 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
12c10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
12c20 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
12c30 20 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e   mode, write a n
12c40 65 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  ew journal heade
12c50 72 20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a  r into the..  **
12c60 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54   journal file. T
12c70 68 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61  his is done to a
12c80 76 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79  void ever modify
12c90 69 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20  ing a journal.. 
12ca0 20 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20   ** header that 
12cb0 69 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74  is involved in t
12cc0 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70  he rollback of p
12cd0 61 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 09  ages that have..
12ce0 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65    ** already bee
12cf0 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
12d00 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61   database (in ca
12d10 73 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73  se the header is
12d20 0a 09 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77  ..  ** trashed w
12d30 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65  hen the nRec fie
12d40 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a  ld is updated)..
12d50 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
12d60 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
12d70 52 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Rec = 0;.       
12d80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
12d90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20  r->journalOff > 
12da0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  0 );.          r
12db0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
12dc0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20  Hdr(pPager);.   
12dd0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
12de0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12df0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
12e00 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
12e10 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
12e20 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
12e30 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
12e40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
12e50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
12e60 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
12e70 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
12e80 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20  Ref==0 );..     
12e90 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61   /* Write the pa
12ea0 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
12eb0 73 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73  se file if it is
12ec0 20 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f   dirty..      */
12ed0 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
12ee0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20  dirty ){.       
12ef0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
12f00 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
12f10 20 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79       pPg->pDirty
12f20 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63   = 0;.        rc
12f30 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
12f40 61 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a  agelist( pPg );.
12f50 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
12f60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12f70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
12f80 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
12f90 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
12fa0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12fb0 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ERR;.        }. 
12fc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
12fd0 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d  ert( pPg->dirty=
12fe0 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
12ff0 49 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61  If the page we a
13000 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20  re recycling is 
13010 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
13020 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20  Rollback, then. 
13030 20 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20       ** set the 
13040 67 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c  global alwaysRol
13050 6c 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73  lback flag, thus
13060 20 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20   disabling the. 
13070 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64       ** sqlite_d
13080 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f  ont_rollback() o
13090 70 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20  ptimization for 
130a0 74 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73  the rest of this
130b0 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
130c0 20 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63      ** It is nec
130d0 65 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69  essary to do thi
130e0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61  s because the pa
130f0 67 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  ge marked always
13100 52 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  Rollback.      *
13110 2a 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61  * might be reloa
13120 64 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74  ded at a later t
13130 69 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20  ime but at that 
13140 70 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72  point we won't r
13150 65 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a  emember.      **
13160 20 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72   that is was mar
13170 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
13180 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20  ck.  This means 
13190 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d  that all pages m
131a0 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20  ust.      ** be 
131b0 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73  marked as always
131c0 52 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65  Rollback from he
131d0 72 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20  re on out..     
131e0 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50   */.      if( pP
131f0 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
13200 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  k ){.        pPa
13210 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
13220 61 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  ack = 1;.      }
13230 0a 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e  ..      /* Unlin
13240 6b 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66  k the old page f
13250 72 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73  rom the free lis
13260 74 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74  t and the hash t
13270 61 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20  able.      */.  
13280 20 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70      unlinkPage(p
13290 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
132a0 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20  r->nOvfl++;.    
132b0 7d 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20  }.    pPg->pgno 
132c0 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20  = pgno;.    if( 
132d0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
132e0 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
132f0 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
13300 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
13310 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28  ite3CheckMemory(
13320 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
13330 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20  al, pgno/8);.   
13340 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
13350 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
13360 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
13370 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72  ournal = (pPager
13380 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e  ->aInJournal[pgn
13390 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f  o/8] & (1<<(pgno
133a0 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20  &7)))!=0;.      
133b0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  pPg->needSync = 
133c0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
133d0 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
133e0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  al = 0;.      pP
133f0 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  g->needSync = 0;
13400 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13410 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26  Pager->aInStmt &
13420 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
13430 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20  ger->stmtSize.  
13440 20 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70             && (p
13450 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
13460 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67  gno/8] & (1<<(pg
13470 6e 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20  no&7)))!=0 ){.  
13480 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
13490 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
134a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
134b0 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f   page_remove_fro
134c0 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  m_stmt_list(pPg)
134d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
134e0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
134f0 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20  pPg->nRef = 1;. 
13500 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
13510 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
13520 66 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67  f++;.    h = pag
13530 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
13540 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73     pPg->pNextHas
13550 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73  h = pPager->aHas
13560 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72  h[h];.    pPager
13570 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67  ->aHash[h] = pPg
13580 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
13590 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20  NextHash ){.    
135a0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
135b0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
135c0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ash==0 );.      
135d0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
135e0 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
135f0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
13600 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
13610 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
13620 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
13630 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
13640 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
13650 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
13660 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
13670 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  t(pPager);.    i
13680 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
13690 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  sk!=0 ){.      s
136a0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
136b0 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  f(PGHDR_TO_DATA(
136c0 70 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20  pPg));.      rc 
136d0 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
136e0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
136f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
13700 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13710 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f  dbSize<(int)pgno
13720 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74   ){.      memset
13730 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
13740 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
13750 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
13760 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
13770 72 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  rc;.      assert
13780 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20  ( MEMDB==0 );.  
13790 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
137a0 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28  k(&pPager->fd, (
137b0 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61  pgno-1)*(i64)pPa
137c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
137d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
137e0 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
137f0 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
13800 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
13810 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
13820 20 20 20 54 52 41 43 45 33 28 22 46 45 54 43 48     TRACE3("FETCH
13830 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
13840 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
13850 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
13860 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
13870 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
13880 50 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Pg), pPg->pgno, 
13890 33 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  3);.      if( rc
138a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
138b0 20 20 20 20 20 20 20 69 36 34 20 66 69 6c 65 53         i64 fileS
138c0 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ize;.        if(
138d0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
138e0 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26  ze(&pPager->fd,&
138f0 66 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54  fileSize)!=SQLIT
13900 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20  E_OK.           
13910 20 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e      || fileSize>
13920 3d 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61  =pgno*pPager->pa
13930 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20  geSize ){.      
13940 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
13950 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
13960 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
13970 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
13980 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
13990 20 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74            memset
139a0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
139b0 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  Pg), 0, pPager->
139c0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
139d0 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
139e0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
139f0 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 20  ->nRead++;.     
13a00 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
13a10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
13a20 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69  uested page is i
13a30 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
13a40 2e 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  . */.    pPager-
13a50 3e 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67  >nHit++;.    pag
13a60 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a  e_ref(pPg);.  }.
13a70 20 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44    *ppPage = PGHD
13a80 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
13a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13aa0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71  OK;.}../*.** Acq
13ab0 75 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69  uire a page if i
13ac0 74 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20  t is already in 
13ad0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
13ae0 63 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20  che.  Do.** not 
13af0 72 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72  read the page fr
13b00 6f 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e  om disk.  Return
13b10 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
13b20 65 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20  e page,.** or 0 
13b30 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e  if the page is n
13b40 6f 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  ot in cache..**.
13b50 2a 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69  ** See also sqli
13b60 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20  te3pager_get(). 
13b70 20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   The difference 
13b80 62 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75  between this rou
13b90 74 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69  tine.** and sqli
13ba0 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69  te3pager_get() i
13bb0 73 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69  s that _get() wi
13bc0 6c 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73  ll go to the dis
13bd0 6b 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e  k and read.** in
13be0 20 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65   the page if the
13bf0 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
13c00 65 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20  eady in cache.  
13c10 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20  This routine.** 
13c20 72 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20  returns NULL if 
13c30 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20  the page is not 
13c40 69 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61  in cache or if a
13c50 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20   disk I/O error 
13c60 0a 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70  .** has ever hap
13c70 70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a  pened..*/.void *
13c80 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
13c90 6b 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65  kup(Pager *pPage
13ca0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20  r, Pgno pgno){. 
13cb0 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
13cc0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d  assert( pPager!=
13cd0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
13ce0 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  gno!=0 );.  if( 
13cf0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
13d00 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55  & ~(PAGER_ERR_FU
13d10 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  LL) ){.    retur
13d20 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d  n 0;.  }.  pPg =
13d30 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
13d40 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
13d50 66 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75  f( pPg==0 ) retu
13d60 72 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66  rn 0;.  page_ref
13d70 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
13d80 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
13d90 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  g);.}../*.** Rel
13da0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
13db0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
13dc0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
13dd0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
13de0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
13df0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
13e00 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
13e10 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
13e20 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
13e30 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
13e40 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
13e50 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
13e60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
13e70 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
13e80 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
13e90 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76  te3pager_unref(v
13ea0 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
13eb0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a  gHdr *pPg;..  /*
13ec0 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72   Decrement the r
13ed0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
13ee0 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a  or this page.  *
13ef0 2f 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54  /.  pPg = DATA_T
13f00 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
13f10 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
13f20 52 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e  Ref>0 );.  pPg->
13f30 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46  nRef--;.  REFINF
13f40 4f 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68  O(pPg);..  /* Wh
13f50 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  en the number of
13f60 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61   references to a
13f70 20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63   page reach 0, c
13f80 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73  all the.  ** des
13f90 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20  tructor and add 
13fa0 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
13fb0 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20  freelist..  */. 
13fc0 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d   if( pPg->nRef==
13fd0 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a  0 ){.    Pager *
13fe0 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67  pPager;.    pPag
13ff0 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72  er = pPg->pPager
14000 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
14010 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  Free = 0;.    pP
14020 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  g->pPrevFree = p
14030 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20  Pager->pLast;.  
14040 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20    pPager->pLast 
14050 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
14060 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b  Pg->pPrevFree ){
14070 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65  .      pPg->pPre
14080 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65  vFree->pNextFree
14090 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73   = pPg;.    }els
140a0 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  e{.      pPager-
140b0 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20  >pFirst = pPg;. 
140c0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
140d0 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26  ->needSync==0 &&
140e0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
140f0 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20  ynced==0 ){.    
14100 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
14110 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20  Synced = pPg;.  
14120 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67    }.    if( pPag
14130 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
14140 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
14150 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61  >xDestructor(pDa
14160 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
14170 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a  Size);.    }.  .
14180 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20      /* When all 
14190 70 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20  pages reach the 
141a0 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74  freelist, drop t
141b0 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f  he read lock fro
141c0 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74  m.    ** the dat
141d0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
141e0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
141f0 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72  Ref--;.    asser
14200 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e  t( pPager->nRef>
14210 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50  =0 );.    if( pP
14220 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26  ager->nRef==0 &&
14230 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
14240 20 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61   pager_reset(pPa
14250 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ger);.    }.  }.
14260 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
14270 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  OK;.}../*.** Cre
14280 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69  ate a journal fi
14290 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20  le for pPager.  
142a0 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72  There should alr
142b0 65 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56  eady be a RESERV
142c0 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49  ED.** or EXCLUSI
142d0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  VE lock on the d
142e0 61 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65  atabase file whe
142f0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
14300 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20  s called..**.** 
14310 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
14320 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20   if everything. 
14330 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72   Return an error
14340 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73   code and releas
14350 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c  e the.** write l
14360 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20  ock if anything 
14370 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73  goes wrong..*/.s
14380 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
14390 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67  open_journal(Pag
143a0 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
143b0 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
143c0 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73   !MEMDB );.  ass
143d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
143e0 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te>=PAGER_RESERV
143f0 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ED );.  assert( 
14400 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14410 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65  pen==0 );.  asse
14420 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  rt( pPager->useJ
14430 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69  ournal );.  sqli
14440 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
14450 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50  nt(pPager);.  pP
14460 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
14470 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
14480 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f   pPager->dbSize/
14490 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70  8 + 1 );.  if( p
144a0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
144b0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  l==0 ){.    rc =
144c0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
144d0 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74     goto failed_t
144e0 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a  o_open_journal;.
144f0 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
14500 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76  e3OsOpenExclusiv
14510 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
14520 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
14530 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  ,pPager->tempFil
14540 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  e);.  pPager->jo
14550 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
14560 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
14570 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  r = 0;.  pPager-
14580 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b  >journalHdr = 0;
14590 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
145a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f  E_OK ){.    goto
145b0 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f   failed_to_open_
145c0 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73  journal;.  }.  s
145d0 71 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65  qlite3OsOpenDire
145e0 63 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44  ctory(pPager->zD
145f0 69 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65  irectory, &pPage
14600 72 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65  r->jfd);.  pPage
14610 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
14620 20 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   1;.  pPager->jo
14630 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30  urnalStarted = 0
14640 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
14650 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
14660 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
14670 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ck = 0;.  pPager
14680 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66  ->nRec = 0;.  if
14690 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
146a0 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  k!=0 ){.    rc =
146b0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
146c0 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75  Pager);.    retu
146d0 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
146e0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
146f0 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
14700 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a  ;..  rc = writeJ
14710 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
14720 29 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  );..  if( pPager
14730 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26  ->stmtAutoopen &
14740 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc==SQLITE_OK 
14750 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
14760 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65  te3pager_stmt_be
14770 67 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  gin(pPager);.  }
14780 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
14790 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
147a0 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
147b0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
147c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
147d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
147e0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
147f0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
14800 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f  rc;..failed_to_o
14810 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73  pen_journal:.  s
14820 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
14830 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
14840 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
14850 6e 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  nal = 0;.  sqlit
14860 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
14870 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
14880 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
14890 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
148a0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
148b0 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
148c0 61 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20  a write-lock on 
148d0 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
148e0 68 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76  he lock is remov
148f0 65 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61  ed when.** the a
14900 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ny of the follow
14910 69 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a  ing happen:.**.*
14920 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
14930 67 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20  ger_commit() is 
14940 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
14950 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
14960 6c 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65  lback() is calle
14970 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
14980 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20  e3pager_close() 
14990 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20  is called..**   
149a0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
149b0 75 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65  unref() is calle
149c0 64 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75  d to on every ou
149d0 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a  tstanding page..
149e0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
149f0 70 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69  parameter to thi
14a00 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70  s routine is a p
14a10 6f 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70  ointer to any op
14a20 65 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a  en page of the.*
14a30 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
14a40 20 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65    Nothing change
14a50 73 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65  s about the page
14a60 20 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65   - it is used me
14a70 72 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69  rely to.** acqui
14a80 72 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  re a pointer to 
14a90 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
14aa0 75 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66  ure and as proof
14ab0 20 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a   that there is.*
14ac0 2a 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64  * already a read
14ad0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
14ae0 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  abase..**.** The
14af0 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65   second paramete
14b00 72 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20  r indicates how 
14b10 6d 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79  much space in by
14b20 74 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66  tes to reserve f
14b30 6f 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a  or a.** master j
14b40 6f 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65  ournal file-name
14b50 20 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66   at the start of
14b60 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65   the journal whe
14b70 6e 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e  n it is created.
14b80 0a 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c  .**.** A journal
14b90 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
14ba0 69 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61  if this is not a
14bb0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
14bc0 20 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a    For temporary.
14bd0 2a 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70  ** files, the op
14be0 65 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75  ening of the jou
14bf0 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66  rnal file is def
14c00 65 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72  erred until ther
14c10 65 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61  e is an.** actua
14c20 6c 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20  l need to write 
14c30 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  to the journal..
14c40 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74  **.** If the dat
14c50 61 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79  abase is already
14c60 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72   reserved for wr
14c70 69 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74  iting, this rout
14c80 69 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a  ine is a no-op..
14c90 2a 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20  **.** If exFlag 
14ca0 69 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61  is true, go ahea
14cb0 64 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43  d and get an EXC
14cc0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
14cd0 68 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64  he file.** immed
14ce0 69 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f  iately instead o
14cf0 66 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20  f waiting until 
14d00 77 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20  we try to flush 
14d10 74 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a  the cache.  The.
14d20 2a 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e  ** exFlag is ign
14d30 6f 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61  ored if a transa
14d40 63 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79  ction is already
14d50 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20   active..*/.int 
14d60 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67  sqlite3pager_beg
14d70 69 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20  in(void *pData, 
14d80 69 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50  int exFlag){.  P
14d90 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
14da0 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
14db0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
14dc0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
14dd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
14de0 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28  TE_OK;.  assert(
14df0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
14e00 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14e10 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
14e20 4e 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  NLOCK );.  if( p
14e30 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
14e40 47 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20  GER_SHARED ){.  
14e50 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
14e60 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
14e70 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
14e80 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
14e90 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
14ea0 45 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20  EXCLUSIVE;.     
14eb0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
14ec0 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62  ize = pPager->db
14ed0 53 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Size;.    }else{
14ee0 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
14ef0 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
14f00 4c 4f 43 4b 20 7c 7c 20 65 78 46 6c 61 67 20 29  LOCK || exFlag )
14f10 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  {.        rc = p
14f20 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
14f30 6b 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56  k(pPager, RESERV
14f40 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
14f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
14f60 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
14f70 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52  k(&pPager->fd, R
14f80 45 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20  ESERVED_LOCK);. 
14f90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
14fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14fb0 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  {.        pPager
14fc0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
14fd0 52 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20  RESERVED;.      
14fe0 20 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a    if( exFlag ){.
14ff0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70            rc = p
15000 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
15010 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53  k(pPager, EXCLUS
15020 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  IVE_LOCK);.     
15030 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
15040 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
15050 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
15060 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15070 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
15080 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
15090 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54  .      TRACE2("T
150a0 52 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22  RANSACTION %d\n"
150b0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
150c0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ));.      if( pP
150d0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
150e0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d   && !pPager->tem
150f0 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20  pFile ){.       
15100 20 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e   rc = pager_open
15110 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  _journal(pPager)
15120 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
15130 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
15140 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61  .}../*.** Mark a
15150 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72   data page as wr
15160 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61  iteable.  The pa
15170 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e  ge is written in
15180 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a  to the journal .
15190 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20  ** if it is not 
151a0 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20  there already.  
151b0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73  This routine mus
151c0 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f  t be called befo
151d0 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61  re making.** cha
151e0 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a  nges to a page..
151f0 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20  **.** The first 
15200 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e  time this routin
15210 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65  e is called, the
15220 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61   pager creates a
15230 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   new.** journal 
15240 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52  and acquires a R
15250 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
15260 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  the database.  I
15270 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a  f the RESERVED.*
15280 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74  * lock could not
15290 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68   be acquired, th
152a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
152b0 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20  ns SQLITE_BUSY. 
152c0 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20   The.** calling 
152d0 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65  routine must che
152e0 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75  ck for that retu
152f0 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20  rn value and be 
15300 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a  careful not to.*
15310 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67  * change any pag
15320 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69  e data until thi
15330 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
15340 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a  s SQLITE_OK..**.
15350 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61  ** If the journa
15360 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74  l file could not
15370 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61   be written beca
15380 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20  use the disk is 
15390 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68  full,.** then th
153a0 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
153b0 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61  ns SQLITE_FULL a
153c0 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64  nd does an immed
153d0 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a  iate rollback..*
153e0 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74  * All subsequent
153f0 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20   write attempts 
15400 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49  also return SQLI
15410 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68  TE_FULL until th
15420 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c  ere.** is a call
15430 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72   to sqlite3pager
15440 5f 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  _commit() or sql
15450 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
15460 63 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74  ck() to.** reset
15470 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
15480 70 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64  pager_write(void
15490 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
154a0 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  r *pPg = DATA_TO
154b0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
154c0 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
154d0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
154e0 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
154f0 4f 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20  OK;..  /* Check 
15500 66 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a  for errors.  */.
15510 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
15520 72 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65  rMask ){ .    re
15530 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f  turn pager_errco
15540 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  de(pPager);.  }.
15550 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65    if( pPager->re
15560 61 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65  adOnly ){.    re
15570 74 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d  turn SQLITE_PERM
15580 3b 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28  ;.  }..  assert(
15590 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73   !pPager->setMas
155a0 74 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72  ter );..  /* Mar
155b0 6b 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69  k the page as di
155c0 72 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67  rty.  If the pag
155d0 65 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  e has already be
155e0 65 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  en written.  ** 
155f0 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74  to the journal t
15600 68 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72  hen we can retur
15610 6e 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20  n right away..  
15620 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20  */.  pPg->dirty 
15630 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  = 1;.  if( pPg->
15640 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50  inJournal && (pP
15650 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61  g->inStmt || pPa
15660 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d  ger->stmtInUse==
15670 30 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  0) ){.    pPager
15680 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
15690 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20  ;.  }else{..    
156a0 2f 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69  /* If we get thi
156b0 73 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20  s far, it means 
156c0 74 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65  that the page ne
156d0 65 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a  eds to be.    **
156e0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
156f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
15700 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b  nal or the ckeck
15710 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20  point journal.  
15720 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20    ** or both..  
15730 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73    **.    ** Firs
15740 74 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74  t check to see t
15750 68 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  hat the transact
15760 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73  ion journal exis
15770 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72  ts and.    ** cr
15780 65 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f  eate it if it do
15790 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20  es not..    */. 
157a0 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
157b0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
157c0 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63  UNLOCK );.    rc
157d0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
157e0 62 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b  begin(pData, 0);
157f0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
15800 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15810 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
15820 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
15830 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
15840 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
15850 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
15860 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
15870 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
15880 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
15890 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
158a0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
158b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
158c0 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
158d0 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
158e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
158f0 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
15900 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
15910 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
15920 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
15930 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
15940 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
15950 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
15960 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
15970 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
15980 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
15990 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
159a0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
159b0 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
159c0 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
159d0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
159e0 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
159f0 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
15a00 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
15a10 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
15a20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
15a30 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
15a40 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
15a50 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
15a60 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
15a70 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
15a80 50 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20  Pg;.        u32 
15a90 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69  saved;.        i
15aa0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
15ab0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
15ac0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
15ad0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
15ae0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54  er);.          T
15af0 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25  RACE3("JOURNAL %
15b00 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
15b10 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
15b20 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
15b30 20 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69       assert( pHi
15b40 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a  st->pOrig==0 );.
15b50 20 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d            pHist-
15b60 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d  >pOrig = sqliteM
15b70 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
15b80 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
15b90 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
15ba0 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20  t->pOrig ){.    
15bb0 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70          memcpy(p
15bc0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48  Hist->pOrig, PGH
15bd0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
15be0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15bf0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  e);.          }.
15c00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
15c10 20 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73           u32 cks
15c20 75 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f  um;.          CO
15c30 44 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74  DEC(pPager, pDat
15c40 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29  a, pPg->pgno, 7)
15c50 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75  ;.          cksu
15c60 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  m = pager_cksum(
15c70 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e  pPager, pPg->pgn
15c80 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20  o, pData);.     
15c90 20 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75       saved = *(u
15ca0 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54  32*)PGHDR_TO_EXT
15cb0 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  RA(pPg, pPager);
15cc0 0a 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65  .          store
15cd0 33 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50  32bits(cksum, pP
15ce0 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  g, pPager->pageS
15cf0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
15d00 73 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70  szPg = pPager->p
15d10 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20  ageSize+8;.     
15d20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
15d30 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c  (pPg->pgno, pPg,
15d40 20 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20   -4);.          
15d50 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
15d60 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
15d70 2c 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61  , &((char*)pData
15d80 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20  )[-4], szPg);.  
15d90 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
15da0 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a  journalOff += sz
15db0 50 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  Pg;.          TR
15dc0 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE4("JOURNAL %d
15dd0 20 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e   page %d needSyn
15de0 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  c=%d\n",.       
15df0 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
15e00 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
15e10 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
15e20 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20  Sync);.         
15e30 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
15e40 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
15e50 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a   0);.          *
15e60 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45  (u32*)PGHDR_TO_E
15e70 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
15e80 29 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20  ) = saved;.     
15e90 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
15ea0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15eb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
15ec0 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
15ed0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
15ee0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
15ef0 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
15f00 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  LL;.            
15f10 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
15f20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
15f30 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b   pPager->nRec++;
15f40 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
15f50 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  t( pPager->aInJo
15f60 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20  urnal!=0 );.    
15f70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49        pPager->aI
15f80 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67  nJournal[pPg->pg
15f90 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
15fa0 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
15fb0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
15fc0 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
15fd0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20  Sync;.          
15fe0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
15ff0 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20  InUse ){.       
16000 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
16010 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  Stmt[pPg->pgno/8
16020 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
16030 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
16040 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
16050 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
16060 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16070 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
16080 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
16090 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
160a0 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
160b0 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
160c0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52  Sync;.        TR
160d0 41 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20  ACE4("APPEND %d 
160e0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
160f0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
16100 20 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28          PAGERID(
16110 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
16120 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
16130 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  c);.      }.    
16140 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53    if( pPg->needS
16150 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ync ){.        p
16160 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
16170 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
16180 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
16190 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a  l = 1;.    }.  .
161a0 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74      /* If the st
161b0 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
161c0 69 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20  is open and the 
161d0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69  page is not in i
161e0 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77  t,.    ** then w
161f0 72 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74  rite the current
16200 20 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61   page to the sta
16210 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
16220 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a   Note that.    *
16230 2a 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  * the statement 
16240 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64  journal format d
16250 69 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20  iffers from the 
16260 73 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c  standard journal
16270 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69   format.    ** i
16280 6e 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20  n that it omits 
16290 74 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e  the checksums an
162a0 64 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20  d the header..  
162b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
162c0 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
162d0 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26  & !pPg->inStmt &
162e0 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
162f0 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
16300 7a 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ze ){.      asse
16310 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e  rt( pPg->inJourn
16320 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e  al || (int)pPg->
16330 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69  pgno>pPager->ori
16340 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20  gDbSize );.     
16350 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
16360 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
16370 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
16380 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
16390 65 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  er);.        ass
163a0 65 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d  ert( pHist->pStm
163b0 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
163c0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73  pHist->pStmt = s
163d0 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
163e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
163f0 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
16400 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
16410 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
16420 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50  (pHist->pStmt, P
16430 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
16440 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
16450 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ize);.        }.
16460 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
16470 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20  STMT-JOURNAL %d 
16480 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
16490 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
164a0 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d  ->pgno);.      }
164b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74  else{.        st
164c0 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70  ore32bits(pPg->p
164d0 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20  gno, pPg, -4);. 
164e0 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
164f0 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
16500 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20  >pgno, 7);.     
16510 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16520 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
16530 73 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61  stfd,((char*)pDa
16540 74 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70  ta)-4, pPager->p
16550 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20  ageSize+4);.    
16560 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
16570 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
16580 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
16590 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
165a0 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44  no);.        COD
165b0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
165c0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
165d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
165e0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
165f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
16600 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
16610 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
16620 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
16630 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55   |= PAGER_ERR_FU
16640 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  LL;.          re
16650 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
16660 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
16670 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
16680 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16690 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
166a0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
166b0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
166c0 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
166d0 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
166e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67       }.      pag
166f0 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
16700 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  st(pPg);.    }. 
16710 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20   }..  /* Update 
16720 74 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a  the database siz
16730 65 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20  e and return..  
16740 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
16750 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67  >dbSize<(int)pPg
16760 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50  ->pgno ){.    pP
16770 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
16780 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66  Pg->pgno;.    if
16790 28 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67  ( !MEMDB && pPag
167a0 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44  er->dbSize==PEND
167b0 49 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d  ING_BYTE/pPager-
167c0 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20  >pageSize ){.   
167d0 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
167e0 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  e++;.    }.  }. 
167f0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16800 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
16810 20 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76   if the page giv
16820 65 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65  en in the argume
16830 6e 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  nt was previousl
16840 79 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73  y passed.** to s
16850 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
16860 65 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  e().  In other w
16870 6f 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55  ords, return TRU
16880 45 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a  E if it is ok.**
16890 20 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63   to change the c
168a0 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61  ontent of the pa
168b0 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ge..*/.int sqlit
168c0 65 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61  e3pager_iswritea
168d0 62 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ble(void *pData)
168e0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
168f0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
16900 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
16910 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23  pPg->dirty;.}..#
16920 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16930 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20  IT_VACUUM./*.** 
16940 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74  Replace the cont
16950 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ent of a single 
16960 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e  page with the in
16970 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65  formation in the
16980 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65   third.** argume
16990 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
169a0 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74  e3pager_overwrit
169b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
169c0 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64   Pgno pgno, void
169d0 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64   *pData){.  void
169e0 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72   *pPage;.  int r
169f0 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
16a00 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
16a10 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65  er, pgno, &pPage
16a20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
16a30 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
16a40 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
16a50 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
16a60 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
16a70 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  _OK ){.      mem
16a80 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61  cpy(pPage, pData
16a90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16aa0 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ze);.    }.    s
16ab0 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
16ac0 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20  f(pPage);.  }.  
16ad0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e  return rc;.}.#en
16ae0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  dif../*.** A cal
16af0 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  l to this routin
16b00 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65  e tells the page
16b10 72 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74  r that it is not
16b20 20 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a   necessary to.**
16b30 20 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72   write the infor
16b40 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22  mation on page "
16b50 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68  pgno" back to th
16b60 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
16b70 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
16b80 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
16b90 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
16ba0 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
16bb0 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
16bc0 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
16bd0 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
16be0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
16bf0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
16c00 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
16c10 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
16c20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
16c30 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
16c40 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
16c50 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
16c60 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
16c70 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
16c80 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
16c90 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
16ca0 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
16cb0 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e  below, more than
16cc0 20 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65   double the spee
16cd0 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e  d.** of large IN
16ce0 53 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20  SERT operations 
16cf0 61 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68  and quadruple th
16d00 65 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65  e speed of large
16d10 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20   DELETEs..**.** 
16d20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  When this routin
16d30 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74  e is called, set
16d40 20 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62   the alwaysRollb
16d50 61 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65  ack flag to true
16d60 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20  ..** Subsequent 
16d70 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
16d80 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
16d90 61 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61  ack() for the sa
16da0 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20  me page.** will 
16db0 74 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67  thereafter be ig
16dc0 6e 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20  nored.  This is 
16dd0 6e 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f  necessary to avo
16de0 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20  id a problem.** 
16df0 77 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74  where a page wit
16e00 68 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20  h data is added 
16e10 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  to the freelist 
16e20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20  during one part 
16e30 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74  of.** a transact
16e40 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64  ion then removed
16e50 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
16e60 73 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65  st during a late
16e70 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65  r part.** of the
16e80 20 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f   same transactio
16e90 6e 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72  n and reused for
16ea0 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70   some other purp
16eb0 6f 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a  ose.  When it.**
16ec0 20 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20   is first added 
16ed0 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c  to the freelist,
16ee0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
16ef0 20 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72   called.  When r
16f00 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f  eused,.** the do
16f10 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f  nt_rollback() ro
16f20 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
16f30 20 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68    But because th
16f40 65 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a  e page contains.
16f50 2a 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61  ** critical data
16f60 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20  , we still need 
16f70 74 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65  to be sure it ge
16f80 74 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69  ts rolled back i
16f90 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68  n spite.** of th
16fa0 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28  e dont_rollback(
16fb0 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20  ) call..*/.void 
16fc0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
16fd0 74 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70  t_write(Pager *p
16fe0 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
16ff0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
17000 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
17010 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d  return;..  pPg =
17020 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
17030 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70  ager, pgno);.  p
17040 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
17050 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ck = 1;.  if( pP
17060 67 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20  g && pPg->dirty 
17070 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65  ){.    if( pPage
17080 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29  r->dbSize==(int)
17090 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61  pPg->pgno && pPa
170a0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c  ger->origDbSize<
170b0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
170c0 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68  {.      /* If th
170d0 69 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20  is pages is the 
170e0 6c 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65  last page in the
170f0 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69   file and the fi
17100 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20  le has grown.   
17110 20 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65     ** during the
17120 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
17130 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f  tion, then do NO
17140 54 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20  T mark the page 
17150 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20  as clean..      
17160 2a 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61  ** When the data
17170 62 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c  base file grows,
17180 20 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75   we must make su
17190 72 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74  re that the last
171a0 20 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67   page.      ** g
171b0 65 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c  ets written at l
171c0 65 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61  east once so tha
171d0 74 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20  t the disk file 
171e0 77 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72  will be the corr
171f0 65 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a  ect.      ** siz
17200 65 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74  e. If you do not
17210 20 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65   write this page
17220 20 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66   and the size of
17230 20 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20   the file.      
17240 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65  ** on the disk e
17250 6e 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f  nds up being too
17260 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e   small, that can
17270 20 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73   lead to databas
17280 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75  e.      ** corru
17290 70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65  ption during the
172a0 20 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f   next transactio
172b0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
172c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41  }else{.      TRA
172d0 43 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20  CE3("DONT_WRITE 
172e0 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22  page %d of %d\n"
172f0 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  , pgno, PAGERID(
17300 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
17310 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
17320 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
17330 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69  ** A call to thi
17340 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20  s routine tells 
17350 74 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69  the pager that i
17360 66 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63  f a rollback occ
17370 75 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f  urs,.** it is no
17380 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72  t necessary to r
17390 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20  estore the data 
173a0 6f 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  on the given pag
173b0 65 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e  e.  This.** mean
173c0 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72  s that the pager
173d0 20 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74   does not have t
173e0 6f 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76  o record the giv
173f0 65 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a  en page in the.*
17400 2a 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  * rollback journ
17410 61 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  al..*/.void sqli
17420 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
17430 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61  llback(void *pDa
17440 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
17450 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
17460 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
17470 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
17480 3e 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20  >pPager;..  if( 
17490 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
174a0 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c  AGER_EXCLUSIVE |
174b0 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  | pPager->journa
174c0 6c 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72  lOpen==0 ) retur
174d0 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c  n;.  if( pPg->al
174e0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20  waysRollback || 
174f0 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f  pPager->alwaysRo
17500 6c 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20  llback || MEMDB 
17510 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
17520 21 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  !pPg->inJournal 
17530 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
17540 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
17550 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61  gDbSize ){.    a
17560 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
17570 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a  InJournal!=0 );.
17580 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a      pPager->aInJ
17590 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f  ournal[pPg->pgno
175a0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
175b0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67  pgno&7);.    pPg
175c0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
175d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
175e0 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
175f0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
17600 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
17610 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
17620 6f 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65  o&7);.      page
17630 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
17640 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
17650 20 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52    TRACE3("DONT_R
17660 4f 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20  OLLBACK page %d 
17670 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70  of %d\n", pPg->p
17680 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
17690 67 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ger));.  }.  if(
176a0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55   pPager->stmtInU
176b0 73 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74  se && !pPg->inSt
176c0 6d 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e  mt && (int)pPg->
176d0 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74  pgno<=pPager->st
176e0 6d 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  mtSize ){.    as
176f0 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75  sert( pPg->inJou
17700 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67  rnal || (int)pPg
17710 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f  ->pgno>pPager->o
17720 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20  rigDbSize );.   
17730 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
17740 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
17750 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
17760 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
17770 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
17780 26 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64  &7);.    page_ad
17790 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
177a0 50 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  Pg);.  }.}.../*.
177b0 2a 2a 20 43 6c 65 61 72 20 61 20 50 67 48 69 73  ** Clear a PgHis
177c0 74 6f 72 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74  tory block.*/.st
177d0 61 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 48  atic void clearH
177e0 69 73 74 6f 72 79 28 50 67 48 69 73 74 6f 72 79  istory(PgHistory
177f0 20 2a 70 48 69 73 74 29 7b 0a 20 20 73 71 6c 69   *pHist){.  sqli
17800 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 4f  teFree(pHist->pO
17810 72 69 67 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  rig);.  sqliteFr
17820 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
17830 3b 0a 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67  ;.  pHist->pOrig
17840 20 3d 20 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70   = 0;.  pHist->p
17850 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a  Stmt = 0;.}../*.
17860 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68  ** Commit all ch
17870 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  anges to the dat
17880 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61 73  abase and releas
17890 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63 6b  e the write lock
178a0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
178b0 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72 20  ommit fails for 
178c0 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f  any reason, a ro
178d0 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20 69  llback attempt i
178e0 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e  s made.** and an
178f0 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
17900 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68 65  eturned.  If the
17910 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20   commit worked, 
17920 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20  SQLITE_OK.** is 
17930 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
17940 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
17950 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
17960 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
17970 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
17980 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
17990 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46  ask==PAGER_ERR_F
179a0 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ULL ){.    rc = 
179b0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
179c0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
179d0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
179e0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
179f0 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a   = SQLITE_FULL;.
17a00 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
17a10 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
17a20 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
17a30 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  0 ){.    rc = pa
17a40 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
17a50 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  er);.    return 
17a60 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  rc;.  }.  if( pP
17a70 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45  ager->state<PAGE
17a80 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20  R_RESERVED ){.  
17a90 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
17aa0 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41  ERROR;.  }.  TRA
17ab0 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
17ac0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
17ad0 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
17ae0 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
17af0 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
17b00 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
17b10 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
17b20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69  ){.      clearHi
17b30 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f 48  story(PGHDR_TO_H
17b40 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
17b50 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
17b60 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
17b70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
17b80 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
17b90 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
17ba0 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
17bb0 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
17bc0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d  = 0;.      pPg =
17bd0 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20   pPg->pDirty;.  
17be0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
17bf0 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  UG.    for(pPg=p
17c00 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
17c10 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
17c20 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69  All){.      PgHi
17c30 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50  story *pHist = P
17c40 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
17c50 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
17c60 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61   assert( !pPg->a
17c70 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
17c80 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17c90 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a  pHist->pOrig );.
17ca0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
17cb0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20  Hist->pStmt );. 
17cc0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
17cd0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
17ce0 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  0;.    pPager->s
17cf0 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41  tate = PAGER_SHA
17d00 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  RED;.    return 
17d10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
17d20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69 72   if( pPager->dir
17d30 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20  tyCache==0 ){.  
17d40 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79 20    /* Exit early 
17d50 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20 74  (without doing t
17d60 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e  he time-consumin
17d70 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28  g sqlite3OsSync(
17d80 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20  ) calls).    ** 
17d90 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62 65  if there have be
17da0 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f  en no changes to
17db0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
17dc0 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  le. */.    asser
17dd0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
17de0 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63  ync==0 );.    rc
17df0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
17e00 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
17e10 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
17e20 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75 72   = -1;.    retur
17e30 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65  n rc;.  }.  asse
17e40 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
17e50 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
17e60 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  = sqlite3pager_s
17e70 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20 30  ync(pPager, 0, 0
17e80 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
17e90 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
17ea0 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b  to commit_abort;
17eb0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67 65  .  }.  rc = page
17ec0 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
17ed0 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
17ee0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
17ef0 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a  return rc;..  /*
17f00 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61 6e   Jump here if an
17f10 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ything goes wron
17f20 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f 6d  g during the com
17f30 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a  mit process..  *
17f40 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a  /.commit_abort:.
17f50 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
17f60 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
17f70 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17f80 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20  ./*.** Rollback 
17f90 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54 68  all changes.  Th
17fa0 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c 73  e database falls
17fb0 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f 53   back to PAGER_S
17fc0 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41  HARED mode..** A
17fd0 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  ll in-memory cac
17fe0 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74 20  he pages revert 
17ff0 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e 61  to their origina
18000 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e  l data contents.
18010 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
18020 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
18030 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
18040 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73  annot fail unles
18050 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f  s some other pro
18060 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c  cess is not foll
18070 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72  owing.** the cor
18080 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f  rect locking pro
18090 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52  tocol (SQLITE_PR
180a0 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73  OTOCOL) or unles
180b0 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  s some other.** 
180c0 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74 69  process is writi
180d0 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74 68  ng trash into th
180e0 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28  e journal file (
180f0 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29 20  SQLITE_CORRUPT) 
18100 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70  or.** unless a p
18110 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61  rior malloc() fa
18120 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d  iled (SQLITE_NOM
18130 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61 74  EM).  Appropriat
18140 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73  e error.** codes
18150 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66 6f   are returned fo
18160 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63 61  r all these occa
18170 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69 73  sions.  Otherwis
18180 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20  e,.** SQLITE_OK 
18190 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
181a0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
181b0 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20  _rollback(Pager 
181c0 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20  *pPager){.  int 
181d0 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52 4f  rc;.  TRACE2("RO
181e0 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
181f0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
18200 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
18210 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20 20     PgHdr *p;.   
18220 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70   for(p=pPager->p
18230 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  All; p; p=p->pNe
18240 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67  xtAll){.      Pg
18250 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a  History *pHist;.
18260 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
18270 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
18280 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70   );.      if( !p
18290 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
182a0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
182b0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
182c0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
182d0 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  r))->pOrig );.  
182e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 28        assert( !(
182f0 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48  (PgHistory *)PGH
18300 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50  DR_TO_HIST(p, pP
18310 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b  ager))->pStmt );
18320 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
18330 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  e;.      }..    
18340 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f    pHist = PGHDR_
18350 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
18360 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 48  r);.      if( pH
18370 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
18380 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
18390 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
183a0 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61  Hist->pOrig, pPa
183b0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
183c0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
183d0 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64  ROLLBACK-PAGE %d
183e0 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   of %d\n", p->pg
183f0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
18400 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  er));.      }els
18410 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45  e{.        TRACE
18420 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63 6c  3("PAGE %d is cl
18430 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d  ean on %d\n", p-
18440 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
18450 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d  Pager));.      }
18460 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74  .      clearHist
18470 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20 20  ory(pHist);.    
18480 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a    p->dirty = 0;.
18490 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e        p->inJourn
184a0 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d  al = 0;.      p-
184b0 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  >inStmt = 0;.   
184c0 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74 20     p->pPrevStmt 
184d0 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  = p->pNextStmt =
184e0 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70   0;..      if( p
184f0 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72  Pager->xReiniter
18500 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
18510 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47  er->xReiniter(PG
18520 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
18530 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
18540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18550 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67   .    }.    pPag
18560 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
18570 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18580 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  e = pPager->orig
18590 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f  DbSize;.    memo
185a0 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  ryTruncate(pPage
185b0 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  r);.    pPager->
185c0 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
185d0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
185e0 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
185f0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18600 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66  TE_OK;.  }..  if
18610 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74 79  ( !pPager->dirty
18620 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65 72  Cache || !pPager
18630 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
18640 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
18650 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
18660 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
18670 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
18680 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
18690 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
186a0 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70 50  errMask!=0 && pP
186b0 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50  ager->errMask!=P
186c0 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
186d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
186e0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58  >state>=PAGER_EX
186f0 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20  CLUSIVE ){.     
18700 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
18710 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20  pPager);.    }. 
18720 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
18730 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
18740 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
18750 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
18760 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
18770 69 6e 74 20 72 63 32 2c 20 72 63 33 3b 0a 20 20  int rc2, rc3;.  
18780 20 20 72 63 20 3d 20 70 61 67 65 72 5f 72 65 6c    rc = pager_rel
18790 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72  oad_cache(pPager
187a0 29 3b 0a 20 20 20 20 72 63 32 20 3d 20 70 61 67  );.    rc2 = pag
187b0 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
187c0 65 72 2c 20 70 50 61 67 65 72 2d 3e 6f 72 69 67  er, pPager->orig
187d0 44 62 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 33  DbSize);.    rc3
187e0 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65   = pager_unwrite
187f0 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  lock(pPager);.  
18800 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
18810 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
18820 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 69 66 28  = rc2;.      if(
18830 20 72 63 33 20 29 20 72 63 20 3d 20 72 63 33 3b   rc3 ) rc = rc3;
18840 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a  .    }.  }else{.
18850 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
18860 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b  layback(pPager);
18870 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
18880 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18890 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
188a0 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f  UPT;  /* bkpt-CO
188b0 52 52 55 50 54 20 2a 2f 0a 20 20 20 20 70 50 61  RRUPT */.    pPa
188c0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
188d0 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
188e0 54 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  T;.  }.  pPager-
188f0 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20  >dbSize = -1;.  
18900 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
18910 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
18920 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
18930 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 72  file is opened r
18940 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ead-only.  Retur
18950 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68  n FALSE.** if th
18960 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28 69  e database is (i
18970 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61 62  n theory) writab
18980 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  le..*/.int sqlit
18990 65 33 70 61 67 65 72 5f 69 73 72 65 61 64 6f 6e  e3pager_isreadon
189a0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
189b0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
189c0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
189d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
189e0 69 6e 65 20 69 73 20 75 73 65 64 20 66 6f 72 20  ine is used for 
189f0 74 65 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c  testing and anal
18a00 79 73 69 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e  ysis only..*/.in
18a10 74 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f  t *sqlite3pager_
18a20 73 74 61 74 73 28 50 61 67 65 72 20 2a 70 50 61  stats(Pager *pPa
18a30 67 65 72 29 7b 0a 20 20 73 74 61 74 69 63 20 69  ger){.  static i
18a40 6e 74 20 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d  nt a[11];.  a[0]
18a50 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b   = pPager->nRef;
18a60 0a 20 20 61 5b 31 5d 20 3d 20 70 50 61 67 65 72  .  a[1] = pPager
18a70 2d 3e 6e 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20  ->nPage;.  a[2] 
18a80 3d 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65  = pPager->mxPage
18a90 3b 0a 20 20 61 5b 33 5d 20 3d 20 70 50 61 67 65  ;.  a[3] = pPage
18aa0 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34  r->dbSize;.  a[4
18ab0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ] = pPager->stat
18ac0 65 3b 0a 20 20 61 5b 35 5d 20 3d 20 70 50 61 67  e;.  a[5] = pPag
18ad0 65 72 2d 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61  er->errMask;.  a
18ae0 5b 36 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48  [6] = pPager->nH
18af0 69 74 3b 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61  it;.  a[7] = pPa
18b00 67 65 72 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b  ger->nMiss;.  a[
18b10 38 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76  8] = pPager->nOv
18b20 66 6c 3b 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61  fl;.  a[9] = pPa
18b30 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
18b40 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
18b50 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
18b60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
18b70 68 65 20 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c  he statement rol
18b80 6c 62 61 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a  lback point..**.
18b90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18ba0 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
18bb0 20 77 69 74 68 20 74 68 65 20 74 72 61 6e 73 61   with the transa
18bc0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c  ction journal al
18bd0 72 65 61 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20  ready.** open.  
18be0 41 20 6e 65 77 20 73 74 61 74 65 6d 65 6e 74 20  A new statement 
18bf0 6a 6f 75 72 6e 61 6c 20 69 73 20 63 72 65 61 74  journal is creat
18c00 65 64 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ed that can be u
18c10 73 65 64 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a  sed to rollback.
18c20 2a 2a 20 63 68 61 6e 67 65 73 20 6f 66 20 61 20  ** changes of a 
18c30 73 69 6e 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61  single SQL comma
18c40 6e 64 20 77 69 74 68 69 6e 20 61 20 6c 61 72 67  nd within a larg
18c50 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
18c60 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
18c70 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50  ger_stmt_begin(P
18c80 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18c90 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61 72 20   int rc;.  char 
18ca0 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
18cb0 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61  PNAME_SIZE];.  a
18cc0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
18cd0 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
18ce0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64  ssert( pPager->d
18cf0 62 53 69 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52  bSize>=0 );.  TR
18d00 41 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e  ACE2("STMT-BEGIN
18d10 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18d20 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
18d30 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61  MEMDB ){.    pPa
18d40 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
18d50 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
18d60 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65  stmtSize = pPage
18d70 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72  r->dbSize;.    r
18d80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18d90 0a 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67  .  }.  if( !pPag
18da0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
18db0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
18dc0 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b  tmtAutoopen = 1;
18dd0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
18de0 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73  TE_OK;.  }.  ass
18df0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
18e00 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50  rnalOpen );.  pP
18e10 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
18e20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
18e30 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
18e40 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67   1 );.  if( pPag
18e50 65 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29  er->aInStmt==0 )
18e60 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 4c  {.    sqlite3OsL
18e70 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
18e80 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
18e90 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18ea0 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e  _NOMEM;.  }.#ifn
18eb0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 72 63 20  def NDEBUG.  rc 
18ec0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
18ed0 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
18ee0 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  , &pPager->stmtJ
18ef0 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
18f00 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
18f10 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61 73 73 65  n_failed;.  asse
18f20 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  rt( pPager->stmt
18f30 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d  JSize == pPager-
18f40 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23  >journalOff );.#
18f50 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e  endif.  pPager->
18f60 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70 50 61 67  stmtJSize = pPag
18f70 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
18f80 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
18f90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
18fa0 69 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  ize;.  pPager->s
18fb0 74 6d 74 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20  tmtHdrOff = 0;. 
18fc0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73   pPager->stmtCks
18fd0 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
18fe0 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28 20 21 70  umInit;.  if( !p
18ff0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
19000 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
19010 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d  te3pager_opentem
19020 70 28 7a 54 65 6d 70 2c 20 26 70 50 61 67 65 72  p(zTemp, &pPager
19030 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20 69 66 28  ->stfd);.    if(
19040 20 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f   rc ) goto stmt_
19050 62 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20  begin_failed;.  
19060 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70    pPager->stmtOp
19070 65 6e 20 3d 20 31 3b 0a 20 20 20 20 70 50 61 67  en = 1;.    pPag
19080 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30  er->stmtNRec = 0
19090 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
190a0 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20  stmtInUse = 1;. 
190b0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
190c0 4b 3b 0a 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f  K;. .stmt_begin_
190d0 66 61 69 6c 65 64 3a 0a 20 20 69 66 28 20 70 50  failed:.  if( pP
190e0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b  ager->aInStmt ){
190f0 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
19100 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29  pPager->aInStmt)
19110 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49  ;.    pPager->aI
19120 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20  nStmt = 0;.  }. 
19130 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
19140 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74  *.** Commit a st
19150 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
19160 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
19170 74 5f 63 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a  t_commit(Pager *
19180 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28 20 70  pPager){.  if( p
19190 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
191a0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
191b0 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20  Pg, *pNext;.    
191c0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d  TRACE2("STMT-COM
191d0 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  MIT %d\n", PAGER
191e0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
191f0 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20   if( !MEMDB ){. 
19200 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
19210 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  ek(&pPager->stfd
19220 2c 20 30 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73  , 0);.      /* s
19230 71 6c 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65  qlite3OsTruncate
19240 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20  (&pPager->stfd, 
19250 30 29 3b 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  0); */.      sql
19260 69 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d  iteFree( pPager-
19270 3e 61 49 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  >aInStmt );.    
19280 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
19290 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  t = 0;.    }.   
192a0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
192b0 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20 70 50 67  >pStmt; pPg; pPg
192c0 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 20 20 70  =pNext){.      p
192d0 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
192e0 74 53 74 6d 74 3b 0a 20 20 20 20 20 20 61 73 73  tStmt;.      ass
192f0 65 72 74 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74  ert( pPg->inStmt
19300 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   );.      pPg->i
19310 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
19320 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
19330 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
19340 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
19350 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
19360 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19370 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
19380 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
19390 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
193a0 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
193b0 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
193c0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
193d0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50    }.    }.    pP
193e0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d  ager->stmtNRec =
193f0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19400 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20  stmtInUse = 0;. 
19410 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74     pPager->pStmt
19420 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67   = 0;.  }.  pPag
19430 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e  er->stmtAutoopen
19440 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 53   = 0;.  return S
19450 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
19460 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74  ** Rollback a st
19470 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  atement..*/.int 
19480 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
19490 74 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  t_rollback(Pager
194a0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
194b0 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
194c0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
194d0 20 20 20 20 54 52 41 43 45 32 28 22 53 54 4d 54      TRACE2("STMT
194e0 2d 52 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c  -ROLLBACK %d\n",
194f0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
19500 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
19510 20 29 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20   ){.      PgHdr 
19520 2a 70 50 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  *pPg;.      for(
19530 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d  pPg=pPager->pStm
19540 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  t; pPg; pPg=pPg-
19550 3e 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20  >pNextStmt){.   
19560 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
19570 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
19580 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
19590 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
195a0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a  pHist->pStmt ){.
195b0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
195c0 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
195d0 50 67 29 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d  Pg), pHist->pStm
195e0 74 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  t, pPager->pageS
195f0 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
19600 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
19610 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
19620 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
19630 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
19640 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50        }.      pP
19650 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70  ager->dbSize = p
19660 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b  Pager->stmtSize;
19670 0a 20 20 20 20 20 20 6d 65 6d 6f 72 79 54 72 75  .      memoryTru
19680 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20  ncate(pPager);. 
19690 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
196a0 5f 4f 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  _OK;.    }else{.
196b0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
196c0 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70  _stmt_playback(p
196d0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
196e0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73    sqlite3pager_s
196f0 74 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65  tmt_commit(pPage
19700 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  r);.  }else{.   
19710 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19720 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73  .  }.  pPager->s
19730 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b  tmtAutoopen = 0;
19740 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
19750 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
19760 65 20 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20  e full pathname 
19770 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
19780 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63  file..*/.const c
19790 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65  har *sqlite3page
197a0 72 5f 66 69 6c 65 6e 61 6d 65 28 50 61 67 65 72  r_filename(Pager
197b0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
197c0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c  urn pPager->zFil
197d0 65 6e 61 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ename;.}../*.** 
197e0 52 65 74 75 72 6e 20 74 68 65 20 64 69 72 65 63  Return the direc
197f0 74 6f 72 79 20 6f 66 20 74 68 65 20 64 61 74 61  tory of the data
19800 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  base file..*/.co
19810 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
19820 33 70 61 67 65 72 5f 64 69 72 6e 61 6d 65 28 50  3pager_dirname(P
19830 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19840 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19850 7a 44 69 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f  zDirectory;.}../
19860 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
19870 66 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66  full pathname of
19880 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
19890 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
198a0 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6a   *sqlite3pager_j
198b0 6f 75 72 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72  ournalname(Pager
198c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
198d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  urn pPager->zJou
198e0 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  rnal;.}../*.** S
198f0 65 74 20 74 68 65 20 63 6f 64 65 63 20 66 6f 72  et the codec for
19900 20 74 68 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76   this pager.*/.v
19910 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
19920 5f 73 65 74 5f 63 6f 64 65 63 28 0a 20 20 50 61  _set_codec(.  Pa
19930 67 65 72 20 2a 70 50 61 67 65 72 2c 0a 20 20 76  ger *pPager,.  v
19940 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f  oid (*xCodec)(vo
19950 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
19960 6e 74 29 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f  nt),.  void *pCo
19970 64 65 63 41 72 67 0a 29 7b 0a 20 20 70 50 61 67  decArg.){.  pPag
19980 65 72 2d 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f  er->xCodec = xCo
19990 64 65 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  dec;.  pPager->p
199a0 43 6f 64 65 63 41 72 67 20 3d 20 70 43 6f 64 65  CodecArg = pCode
199b0 63 41 72 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  cArg;.}../*.** T
199c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
199d0 61 6c 6c 65 64 20 74 6f 20 69 6e 63 72 65 6d 65  alled to increme
199e0 6e 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nt the database 
199f0 66 69 6c 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e  file change-coun
19a00 74 65 72 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61  ter,.** stored a
19a10 74 20 62 79 74 65 20 32 34 20 6f 66 20 74 68 65  t byte 24 of the
19a20 20 70 61 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a   pager file..*/.
19a30 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
19a40 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e  _incr_changecoun
19a50 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
19a60 72 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  r){.  void *pPag
19a70 65 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 48  e;.  PgHdr *pPgH
19a80 64 72 3b 0a 20 20 75 33 32 20 63 68 61 6e 67 65  dr;.  u32 change
19a90 5f 63 6f 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20  _counter;.  int 
19aa0 72 63 3b 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70  rc;..  /* Open p
19ab0 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
19ac0 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
19ad0 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  /.  rc = sqlite3
19ae0 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
19af0 2c 20 31 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , 1, &pPage);.  
19b00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
19b10 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
19b20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
19b30 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
19b40 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19b50 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
19b60 3b 0a 0a 20 20 2f 2a 20 52 65 61 64 20 74 68 65  ;..  /* Read the
19b70 20 63 75 72 72 65 6e 74 20 76 61 6c 75 65 20 61   current value a
19b80 74 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20  t byte 24. */.  
19b90 70 50 67 48 64 72 20 3d 20 44 41 54 41 5f 54 4f  pPgHdr = DATA_TO
19ba0 5f 50 47 48 44 52 28 70 50 61 67 65 29 3b 0a 20  _PGHDR(pPage);. 
19bb0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20   change_counter 
19bc0 3d 20 72 65 74 72 69 65 76 65 33 32 62 69 74 73  = retrieve32bits
19bd0 28 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20  (pPgHdr, 24);.. 
19be0 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68   /* Increment th
19bf0 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65 61  e value just rea
19c00 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20 62  d and write it b
19c10 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e 20  ack to byte 24. 
19c20 2a 2f 0a 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e  */.  change_coun
19c30 74 65 72 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32  ter++;.  store32
19c40 62 69 74 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e  bits(change_coun
19c50 74 65 72 2c 20 70 50 67 48 64 72 2c 20 32 34 29  ter, pPgHdr, 24)
19c60 3b 0a 0a 20 20 2f 2a 20 52 65 6c 65 61 73 65 20  ;..  /* Release 
19c70 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 6e  the page referen
19c80 63 65 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ce. */.  sqlite3
19c90 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
19ca0 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  e);.  return SQL
19cb0 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
19cc0 20 53 79 6e 63 20 74 68 65 20 64 61 74 61 62 61   Sync the databa
19cd0 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68 65 20  se file for the 
19ce0 70 61 67 65 72 20 70 50 61 67 65 72 2e 20 7a 4d  pager pPager. zM
19cf0 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74 6f 20  aster points to 
19d00 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61  the name.** of a
19d10 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19d20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75 6c 64  file that should
19d30 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f   be written into
19d40 20 74 68 65 20 69 6e 64 69 76 69 64 75 61 6c 0a   the individual.
19d50 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  ** journal file.
19d60 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62 65 20   zMaster may be 
19d70 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73 20 69  NULL, which is i
19d80 6e 74 65 72 70 72 65 74 65 64 20 61 73 20 6e 6f  nterpreted as no
19d90 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e   master.** journ
19da0 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64 61 74  al (a single dat
19db0 61 62 61 73 65 20 74 72 61 6e 73 61 63 74 69 6f  abase transactio
19dc0 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  n)..**.** This r
19dd0 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73 20 74  outine ensures t
19de0 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hat the journal 
19df0 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64  is synced, all d
19e00 69 72 74 79 20 70 61 67 65 73 20 77 72 69 74 74  irty pages writt
19e10 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64 61 74  en.** to the dat
19e20 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
19e30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19e40 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c   synced. The onl
19e50 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20  y thing that.** 
19e60 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69  remains to commi
19e70 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  t the transactio
19e80 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65 20 74  n is to delete t
19e90 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
19ea0 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  (or.** master jo
19eb0 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 73 70  urnal file if sp
19ec0 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20  ecified)..**.** 
19ed0 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a 4d 61  Note that if zMa
19ee0 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73  ster==NULL, this
19ef0 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72 77 72   does not overwr
19f00 69 74 65 20 61 20 70 72 65 76 69 6f 75 73 20 76  ite a previous v
19f10 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64 20 74  alue.** passed t
19f20 6f 20 61 6e 20 73 71 6c 69 74 65 33 70 61 67 65  o an sqlite3page
19f30 72 5f 73 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a  r_sync() call..*
19f40 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74 65  *.** If paramete
19f50 72 20 6e 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d  r nTrunc is non-
19f60 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 70  zero, then the p
19f70 61 67 65 72 20 66 69 6c 65 20 69 73 20 74 72 75  ager file is tru
19f80 6e 63 61 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72  ncated to.** nTr
19f90 75 6e 63 20 70 61 67 65 73 20 28 74 68 69 73 20  unc pages (this 
19fa0 69 73 20 75 73 65 64 20 62 79 20 61 75 74 6f 2d  is used by auto-
19fb0 76 61 63 75 75 6d 20 64 61 74 61 62 61 73 65 73  vacuum databases
19fc0 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  )..*/.int sqlite
19fd0 33 70 61 67 65 72 5f 73 79 6e 63 28 50 61 67 65  3pager_sync(Page
19fe0 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73 74  r *pPager, const
19ff0 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20   char *zMaster, 
1a000 50 67 6e 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20  Pgno nTrunc){.  
1a010 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
1a020 4f 4b 3b 0a 0a 20 20 54 52 41 43 45 34 28 22 44  OK;..  TRACE4("D
1a030 41 54 41 42 41 53 45 20 53 59 4e 43 3a 20 46 69  ATABASE SYNC: Fi
1a040 6c 65 3d 25 73 20 7a 4d 61 73 74 65 72 3d 25 73  le=%s zMaster=%s
1a050 20 6e 54 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a   nTrunc=%d\n", .
1a060 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 7a 46        pPager->zF
1a070 69 6c 65 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72  ilename, zMaster
1a080 2c 20 6e 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a  , nTrunc);..  /*
1a090 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20 69   If this is an i
1a0a0 6e 2d 6d 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20  n-memory db, or 
1a0b0 6e 6f 20 70 61 67 65 73 20 68 61 76 65 20 62 65  no pages have be
1a0c0 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f  en written to, o
1a0d0 72 20 74 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63  r this.  ** func
1a0e0 74 69 6f 6e 20 68 61 73 20 61 6c 72 65 61 64 79  tion has already
1a0f0 20 62 65 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74   been called, it
1a100 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a   is a no-op..  *
1a110 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
1a120 73 74 61 74 65 21 3d 50 41 47 45 52 5f 53 59 4e  state!=PAGER_SYN
1a130 43 45 44 20 26 26 20 21 4d 45 4d 44 42 20 26 26  CED && !MEMDB &&
1a140 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
1a150 63 68 65 20 29 7b 0a 20 20 20 20 50 67 48 64 72  che ){.    PgHdr
1a160 20 2a 70 50 67 3b 0a 20 20 20 20 61 73 73 65 72   *pPg;.    asser
1a170 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
1a180 61 6c 4f 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f  alOpen );..    /
1a190 2a 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f  * If a master jo
1a1a0 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20  urnal file name 
1a1b0 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
1a1c0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 0a   written to the.
1a1d0 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66      ** journal f
1a1e0 69 6c 65 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e  ile, then no syn
1a1f0 63 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 54  c is required. T
1a200 68 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e  his happens when
1a210 20 69 74 20 69 73 0a 20 20 20 20 2a 2a 20 77 72   it is.    ** wr
1a220 69 74 74 65 6e 2c 20 74 68 65 6e 20 74 68 65 20  itten, then the 
1a230 70 72 6f 63 65 73 73 20 66 61 69 6c 73 20 74 6f  process fails to
1a240 20 75 70 67 72 61 64 65 20 66 72 6f 6d 20 61 20   upgrade from a 
1a250 52 45 53 45 52 56 45 44 20 74 6f 20 61 6e 0a 20  RESERVED to an. 
1a260 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20     ** EXCLUSIVE 
1a270 6c 6f 63 6b 2e 20 54 68 65 20 6e 65 78 74 20 74  lock. The next t
1a280 69 6d 65 20 74 68 65 20 70 72 6f 63 65 73 73 20  ime the process 
1a290 74 72 69 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20  tries to commit 
1a2a0 74 68 65 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73  the.    ** trans
1a2b0 61 63 74 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e  action the m-j n
1a2c0 61 6d 65 20 77 69 6c 6c 20 68 61 76 65 20 61 6c  ame will have al
1a2d0 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1a2e0 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  en..    */.    i
1a2f0 66 28 20 21 70 50 61 67 65 72 2d 3e 73 65 74 4d  f( !pPager->setM
1a300 61 73 74 65 72 20 29 7b 0a 20 20 20 20 20 20 72  aster ){.      r
1a310 63 20 3d 20 70 61 67 65 72 5f 69 6e 63 72 5f 63  c = pager_incr_c
1a320 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 70 50 61  hangecounter(pPa
1a330 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1a340 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a350 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a360 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1a370 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20  MIT_AUTOVACUUM. 
1a380 20 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21       if( nTrunc!
1a390 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
1a3a0 20 49 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   If this transac
1a3b0 74 69 6f 6e 20 68 61 73 20 6d 61 64 65 20 74 68  tion has made th
1a3c0 65 20 64 61 74 61 62 61 73 65 20 73 6d 61 6c 6c  e database small
1a3d0 65 72 2c 20 74 68 65 6e 20 61 6c 6c 20 70 61 67  er, then all pag
1a3e0 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 62 65  es.        ** be
1a3f0 69 6e 67 20 64 69 73 63 61 72 64 65 64 20 62 79  ing discarded by
1a400 20 74 68 65 20 74 72 75 6e 63 61 74 69 6f 6e 20   the truncation 
1a410 6d 75 73 74 20 62 65 20 77 72 69 74 74 65 6e 20  must be written 
1a420 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  to the journal. 
1a430 20 20 20 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a         ** file..
1a440 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
1a450 20 20 20 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20     Pgno i;.     
1a460 20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a     void *pPage;.
1a470 20 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e          for( i=n
1a480 54 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67  Trunc+1; i<=pPag
1a490 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20  er->origDbSize; 
1a4a0 69 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i++ ){.         
1a4b0 20 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61   if( !(pPager->a
1a4c0 49 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26  InJournal[i/8] &
1a4d0 20 28 31 3c 3c 28 69 26 37 29 29 29 20 29 7b 0a   (1<<(i&7))) ){.
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a4f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1a500 74 28 70 50 61 67 65 72 2c 20 69 2c 20 26 70 50  t(pPager, i, &pP
1a510 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1a520 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a530 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1a540 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1a550 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
1a560 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
1a570 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
1a580 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
1a590 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20 20  (pPage);.       
1a5a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a5b0 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1a5c0 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nc_exit;.       
1a5d0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a     }.        } .
1a5e0 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
1a5f0 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4d       rc = writeM
1a600 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61  asterJournal(pPa
1a610 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20  ger, zMaster);. 
1a620 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1a630 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
1a640 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 72  nc_exit;.      r
1a650 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
1a660 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69  pPager);.      i
1a670 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a680 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a690 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65  t;.    }..#ifnde
1a6a0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a6b0 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69 66 28  TOVACUUM.    if(
1a6c0 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1a6d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a6e0 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
1a6f0 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a  Pager, nTrunc);.
1a700 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a710 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1a720 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  ync_exit;.    }.
1a730 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57  #endif..    /* W
1a740 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20 70  rite all dirty p
1a750 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74 61  ages to the data
1a760 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20  base file */.   
1a770 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65 74   pPg = pager_get
1a780 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73  _all_dirty_pages
1a790 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 63  (pPager);.    rc
1a7a0 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70   = pager_write_p
1a7b0 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  agelist(pPg);.  
1a7c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a7d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1a7e0 65 78 69 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79  exit;..    /* Sy
1a7f0 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
1a800 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28  file. */.    if(
1a810 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
1a820 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
1a830 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
1a840 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d  ager->fd);.    }
1a850 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
1a860 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
1a870 45 44 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78  ED;.  }..sync_ex
1a880 69 74 3a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  it:.  return rc;
1a890 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
1a8a0 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a8b0 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68  UM./*.** Move th
1a8c0 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
1a8d0 64 20 62 79 20 70 44 61 74 61 20 74 6f 20 6c 6f  d by pData to lo
1a8e0 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74  cation pgno in t
1a8f0 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20  he file. .**.** 
1a900 54 68 65 72 65 20 6d 75 73 74 20 62 65 20 6e 6f  There must be no
1a910 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   references to t
1a920 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
1a930 70 67 6e 6f 2e 20 49 66 20 63 75 72 72 65 6e 74  pgno. If current
1a940 20 70 61 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73   page.** pgno is
1a950 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20   not already in 
1a960 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
1a970 72 6e 61 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20  rnal, it is not 
1a980 77 72 69 74 74 65 6e 20 74 68 65 72 65 20 62 79  written there by
1a990 0a 2a 2a 20 62 79 20 74 68 69 73 20 72 6f 75 74  .** by this rout
1a9a0 69 6e 65 2e 20 54 68 65 20 73 61 6d 65 20 61 70  ine. The same ap
1a9b0 70 6c 69 65 73 20 74 6f 20 74 68 65 20 70 61 67  plies to the pag
1a9c0 65 20 70 44 61 74 61 20 72 65 66 65 72 73 20 74  e pData refers t
1a9d0 6f 20 6f 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a  o on entry to.**
1a9e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
1a9f0 2a 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 73 20  *.** References 
1aa00 74 6f 20 74 68 65 20 70 61 67 65 20 72 65 66 65  to the page refe
1aa10 72 65 64 20 74 6f 20 62 79 20 70 44 61 74 61 20  red to by pData 
1aa20 72 65 6d 61 69 6e 20 76 61 6c 69 64 2e 20 55 70  remain valid. Up
1aa30 64 61 74 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65  dating any.** me
1aa40 74 61 2d 64 61 74 61 20 61 73 73 6f 63 69 61 74  ta-data associat
1aa50 65 64 20 77 69 74 68 20 70 61 67 65 20 70 44 61  ed with page pDa
1aa60 74 61 20 28 69 2e 65 2e 20 64 61 74 61 20 73 74  ta (i.e. data st
1aa70 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78 74  ored in the nExt
1aa80 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f  ra bytes.** allo
1aa90 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74 68  cated along with
1aaa0 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74 68   the page) is th
1aab0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
1aac0 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a   of the caller..
1aad0 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63 74  **.** A transact
1aae0 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74 69  ion must be acti
1aaf0 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ve when this rou
1ab00 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
1ab10 68 6f 77 65 76 65 72 20 69 74 20 69 73 20 0a 2a  however it is .*
1ab20 2a 20 69 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c  * illegal to cal
1ab30 6c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  l this routine i
1ab40 66 20 61 20 73 74 61 74 6d 65 6e 74 20 74 72 61  f a statment tra
1ab50 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69  nsaction is acti
1ab60 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
1ab70 65 33 70 61 67 65 72 5f 6d 6f 76 65 70 61 67 65  e3pager_movepage
1ab80 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
1ab90 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 50 67 6e  void *pData, Pgn
1aba0 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
1abb0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
1abc0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
1abd0 50 67 48 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a  PgHdr *pPgOld; .
1abe0 20 20 69 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20    int h;.  Pgno 
1abf0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30  needSyncPgno = 0
1ac00 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  ;..  assert( !pP
1ac10 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
1ac20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  );.  assert( pPg
1ac30 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54  ->nRef>0 );..  T
1ac40 52 41 43 45 35 28 22 4d 4f 56 45 20 25 64 20 70  RACE5("MOVE %d p
1ac50 61 67 65 20 25 64 20 28 6e 65 65 64 53 79 6e 63  age %d (needSync
1ac60 3d 25 64 29 20 6d 6f 76 65 73 20 74 6f 20 25 64  =%d) moves to %d
1ac70 5c 6e 22 2c 20 0a 20 20 20 20 20 20 50 41 47 45  \n", .      PAGE
1ac80 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
1ac90 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65  ->pgno, pPg->nee
1aca0 64 53 79 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20  dSync, pgno);.. 
1acb0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
1acc0 6e 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79  nc ){.    needSy
1acd0 6e 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67  ncPgno = pPg->pg
1ace0 6e 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  no;.    assert( 
1acf0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  pPg->inJournal )
1ad00 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1ad10 67 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  g->dirty );.    
1ad20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1ad30 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a  needSync );.  }.
1ad40 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67  .  /* Unlink pPg
1ad50 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d   from it's hash-
1ad60 63 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e  chain */.  unlin
1ad70 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1ad80 72 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49  r, pPg);..  /* I
1ad90 66 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74  f the cache cont
1ada0 61 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68  ains a page with
1adb0 20 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e   page-number pgn
1adc0 6f 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a  o, remove it.  *
1add0 2a 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  * from it's hash
1ade0 20 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66   chain. Also, if
1adf0 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53   the PgHdr.needS
1ae00 79 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20  ync was set for 
1ae10 0a 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20  .  ** page pgno 
1ae20 62 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65  before the 'move
1ae30 27 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20  ' operation, it 
1ae40 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61  needs to be reta
1ae50 69 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74  ined .  ** for t
1ae60 68 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68  he page moved th
1ae70 65 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f  ere..  */.  pPgO
1ae80 6c 64 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  ld = pager_looku
1ae90 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
1aea0 0a 20 20 69 66 28 20 70 50 67 4f 6c 64 20 29 7b  .  if( pPgOld ){
1aeb0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1aec0 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  Old->nRef==0 );.
1aed0 20 20 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68      unlinkHashCh
1aee0 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 4f  ain(pPager, pPgO
1aef0 6c 64 29 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d  ld);.    pPgOld-
1af00 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
1af10 69 66 28 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  if( pPgOld->need
1af20 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 61 73  Sync ){.      as
1af30 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e  sert( pPgOld->in
1af40 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20  Journal );.     
1af50 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
1af60 3d 20 31 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 1;.      pPg->
1af70 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1af80 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1af90 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a  er->needSync );.
1afa0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
1afb0 43 68 61 6e 67 65 20 74 68 65 20 70 61 67 65 20  Change the page 
1afc0 6e 75 6d 62 65 72 20 66 6f 72 20 70 50 67 20 61  number for pPg a
1afd0 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
1afe0 6f 20 74 68 65 20 6e 65 77 20 68 61 73 68 2d 63  o the new hash-c
1aff0 68 61 69 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e  hain. */.  pPg->
1b000 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68  pgno = pgno;.  h
1b010 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
1b020 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
1b030 72 2d 3e 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20  r->aHash[h] ){. 
1b040 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1b050 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1b060 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20  evHash==0 );.   
1b070 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
1b080 5d 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70  ]->pPrevHash = p
1b090 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  Pg;.  }.  pPg->p
1b0a0 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65  NextHash = pPage
1b0b0 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70  r->aHash[h];.  p
1b0c0 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
1b0d0 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50  = pPg;.  pPg->pP
1b0e0 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20  revHash = 0;..  
1b0f0 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  pPg->dirty = 1;.
1b100 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
1b110 61 63 68 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28  ache = 1;..  if(
1b120 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b   needSyncPgno ){
1b130 0a 20 20 20 20 2f 2a 20 49 66 20 6e 65 65 64 53  .    /* If needS
1b140 79 6e 63 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a  yncPgno is non-z
1b150 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f  ero, then the jo
1b160 75 72 6e 61 6c 20 66 69 6c 65 20 6e 65 65 64 73  urnal file needs
1b170 20 74 6f 20 62 65 20 0a 20 20 20 20 2a 2a 20 73   to be .    ** s
1b180 79 6e 63 28 29 65 64 20 62 65 66 6f 72 65 20 61  ync()ed before a
1b190 6e 79 20 64 61 74 61 20 69 73 20 77 72 69 74 74  ny data is writt
1b1a0 65 6e 20 74 6f 20 64 61 74 61 62 61 73 65 20 66  en to database f
1b1b0 69 6c 65 20 70 61 67 65 20 6e 65 65 64 53 79 6e  ile page needSyn
1b1c0 63 50 67 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75  cPgno..    ** Cu
1b1d0 72 72 65 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68  rrently, no such
1b1e0 20 70 61 67 65 20 65 78 69 73 74 73 20 69 6e 20   page exists in 
1b1f0 74 68 65 20 70 61 67 65 2d 63 61 63 68 65 20 61  the page-cache a
1b200 6e 64 20 74 68 65 20 0a 20 20 20 20 2a 2a 20 50  nd the .    ** P
1b210 61 67 65 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ager.aInJournal 
1b220 62 69 74 20 68 61 73 20 62 65 65 6e 20 73 65 74  bit has been set
1b230 2e 20 54 68 69 73 20 6e 65 65 64 73 20 74 6f 20  . This needs to 
1b240 62 65 20 72 65 6d 65 64 69 65 64 20 62 79 20 6c  be remedied by l
1b250 6f 61 64 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68  oading.    ** th
1b260 65 20 70 61 67 65 20 69 6e 74 6f 20 74 68 65 20  e page into the 
1b270 70 61 67 65 72 2d 63 61 63 68 65 20 61 6e 64 20  pager-cache and 
1b280 73 65 74 74 69 6e 67 20 74 68 65 20 50 67 48 64  setting the PgHd
1b290 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 2e  r.needSync flag.
1b2a0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
1b2b0 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  he sqlite3pager_
1b2c0 67 65 74 28 29 20 63 61 6c 6c 20 6d 61 79 20 63  get() call may c
1b2d0 61 75 73 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ause the journal
1b2e0 20 74 6f 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b   to sync. So mak
1b2f0 65 0a 20 20 20 20 2a 2a 20 73 75 72 65 20 74 68  e.    ** sure th
1b300 65 20 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63  e Pager.needSync
1b310 20 66 6c 61 67 20 69 73 20 73 65 74 20 74 6f 6f   flag is set too
1b320 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74  ..    */.    int
1b330 20 72 63 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70   rc;.    void *p
1b340 4e 65 65 64 53 79 6e 63 3b 0a 20 20 20 20 61 73  NeedSync;.    as
1b350 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1b360 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 72 63  edSync );.    rc
1b370 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1b380 67 65 74 28 70 50 61 67 65 72 2c 20 6e 65 65 64  get(pPager, need
1b390 53 79 6e 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64  SyncPgno, &pNeed
1b3a0 53 79 6e 63 29 3b 0a 20 20 20 20 69 66 28 20 72  Sync);.    if( r
1b3b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1b3c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50  eturn rc;.    pP
1b3d0 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
1b3e0 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1b3f0 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1b400 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1b410 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1b420 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e  R(pNeedSync)->in
1b430 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1b440 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1b450 4e 65 65 64 53 79 6e 63 29 2d 3e 64 69 72 74 79  NeedSync)->dirty
1b460 20 3d 20 31 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 1;.    sqlite
1b470 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 4e 65  3pager_unref(pNe
1b480 65 64 53 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20  edSync);.  }..  
1b490 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
1b4a0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  ;.}.#endif..#if 
1b4b0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
1b4c0 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65 64  EBUG) || defined
1b4d0 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a  (SQLITE_TEST)./*
1b4e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
1b4f0 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66 20  urrent state of 
1b500 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f  the file lock fo
1b510 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  r the given page
1b520 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e  r..** The return
1b530 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66   value is one of
1b540 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44   NO_LOCK, SHARED
1b550 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44 5f  _LOCK, RESERVED_
1b560 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47  LOCK,.** PENDING
1b570 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53  _LOCK, or EXCLUS
1b580 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74  IVE_LOCK..*/.int
1b590 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f   sqlite3pager_lo
1b5a0 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
1b5b0 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66 20 4f  Pager){.#ifdef O
1b5c0 53 5f 54 45 53 54 0a 20 20 72 65 74 75 72 6e 20  S_TEST.  return 
1b5d0 70 50 61 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c  pPager->fd->fd.l
1b5e0 6f 63 6b 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20  ocktype;.#else. 
1b5f0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1b600 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e  fd.locktype;.#en
1b610 64 69 66 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  dif.}.#endif..#i
1b620 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
1b630 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c  ./*.** Print a l
1b640 69 73 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65  isting of all re
1b650 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20 61  ferenced pages a
1b660 6e 64 20 74 68 65 69 72 20 72 65 66 20 63 6f 75  nd their ref cou
1b670 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  nt..*/.void sqli
1b680 74 65 33 70 61 67 65 72 5f 72 65 66 64 75 6d 70  te3pager_refdump
1b690 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
1b6a0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
1b6b0 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
1b6c0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
1b6d0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
1b6e0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65      if( pPg->nRe
1b6f0 66 3c 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  f<=0 ) continue;
1b700 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75  .    sqlite3Debu
1b710 67 50 72 69 6e 74 66 28 22 50 41 47 45 20 25 33  gPrintf("PAGE %3
1b720 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66 3d 25  d addr=%p nRef=%
1b730 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 70 50  d\n", .       pP
1b740 67 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  g->pgno, PGHDR_T
1b750 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 67  O_DATA(pPg), pPg
1b760 2d 3e 6e 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23  ->nRef);.  }.}.#
1b770 65 6e 64 69 66 0a                                endif.