/ Hex Artifact Content
Login

Artifact d6ba3096969bc306c46b7db9c11cfe0bbedcc9b9:


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 39  : pager.c,v 1.19
0350: 38 20 32 30 30 35 2f 30 33 2f 32 31 20 30 34 3a  8 2005/03/21 04:
0360: 30 34 3a 30 32 20 64 61 6e 69 65 6c 6b 31 39 37  04:02 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 23 69 66 64 65 66 20 53  pgno */.#ifdef S
1d10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1d20: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
1d30: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
1d40: 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20  ager->psAligned 
1d50: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1d60: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1d70: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
1d80: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
1d90: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
1da0: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
1db0: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
1dc0: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1dd0: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1de0: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1df0: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1e00: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1e10: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1e20: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1e30: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1e40: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1e50: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1e60: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1e70: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
1e80: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1e90: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
1ea0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
1eb0: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
1ec0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ed0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1ef0: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1f00: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1f10: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1f20: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1f30: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1f40: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1f50: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
1f60: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
1f70: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
1f80: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
1f90: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
1fa0: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
1fb0: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
1fc0: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
1fd0: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
1fe0: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
1ff0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2000: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
2010: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
2020: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
2030: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
2040: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
2050: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
2060: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
2070: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
2080: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
2090: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
20a0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
20b0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
20c0: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
20d0: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
20e0: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
20f0: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
2100: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
2110: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
2120: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
2130: 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e  P,D,N,X) if( P->
2140: 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f  xCodec ){ P->xCo
2150: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
2160: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65  ,D,N,X); }.#else
2170: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
2180: 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a  P,D,N,X).#endif.
2190: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
21a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
21b0: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
21c0: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
21d0: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
21e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
21f0: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
2200: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
2210: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
2220: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
2230: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
2240: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2250: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
2260: 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26  oid*)&((char*)(&
2270: 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73  (G)[1]))[(P)->ps
2280: 41 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e  Aligned]).#defin
2290: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
22a0: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
22b0: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
22c0: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
22d0: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73  )[1]))[(PGR)->ps
22e0: 41 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e  Aligned+(PGR)->n
22f0: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
2300: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
2310: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
2320: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2330: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2340: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2350: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  r..*/.#define N_
2360: 50 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a  PG_HASH 2048../*
2370: 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20  .** Hash a page 
2380: 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  number.*/.#defin
2390: 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29  e pager_hash(PN)
23a0: 20 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41    ((PN)&(N_PG_HA
23b0: 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  SH-1))../*.** A 
23c0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
23d0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
23e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2400: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63  ruct Pager {.  c
2410: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
2420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2430: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2440: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
2450: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
2460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2470: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2480: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2490: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
24a0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
24b0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
24c0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
24d0: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66  es */.  OsFile f
24e0: 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20  d, jfd;         
24f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2500: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
2510: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2520: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66   */.  OsFile stf
2530: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2540: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2550: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
2560: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
2570: 6c 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  l*/.  int dbSize
2580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2590: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
25a0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
25b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
25c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25d0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
25e0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
25f0: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
2600: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
2610: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2620: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
2630: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
2640: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73  gin() */.  i64 s
2650: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
2660: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2670: 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d  f journal at stm
2680: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
2690: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
26a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
26c0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
26d0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
26e0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
26f0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
2700: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
2710: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
2720: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
2730: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
2740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2750: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
2760: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
2770: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2790: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
27a0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
27b0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
27c0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
27d0: 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  tor)(void*,int);
27e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
27f0: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
2800: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
2810: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
2820: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  void*,int);   /*
2830: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
2840: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
2850: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
2860: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
2870: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2880: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2890: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70   page */.  int p
28a0: 73 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20  sAligned;       
28b0: 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69         /* pageSi
28c0: 7a 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ze rounded up to
28d0: 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38   a multiple of 8
28e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
2910: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
2920: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 4d  ages */.  int nM
2930: 61 78 50 61 67 65 3b 20 20 20 20 20 20 20 20 20  axPage;         
2940: 20 20 20 20 20 20 2f 2a 20 48 69 67 68 20 77 61        /* High wa
2950: 74 65 72 20 6d 61 72 6b 20 6f 66 20 6e 50 61 67  ter mark of nPag
2960: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66 3b  e */.  int nRef;
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
2990: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
29a0: 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66 3e  with PgHdr.nRef>
29b0: 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61 67  0 */.  int mxPag
29c0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
29d0: 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e 75     /* Maximum nu
29e0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f  mber of pages to
29f0: 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20 2a   hold in cache *
2a00: 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d  /.  int nHit, nM
2a10: 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20 20 20  iss, nOvfl;     
2a20: 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c 20 6d  /* Cache hits, m
2a30: 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52 55 20  issing, and LRU 
2a40: 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20 20 69  overflows */.  i
2a50: 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74 65 3b  nt nRead,nWrite;
2a60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
2a70: 74 61 62 61 73 65 20 70 61 67 65 73 20 72 65 61  tabase pages rea
2a80: 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 20 20 76  d/written */.  v
2a90: 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28 76 6f  oid (*xCodec)(vo
2aa0: 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69  id*,void*,Pgno,i
2ab0: 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20  nt); /* Routine 
2ac0: 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20  for en/decoding 
2ad0: 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a  data */.  void *
2ae0: 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20 20 20  pCodecArg;      
2af0: 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 61        /* First a
2b00: 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65  rgument to xCode
2b10: 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  c() */.  u8 jour
2b20: 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20 20  nalOpen;        
2b30: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b40: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73  journal file des
2b50: 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c 69  criptors is vali
2b60: 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e 61  d */.  u8 journa
2b70: 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20 20  lStarted;       
2b80: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68 65     /* True if he
2b90: 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c 20  ader of journal 
2ba0: 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20 75  is synced */.  u
2bb0: 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20 20  8 useJournal;   
2bc0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
2bd0: 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  e a rollback jou
2be0: 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c  rnal on this fil
2bf0: 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61 64  e */.  u8 noRead
2c00: 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  lock;           
2c10: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f 74     /* Do not bot
2c20: 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72 65  her to obtain re
2c30: 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38 20  adlocks */.  u8 
2c40: 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20 20  stmtOpen;       
2c50: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c60: 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   if the statemen
2c70: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73 20  t subjournal is 
2c80: 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d  open */.  u8 stm
2c90: 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20 20  tInUse;         
2ca0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77 65        /* True we
2cb0: 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65 6d   are in a statem
2cc0: 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74 69  ent subtransacti
2cd0: 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 41  on */.  u8 stmtA
2ce0: 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20 20  utoopen;        
2cf0: 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d 74      /* Open stmt
2d00: 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d 61   journal when ma
2d10: 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70  in journal is op
2d20: 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53 79  ened*/.  u8 noSy
2d30: 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  nc;             
2d40: 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 73       /* Do not s
2d50: 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
2d60: 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38 20  if true */.  u8 
2d70: 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20 20  fullSync;       
2d80: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 65           /* Do e
2d90: 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74 68  xtra syncs of th
2da0: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 6f  e journal for ro
2db0: 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75 38  bustness */.  u8
2dc0: 20 73 74 61 74 65 3b 20 20 20 20 20 20 20 20 20   state;         
2dd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 41 47            /* PAG
2de0: 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52  ER_UNLOCK, _SHAR
2df0: 45 44 2c 20 5f 52 45 53 45 52 56 45 44 2c 20 65  ED, _RESERVED, e
2e00: 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65 72 72 4d  tc. */.  u8 errM
2e10: 61 73 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  ask;            
2e20: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 73       /* One of s
2e30: 65 76 65 72 61 6c 20 6b 69 6e 64 73 20 6f 66 20  everal kinds of 
2e40: 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75 38 20 74  errors */.  u8 t
2e50: 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20 20  empFile;        
2e60: 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c 65          /* zFile
2e70: 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f 72  name is a tempor
2e80: 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38  ary file */.  u8
2e90: 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20 20   readOnly;      
2ea0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
2eb0: 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e 6c  e for a read-onl
2ec0: 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  y database */.  
2ed0: 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20 20  u8 needSync;    
2ee0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2ef0: 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63 28  rue if an fsync(
2f00: 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20 74  ) is needed on t
2f10: 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  he journal */.  
2f20: 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20 20  u8 dirtyCache;  
2f30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2f40: 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70 61  rue if cached pa
2f50: 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65 64  ges have changed
2f60: 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52   */.  u8 alwaysR
2f70: 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20  ollback;        
2f80: 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e    /* Disable don
2f90: 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  t_rollback() for
2fa0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2fb0: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2fd0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
2fe0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
2ff0: 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b   u8 *aInJournal;
3000: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3010: 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68  One bit for each
3020: 20 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74   page in the dat
3030: 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
3040: 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20  u8 *aInStmt;    
3050: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
3060: 6e 65 20 62 69 74 20 66 6f 72 20 65 61 63 68 20  ne bit for each 
3070: 70 61 67 65 20 69 6e 20 74 68 65 20 64 61 74 61  page in the data
3080: 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 73 65 74  base */.  u8 set
3090: 4d 61 73 74 65 72 3b 20 20 20 20 20 20 20 20 20  Master;         
30a0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
30b0: 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68 61 73 20   a m-j name has 
30c0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
30d0: 6a 72 6e 6c 20 2a 2f 0a 20 20 42 75 73 79 48 61  jrnl */.  BusyHa
30e0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
30f0: 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e 74 65 72  ler;  /* Pointer
3100: 20 74 6f 20 73 71 6c 69 74 65 2e 62 75 73 79 48   to sqlite.busyH
3110: 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50 67 48 64  andler */.  PgHd
3120: 72 20 2a 70 46 69 72 73 74 2c 20 2a 70 4c 61 73  r *pFirst, *pLas
3130: 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20  t;      /* List 
3140: 6f 66 20 66 72 65 65 20 70 61 67 65 73 20 2a 2f  of free pages */
3150: 0a 20 20 50 67 48 64 72 20 2a 70 46 69 72 73 74  .  PgHdr *pFirst
3160: 53 79 6e 63 65 64 3b 20 20 20 20 20 20 20 20 2f  Synced;        /
3170: 2a 20 46 69 72 73 74 20 66 72 65 65 20 70 61 67  * First free pag
3180: 65 20 77 69 74 68 20 50 67 48 64 72 2e 6e 65 65  e with PgHdr.nee
3190: 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20 20 50 67  dSync==0 */.  Pg
31a0: 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20 20 20 20  Hdr *pAll;      
31b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73            /* Lis
31c0: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a  t of all pages *
31d0: 2f 0a 20 20 50 67 48 64 72 20 2a 70 53 74 6d 74  /.  PgHdr *pStmt
31e0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
31f0: 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67 65 73  /* List of pages
3200: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3210: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3220: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
3230: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3240: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
3250: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
3260: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
3270: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
3280: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
3290: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
32a0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
32b0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
32c0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
32d0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
32e0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
32f0: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
3300: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
3310: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
3320: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
3330: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
3340: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
3350: 20 20 69 6e 74 20 73 65 63 74 6f 72 53 69 7a 65    int sectorSize
3360: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
3370: 20 41 73 73 75 6d 65 64 20 73 65 63 74 6f 72 20   Assumed sector 
3380: 73 69 7a 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c  size during roll
3390: 62 61 63 6b 20 2a 2f 0a 20 20 50 67 48 64 72 20  back */.  PgHdr 
33a0: 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48 41 53 48  *aHash[N_PG_HASH
33b0: 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68 20 74 61  ];    /* Hash ta
33c0: 62 6c 65 20 74 6f 20 6d 61 70 20 70 61 67 65 20  ble to map page 
33d0: 6e 75 6d 62 65 72 20 74 6f 20 50 67 48 64 72 20  number to PgHdr 
33e0: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  */.};../*.** The
33f0: 73 65 20 61 72 65 20 62 69 74 73 20 74 68 61 74  se are bits that
3400: 20 63 61 6e 20 62 65 20 73 65 74 20 69 6e 20 50   can be set in P
3410: 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f  ager.errMask..*/
3420: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3430: 52 52 5f 46 55 4c 4c 20 20 20 20 20 30 78 30 31  RR_FULL     0x01
3440: 20 20 2f 2a 20 61 20 77 72 69 74 65 28 29 20 66    /* a write() f
3450: 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65  ailed */.#define
3460: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 20   PAGER_ERR_MEM  
3470: 20 20 20 20 30 78 30 32 20 20 2f 2a 20 6d 61 6c      0x02  /* mal
3480: 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 2a 2f 0a  loc() failed */.
3490: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52  #define PAGER_ER
34a0: 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78 30 34 20  R_LOCK     0x04 
34b0: 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20 74 68 65   /* error in the
34c0: 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
34d0: 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  l */.#define PAG
34e0: 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 20  ER_ERR_CORRUPT  
34f0: 30 78 30 38 20 20 2f 2a 20 64 61 74 61 62 61 73  0x08  /* databas
3500: 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 63 6f 72  e or journal cor
3510: 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64 65 66 69  ruption */.#defi
3520: 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53  ne PAGER_ERR_DIS
3530: 4b 20 20 20 20 20 30 78 31 30 20 20 2f 2a 20 67  K     0x10  /* g
3540: 65 6e 65 72 61 6c 20 64 69 73 6b 20 49 2f 4f 20  eneral disk I/O 
3550: 65 72 72 6f 72 20 2d 20 62 61 64 20 68 61 72 64  error - bad hard
3560: 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a   drive? */../*.*
3570: 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c 65 73 20  * Journal files 
3580: 62 65 67 69 6e 20 77 69 74 68 20 74 68 65 20 66  begin with the f
3590: 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69 63 20 73  ollowing magic s
35a0: 74 72 69 6e 67 2e 20 20 54 68 65 20 64 61 74 61  tring.  The data
35b0: 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69 6e 65 64  .** was obtained
35c0: 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61 6e 64 6f   from /dev/rando
35d0: 6d 2e 20 20 49 74 20 69 73 20 75 73 65 64 20 6f  m.  It is used o
35e0: 6e 6c 79 20 61 73 20 61 20 73 61 6e 69 74 79 20  nly as a sanity 
35f0: 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e  check..**.** Sin
3600: 63 65 20 76 65 72 73 69 6f 6e 20 32 2e 38 2e 30  ce version 2.8.0
3610: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f  , the journal fo
3620: 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 64  rmat contains ad
3630: 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69 74 79 0a  ditional sanity.
3640: 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f  ** checking info
3650: 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20 74 68 65  rmation.  If the
3660: 20 70 6f 77 65 72 20 66 61 69 6c 73 20 77 68 69   power fails whi
3670: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  le the journal i
3680: 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72 69 74 74  s begin.** writt
3690: 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64 6f 6d 20  en, semi-random 
36a0: 67 61 72 62 61 67 65 20 64 61 74 61 20 6d 69 67  garbage data mig
36b0: 68 74 20 61 70 70 65 61 72 20 69 6e 20 74 68 65  ht appear in the
36c0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
36d0: 20 61 66 74 65 72 20 70 6f 77 65 72 20 69 73 20   after power is 
36e0: 72 65 73 74 6f 72 65 64 2e 20 20 49 66 20 61 6e  restored.  If an
36f0: 20 61 74 74 65 6d 70 74 20 69 73 20 74 68 65 6e   attempt is then
3700: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c   made.** to roll
3710: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 61 63   the journal bac
3720: 6b 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  k, the database 
3730: 63 6f 75 6c 64 20 62 65 20 63 6f 72 72 75 70 74  could be corrupt
3740: 65 64 2e 20 20 54 68 65 20 61 64 64 69 74 69 6f  ed.  The additio
3750: 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79 20 63 68  nal.** sanity ch
3760: 65 63 6b 69 6e 67 20 64 61 74 61 20 69 73 20 61  ecking data is a
3770: 6e 20 61 74 74 65 6d 70 74 20 74 6f 20 64 69 73  n attempt to dis
3780: 63 6f 76 65 72 20 74 68 65 20 67 61 72 62 61 67  cover the garbag
3790: 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  e in the.** jour
37a0: 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72 65 20 69  nal and ignore i
37b0: 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 61 6e  t..**.** The san
37c0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 69 6e 66  ity checking inf
37d0: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
37e0: 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   new journal for
37f0: 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a 2a 2a 20  mat consists.** 
3800: 6f 66 20 61 20 33 32 2d 62 69 74 20 63 68 65 63  of a 32-bit chec
3810: 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20 70 61 67  ksum on each pag
3820: 65 20 6f 66 20 64 61 74 61 2e 20 20 54 68 65 20  e of data.  The 
3830: 63 68 65 63 6b 73 75 6d 20 63 6f 76 65 72 73 20  checksum covers 
3840: 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70 61 67 65  both.** the page
3850: 20 6e 75 6d 62 65 72 20 61 6e 64 20 74 68 65 20   number and the 
3860: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
3870: 20 62 79 74 65 73 20 6f 66 20 64 61 74 61 20 66   bytes of data f
3880: 6f 72 20 74 68 65 20 70 61 67 65 2e 0a 2a 2a 20  or the page..** 
3890: 54 68 69 73 20 63 6b 73 75 6d 20 69 73 20 69 6e  This cksum is in
38a0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 61 20 33  itialized to a 3
38b0: 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20 76 61 6c  2-bit random val
38c0: 75 65 20 74 68 61 74 20 61 70 70 65 61 72 73 20  ue that appears 
38d0: 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61  in the.** journa
38e0: 6c 20 66 69 6c 65 20 72 69 67 68 74 20 61 66 74  l file right aft
38f0: 65 72 20 74 68 65 20 68 65 61 64 65 72 2e 20 20  er the header.  
3900: 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69  The random initi
3910: 61 6c 69 7a 65 72 20 69 73 20 69 6d 70 6f 72 74  alizer is import
3920: 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75 73 65 20  ant,.** because 
3930: 67 61 72 62 61 67 65 20 64 61 74 61 20 74 68 61  garbage data tha
3940: 74 20 61 70 70 65 61 72 73 20 61 74 20 74 68 65  t appears at the
3950: 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75 72 6e 61   end of a journa
3960: 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64  l is likely.** d
3970: 61 74 61 20 74 68 61 74 20 77 61 73 20 6f 6e 63  ata that was onc
3980: 65 20 69 6e 20 6f 74 68 65 72 20 66 69 6c 65 73  e in other files
3990: 20 74 68 61 74 20 68 61 76 65 20 6e 6f 77 20 62   that have now b
39a0: 65 65 6e 20 64 65 6c 65 74 65 64 2e 20 20 49 66  een deleted.  If
39b0: 20 74 68 65 0a 2a 2a 20 67 61 72 62 61 67 65 20   the.** garbage 
39c0: 64 61 74 61 20 63 61 6d 65 20 66 72 6f 6d 20 61  data came from a
39d0: 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f 75 72 6e  n obsolete journ
39e0: 61 6c 20 66 69 6c 65 2c 20 74 68 65 20 63 68 65  al file, the che
39f0: 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a 2a 2a 20  cksums might.** 
3a00: 62 65 20 63 6f 72 72 65 63 74 2e 20 20 42 75 74  be correct.  But
3a10: 20 62 79 20 69 6e 69 74 69 61 6c 69 7a 69 6e 67   by initializing
3a20: 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 74 6f   the checksum to
3a30: 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 77 68   random value wh
3a40: 69 63 68 0a 2a 2a 20 69 73 20 64 69 66 66 65 72  ich.** is differ
3a50: 65 6e 74 20 66 6f 72 20 65 76 65 72 79 20 6a 6f  ent for every jo
3a60: 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e 69 6d 69  urnal, we minimi
3a70: 7a 65 20 74 68 61 74 20 72 69 73 6b 2e 0a 2a 2f  ze that risk..*/
3a80: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 75 6e  .static const un
3a90: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4a 6f 75  signed char aJou
3aa0: 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a  rnalMagic[] = {.
3ab0: 20 20 30 78 64 39 2c 20 30 78 64 35 2c 20 30 78    0xd9, 0xd5, 0x
3ac0: 30 35 2c 20 30 78 66 39 2c 20 30 78 32 30 2c 20  05, 0xf9, 0x20, 
3ad0: 30 78 61 31 2c 20 30 78 36 33 2c 20 30 78 64 37  0xa1, 0x63, 0xd7
3ae0: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ,.};../*.** The 
3af0: 73 69 7a 65 20 6f 66 20 74 68 65 20 68 65 61 64  size of the head
3b00: 65 72 20 61 6e 64 20 6f 66 20 65 61 63 68 20 70  er and of each p
3b10: 61 67 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  age in the journ
3b20: 61 6c 20 69 73 20 64 65 74 65 72 6d 69 6e 65 64  al is determined
3b30: 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f 6c 6c 6f  .** by the follo
3b40: 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a  wing macros..*/.
3b50: 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f  #define JOURNAL_
3b60: 50 47 5f 53 5a 28 70 50 61 67 65 72 29 20 20 28  PG_SZ(pPager)  (
3b70: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
3b80: 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54  e) + 8)../*.** T
3b90: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
3ba0: 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20  r size for this 
3bb0: 70 61 67 65 72 2e 20 49 6e 20 74 68 65 20 66 75  pager. In the fu
3bc0: 74 75 72 65 2c 20 74 68 69 73 20 63 6f 75 6c 64  ture, this could
3bd0: 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f 20 73 6f   be.** set to so
3be0: 6d 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  me value read fr
3bf0: 6f 6d 20 74 68 65 20 64 69 73 6b 20 63 6f 6e 74  om the disk cont
3c00: 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69 6d 70 6f  roller. The impo
3c10: 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72 61 63 74  rtant.** charact
3c20: 65 72 69 73 74 69 63 20 69 73 20 74 68 61 74 20  eristic is that 
3c30: 69 74 20 69 73 20 74 68 65 20 73 61 6d 65 20 73  it is the same s
3c40: 69 7a 65 20 61 73 20 61 20 64 69 73 6b 20 73 65  ize as a disk se
3c50: 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  ctor..*/.#define
3c60: 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28   JOURNAL_HDR_SZ(
3c70: 70 50 61 67 65 72 29 20 28 70 50 61 67 65 72 2d  pPager) (pPager-
3c80: 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a  >sectorSize)../*
3c90: 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f 20 4d 45  .** The macro ME
3ca0: 4d 44 42 20 69 73 20 74 72 75 65 20 69 66 20 77  MDB is true if w
3cb0: 65 20 61 72 65 20 64 65 61 6c 69 6e 67 20 77 69  e are dealing wi
3cc0: 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  th an in-memory 
3cd0: 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 57 65 20  database..** We 
3ce0: 64 6f 20 74 68 69 73 20 61 73 20 61 20 6d 61 63  do this as a mac
3cf0: 72 6f 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  ro so that if th
3d00: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  e SQLITE_OMIT_ME
3d10: 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20 69 73 20  MORYDB macro is 
3d20: 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  set,.** the valu
3d30: 65 20 6f 66 20 4d 45 4d 44 42 20 77 69 6c 6c 20  e of MEMDB will 
3d40: 62 65 20 61 20 63 6f 6e 73 74 61 6e 74 20 61 6e  be a constant an
3d50: 64 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77  d the compiler w
3d60: 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20  ill optimize.** 
3d70: 6f 75 74 20 63 6f 64 65 20 74 68 61 74 20 77 6f  out code that wo
3d80: 75 6c 64 20 6e 65 76 65 72 20 65 78 65 63 75 74  uld never execut
3d90: 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c  e..*/.#ifdef SQL
3da0: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
3db0: 42 0a 23 20 64 65 66 69 6e 65 20 4d 45 4d 44 42  B.# define MEMDB
3dc0: 20 30 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   0.#else.# defin
3dd0: 65 20 4d 45 4d 44 42 20 70 50 61 67 65 72 2d 3e  e MEMDB pPager->
3de0: 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a  memDb.#endif../*
3df0: 0a 2a 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20  .** The default 
3e00: 73 69 7a 65 20 6f 66 20 61 20 64 69 73 6b 20 73  size of a disk s
3e10: 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  ector.*/.#define
3e20: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
3e30: 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61  ZE 512../*.** Pa
3e40: 67 65 20 6e 75 6d 62 65 72 20 50 41 47 45 52 5f  ge number PAGER_
3e50: 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65 76 65 72  MJ_PGNO is never
3e60: 20 75 73 65 64 20 69 6e 20 61 6e 20 53 51 4c 69   used in an SQLi
3e70: 74 65 20 64 61 74 61 62 61 73 65 20 28 69 74 20  te database (it 
3e80: 69 73 0a 2a 2a 20 72 65 73 65 72 76 65 64 20 66  is.** reserved f
3e90: 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72 6f 75 6e  or working aroun
3ea0: 64 20 61 20 77 69 6e 64 6f 77 73 2f 70 6f 73 69  d a windows/posi
3eb0: 78 20 69 6e 63 6f 6d 70 61 74 69 62 69 6c 69 74  x incompatibilit
3ec0: 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20 75 73 65  y). It is.** use
3ed0: 64 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  d in the journal
3ee0: 20 74 6f 20 73 69 67 6e 69 66 79 20 74 68 61 74   to signify that
3ef0: 20 74 68 65 20 72 65 6d 61 69 6e 64 65 72 20 6f   the remainder o
3f00: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
3f10: 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76 6f 74 65  le .** is devote
3f20: 64 20 74 6f 20 73 74 6f 72 69 6e 67 20 61 20 6d  d to storing a m
3f30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
3f40: 6d 65 20 2d 20 74 68 65 72 65 20 61 72 65 20 6e  me - there are n
3f50: 6f 20 6d 6f 72 65 20 70 61 67 65 73 20 74 6f 0a  o more pages to.
3f60: 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e 20 53 65  ** roll back. Se
3f70: 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f 72 20 66  e comments for f
3f80: 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4d 61 73  unction writeMas
3f90: 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20 66 6f 72  terJournal() for
3fa0: 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20   details..*/./* 
3fb0: 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a  #define PAGER_MJ
3fc0: 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e 44 49 4e  _PGNO(x) (PENDIN
3fd0: 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67  G_BYTE/((x)->pag
3fe0: 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64 65 66 69  eSize)) */.#defi
3ff0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
4000: 28 78 29 20 28 28 50 45 4e 44 49 4e 47 5f 42 59  (x) ((PENDING_BY
4010: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
4020: 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68  e))+1)../*.** Th
4030: 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67 61 6c 20  e maximum legal 
4040: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 28  page number is (
4050: 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64  2^31 - 1)..*/.#d
4060: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 41 58 5f  efine PAGER_MAX_
4070: 50 47 4e 4f 20 32 31 34 37 34 38 33 36 34 37 0a  PGNO 2147483647.
4080: 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65 20 72 65  ./*.** Enable re
4090: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 74 72  ference count tr
40a0: 61 63 6b 69 6e 67 20 28 66 6f 72 20 64 65 62 75  acking (for debu
40b0: 67 67 69 6e 67 29 20 68 65 72 65 3a 0a 2a 2f 0a  gging) here:.*/.
40c0: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45  #ifdef SQLITE_DE
40d0: 42 55 47 0a 20 20 69 6e 74 20 70 61 67 65 72 33  BUG.  int pager3
40e0: 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20  _refinfo_enable 
40f0: 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20 76 6f  = 0;.  static vo
4100: 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f  id pager_refinfo
4110: 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20 20 20  (PgHdr *p){.    
4120: 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74 20 3d  static int cnt =
4130: 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70 61 67   0;.    if( !pag
4140: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
4150: 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  le ) return;.   
4160: 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69   sqlite3DebugPri
4170: 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52 45 46  ntf(.       "REF
4180: 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d 25 70  CNT: %4d addr=%p
4190: 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20 20 20   nRef=%d\n",.   
41a0: 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50 47 48      p->pgno, PGH
41b0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70  DR_TO_DATA(p), p
41c0: 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a 20 20  ->nRef.    );.  
41d0: 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f    cnt++;   /* So
41e0: 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74 20 61  mething to set a
41f0: 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a   breakpoint on *
4200: 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65 20 52  /.  }.# define R
4210: 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67 65 72  EFINFO(X)  pager
4220: 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65 6c 73  _refinfo(X).#els
4230: 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  e.# define REFIN
4240: 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  FO(X).#endif../*
4250: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4260: 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d 20 74  t integer from t
4270: 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65  he given file de
4280: 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f 72 65  scriptor.  Store
4290: 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20   the integer.** 
42a0: 74 68 61 74 20 69 73 20 72 65 61 64 20 69 6e 20  that is read in 
42b0: 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e 20 53  *pRes.  Return S
42c0: 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76 65 72  QLITE_OK if ever
42d0: 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c 20 6f  ything worked, o
42e0: 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20 63 6f  r an.** error co
42f0: 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  de is something 
4300: 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a  goes wrong..**.*
4310: 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61 72 65  * All values are
4320: 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73 6b 20   stored on disk 
4330: 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a  as big-endian..*
4340: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4350: 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20 2a  d32bits(OsFile *
4360: 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29 7b 0a  fd, u32 *pRes){.
4370: 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69 6e 74    u32 res;.  int
4380: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
4390: 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20 26 72  te3OsRead(fd, &r
43a0: 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73 29 29  es, sizeof(res))
43b0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
43c0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 6e 73  TE_OK ){.    uns
43d0: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
43e0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61 63 2c  ;.    memcpy(ac,
43f0: 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20 20 72   &res, 4);.    r
4400: 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32 34 29  es = (ac[0]<<24)
4410: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
4420: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
4430: 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52 65 73  [3];.  }.  *pRes
4440: 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75 72 6e   = res;.  return
4450: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   rc;.}../*.** Wr
4460: 69 74 65 20 61 20 33 32 2d 62 69 74 20 69 6e 74  ite a 32-bit int
4470: 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20 67 69  eger into the gi
4480: 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70  ven file descrip
4490: 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  tor.  Return SQL
44a0: 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63  ITE_OK.** on suc
44b0: 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72 6f 72  cess or an error
44c0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
44d0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
44e0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69  /.static int wri
44f0: 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c 65 20  te32bits(OsFile 
4500: 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b 0a 20  *fd, u32 val){. 
4510: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4520: 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20  c[4];.  ac[0] = 
4530: 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66  (val>>24) & 0xff
4540: 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c  ;.  ac[1] = (val
4550: 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20  >>16) & 0xff;.  
4560: 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29  ac[2] = (val>>8)
4570: 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d   & 0xff;.  ac[3]
4580: 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 20   = val & 0xff;. 
4590: 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f   return sqlite3O
45a0: 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c 20 34  sWrite(fd, ac, 4
45b0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  );.}../*.** Writ
45c0: 65 20 74 68 65 20 33 32 2d 62 69 74 20 69 6e 74  e the 32-bit int
45d0: 65 67 65 72 20 27 76 61 6c 27 20 69 6e 74 6f 20  eger 'val' into 
45e0: 74 68 65 20 70 61 67 65 20 69 64 65 6e 74 69 66  the page identif
45f0: 69 65 64 20 62 79 20 70 61 67 65 20 68 65 61 64  ied by page head
4600: 65 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f 66 66  er.** 'p' at off
4610: 73 65 74 20 27 6f 66 66 73 65 74 27 2e 0a 2a 2f  set 'offset'..*/
4620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 74 6f  .static void sto
4630: 72 65 33 32 62 69 74 73 28 75 33 32 20 76 61 6c  re32bits(u32 val
4640: 2c 20 50 67 48 64 72 20 2a 70 2c 20 69 6e 74 20  , PgHdr *p, int 
4650: 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73 69 67  offset){.  unsig
4660: 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a 20 20  ned char *ac;.  
4670: 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e 65 64  ac = &((unsigned
4680: 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54 4f 5f   char*)PGHDR_TO_
4690: 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65 74 5d  DATA(p))[offset]
46a0: 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  ;.  ac[0] = (val
46b0: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
46c0: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
46d0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
46e0: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
46f0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
4700: 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a  al & 0xff;.}../*
4710: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
4720: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
4730: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
4740: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
4750: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
4760: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
4770: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
4780: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
4790: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
47a0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
47b0: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
47c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
47d0: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
47e0: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
47f0: 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c  rn (ac[0]<<24) |
4800: 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28   (ac[1]<<16) | (
4810: 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33  ac[2]<<8) | ac[3
4820: 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  ];.}.../*.** Con
4830: 76 65 72 74 20 74 68 65 20 62 69 74 73 20 69 6e  vert the bits in
4840: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72 72   the pPager->err
4850: 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61 70 70  Mask into an app
4860: 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74 75 72  roprate.** retur
4870: 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61 74 69  n code..*/.stati
4880: 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72 72 63  c int pager_errc
4890: 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ode(Pager *pPage
48a0: 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  r){.  int rc = S
48b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20  QLITE_OK;.  if( 
48c0: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
48d0: 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f 43 4b  & PAGER_ERR_LOCK
48e0: 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54   )    rc = SQLIT
48f0: 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66  E_PROTOCOL;.  if
4900: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4910: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 44 49  k & PAGER_ERR_DI
4920: 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  SK )    rc = SQL
4930: 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69 66 28  ITE_IOERR;.  if(
4940: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4950: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   & PAGER_ERR_FUL
4960: 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c 49  L )    rc = SQLI
4970: 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28 20 70  TE_FULL;.  if( p
4980: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
4990: 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 20 29   PAGER_ERR_MEM )
49a0: 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
49b0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20 70 50  _NOMEM;.  if( pP
49c0: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
49d0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
49e0: 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  T ) rc = SQLITE_
49f0: 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74 75 72  CORRUPT;.  retur
4a00: 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20  n rc;.}..#ifdef 
4a10: 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
4a20: 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  ES./*.** Return 
4a30: 61 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66  a 32-bit hash of
4a40: 20 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66   the page data f
4a50: 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61  or pPage..*/.sta
4a60: 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 70 61  tic u32 pager_pa
4a70: 67 65 68 61 73 68 28 50 67 48 64 72 20 2a 70 50  gehash(PgHdr *pP
4a80: 61 67 65 29 7b 0a 20 20 75 33 32 20 68 61 73 68  age){.  u32 hash
4a90: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
4aa0: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
4ab0: 70 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e 65  pData = (unsigne
4ac0: 64 20 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54  d char *)PGHDR_T
4ad0: 4f 5f 44 41 54 41 28 70 50 61 67 65 29 3b 0a 20  O_DATA(pPage);. 
4ae0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 67   for(i=0; i<pPag
4af0: 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61 67 65 53  e->pPager->pageS
4b00: 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  ize; i++){.    h
4b10: 61 73 68 20 3d 20 28 68 61 73 68 2b 69 29 5e 70  ash = (hash+i)^p
4b20: 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a 20 20 72  Data[i];.  }.  r
4b30: 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d 0a 0a 2f  eturn hash;.}../
4b40: 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b 5f 50  *.** The CHECK_P
4b50: 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65 73 20  AGE macro takes 
4b60: 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e 20 61  a PgHdr* as an a
4b70: 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51 4c 49  rgument. If SQLI
4b80: 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 2a  TE_CHECK_PAGES.*
4b90: 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20 61 6e  * is defined, an
4ba0: 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f 74 20  d NDEBUG is not 
4bb0: 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73 73 65  defined, an asse
4bc0: 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74 20 63  rt() statement c
4bd0: 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20 74 68  hecks.** that th
4be0: 65 20 70 61 67 65 20 69 73 20 65 69 74 68 65 72  e page is either
4bf0: 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c 6c 20   dirty or still 
4c00: 6d 61 74 63 68 65 73 20 74 68 65 20 63 61 6c 63  matches the calc
4c10: 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61 73 68  ulated page-hash
4c20: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43 48 45  ..*/.#define CHE
4c30: 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65 63 6b  CK_PAGE(x) check
4c40: 50 61 67 65 28 78 29 0a 73 74 61 74 69 63 20 76  Page(x).static v
4c50: 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28 50 67  oid checkPage(Pg
4c60: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
4c70: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
4c80: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73 73 65  ->pPager;.  asse
4c90: 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65 48 61  rt( !pPg->pageHa
4ca0: 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  sh || pPager->er
4cb0: 72 4d 61 73 6b 20 7c 7c 20 4d 45 4d 44 42 20 7c  rMask || MEMDB |
4cc0: 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c 7c 20  | pPg->dirty || 
4cd0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
4ce0: 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61 67 65  Hash==pager_page
4cf0: 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d 0a 0a  hash(pPg) );.}..
4d00: 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 43 48  #else.#define CH
4d10: 45 43 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64  ECK_PAGE(x).#end
4d20: 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  if../*.** When t
4d30: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68  his is called th
4d40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
4d50: 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72 20  or pager pPager 
4d60: 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a  must be open..**
4d70: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
4d80: 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73  nal file name is
4d90: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65   read from the e
4da0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61  nd of the file a
4db0: 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69  nd .** written i
4dc0: 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69  nto memory obtai
4dd0: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
4de0: 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74  alloc(). *pzMast
4df0: 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20  er is.** set to 
4e00: 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d  point at the mem
4e10: 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f  ory and SQLITE_O
4e20: 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20  K returned. The 
4e30: 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73  caller must.** s
4e40: 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d  qliteFree() *pzM
4e50: 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  aster..**.** If 
4e60: 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  no master journa
4e70: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70  l file name is p
4e80: 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72  resent *pzMaster
4e90: 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64   is set to 0 and
4ea0: 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65  .** SQLITE_OK re
4eb0: 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  turned..*/.stati
4ec0: 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72  c int readMaster
4ed0: 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a  Journal(OsFile *
4ee0: 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a  pJrnl, char **pz
4ef0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
4f00: 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20  c;.  u32 len;.  
4f10: 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63  i64 szJ;.  u32 c
4f20: 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  ksum;.  int i;. 
4f30: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
4f40: 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62  Magic[8]; /* A b
4f50: 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68  uffer to hold th
4f60: 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a  e magic header *
4f70: 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  /..  *pzMaster =
4f80: 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   0;..  rc = sqli
4f90: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a  te3OsFileSize(pJ
4fa0: 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66  rnl, &szJ);.  if
4fb0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4fc0: 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75  || szJ<16 ) retu
4fd0: 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  rn rc;..  rc = s
4fe0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72  qlite3OsSeek(pJr
4ff0: 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69  nl, szJ-16);.  i
5000: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5010: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a   ) return rc;. .
5020: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
5030: 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a  s(pJrnl, &len);.
5040: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5050: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5060: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
5070: 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75  its(pJrnl, &cksu
5080: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
5090: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
50a0: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
50b0: 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c  ite3OsRead(pJrnl
50c0: 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20  , aMagic, 8);.  
50d0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
50e0: 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67  K || memcmp(aMag
50f0: 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  ic, aJournalMagi
5100: 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20 72  c, 8) ) return r
5110: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
5120: 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20  e3OsSeek(pJrnl, 
5130: 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69  szJ-16-len);.  i
5140: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
5150: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
5160: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68   *pzMaster = (ch
5170: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
5180: 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20  c(len+1);.  if( 
5190: 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20  !*pzMaster ){.  
51a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
51b0: 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20  NOMEM;.  }.  rc 
51c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
51d0: 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72  pJrnl, *pzMaster
51e0: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
51f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
5200: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
5210: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
5220: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  zMaster = 0;.   
5230: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
5240: 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65  .  /* See if the
5250: 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65   checksum matche
5260: 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  s the master jou
5270: 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66  rnal name */.  f
5280: 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69  or(i=0; i<len; i
5290: 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d  ++){.    cksum -
52a0: 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d  = (*pzMaster)[i]
52b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75  ;.  }.  if( cksu
52c0: 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  m ){.    /* If t
52d0: 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73  he checksum does
52e0: 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e  n't add up, then
52f0: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20   one or more of 
5300: 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73  the disk sectors
5310: 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69  .    ** containi
5320: 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  ng the master jo
5330: 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69  urnal filename i
5340: 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69  s corrupted. Thi
5350: 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64  s means.    ** d
5360: 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62  efinitely roll b
5370: 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74  ack, so just ret
5380: 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e  urn SQLITE_OK an
5390: 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29  d report a (nul)
53a0: 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a  .    ** master-j
53b0: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e  ournal filename.
53c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69  .    */.    sqli
53d0: 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72  teFree(*pzMaster
53e0: 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72  );.    *pzMaster
53f0: 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
5400: 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c     (*pzMaster)[l
5410: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  en] = '\0';.  }.
5420: 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c     .  return SQL
5430: 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
5440: 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61   Seek the journa
5450: 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  l file descripto
5460: 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65  r to the next se
5470: 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68  ctor boundary wh
5480: 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  ere a.** journal
5490: 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20 72   header may be r
54a0: 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20  ead or written. 
54b0: 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66  Pager.journalOff
54c0: 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74 68   is updated with
54d0: 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b  .** the new seek
54e0: 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69   offset..**.** i
54f0: 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20  .e for a sector 
5500: 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a  size of 512:.**.
5510: 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20  ** Input Offset 
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75 74               Out
5530: 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d  put Offset.** --
5540: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5550: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5560: 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20  -----.** 0      
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20     0.** 512     
5590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55a0: 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20    512.** 100    
55b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55c0: 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20     512.** 2000  
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
55e0: 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a      2048.** .*/.
55f0: 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a  static int seekJ
5600: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5610: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
5620: 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36  offset = 0;.  i6
5630: 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  4 c = pPager->jo
5640: 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20  urnalOff;.  if( 
5650: 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20  c ){.    offset 
5660: 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c  = ((c-1)/JOURNAL
5670: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
5680: 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48  + 1) * JOURNAL_H
5690: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
56a0: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66   }.  assert( off
56b0: 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  set%JOURNAL_HDR_
56c0: 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b  SZ(pPager)==0 );
56d0: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
56e0: 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74  t>=c );.  assert
56f0: 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55  ( (offset-c)<JOU
5700: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
5710: 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d  er) );.  pPager-
5720: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66  >journalOff = of
5730: 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73  fset;.  return s
5740: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
5750: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
5760: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
5770: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75  }../*.** The jou
5780: 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62  rnal file must b
5790: 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73  e open when this
57a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
57b0: 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ed. A journal.**
57c0: 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c   header (JOURNAL
57d0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
57e0: 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
57f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
5800: 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e  at the.** curren
5810: 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a  t location..**.*
5820: 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f 72  * The format for
5830: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
5840: 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  der is as follow
5850: 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a  s:.** - 8 bytes:
5860: 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79 69   Magic identifyi
5870: 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  ng journal forma
5880: 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a  t..** - 4 bytes:
5890: 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72   Number of recor
58a0: 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f  ds in journal, o
58b0: 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  r -1 no-sync mod
58c0: 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20  e is on..** - 4 
58d0: 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75  bytes: Random nu
58e0: 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70 61  mber used for pa
58f0: 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20  ge hash..** - 4 
5900: 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20 64  bytes: Initial d
5910: 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f 75  atabase page cou
5920: 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  nt..** - 4 bytes
5930: 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75 73  : Sector size us
5940: 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65 73  ed by the proces
5950: 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68 69  s that wrote thi
5960: 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a  s journal..** .*
5970: 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a  * Followed by (J
5980: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20  OURNAL_HDR_SZ - 
5990: 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e 75  24) bytes of unu
59a0: 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74  sed space..*/.st
59b0: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a 6f  atic int writeJo
59c0: 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a  urnalHdr(Pager *
59d0: 70 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74 20  pPager){..  int 
59e0: 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c  rc = seekJournal
59f0: 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69  Hdr(pPager);.  i
5a00: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
5a10: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
5a20: 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65  urnalHdr = pPage
5a30: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20  r->journalOff;. 
5a40: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
5a50: 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20 20  tHdrOff==0 ){.  
5a60: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64    pPager->stmtHd
5a70: 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 6a  rOff = pPager->j
5a80: 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a 20  ournalHdr;.  }. 
5a90: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5aa0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
5ab0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a  DR_SZ(pPager);..
5ac0: 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20    /* FIX ME: .  
5ad0: 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79  **.  ** Possibly
5ae0: 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74   for a pager not
5af0: 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65   in no-sync mode
5b00: 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61  , the journal ma
5b10: 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20  gic should not. 
5b20: 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75   ** be written u
5b30: 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c  ntil nRec is fil
5b40: 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f  led in as part o
5b50: 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e  f next syncJourn
5b60: 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a  al(). .  **.  **
5b70: 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20   Actually maybe 
5b80: 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
5b90: 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20  l header should 
5ba0: 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c  be delayed until
5bb0: 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74   that.  ** point
5bc0: 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68  . Think about th
5bd0: 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  is..  */.  rc = 
5be0: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
5bf0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
5c00: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
5c10: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
5c20: 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ));..  if( rc==S
5c30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5c40: 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65 6c  /* The nRec Fiel
5c50: 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66 6f  d. 0xFFFFFFFF fo
5c60: 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e 61  r no-sync journa
5c70: 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20  ls. */.    rc = 
5c80: 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61  write32bits(&pPa
5c90: 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
5ca0: 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66 66  ->noSync ? 0xfff
5cb0: 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d 0a  fffff : 0);.  }.
5cc0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
5cd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
5ce0: 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68  e random check-h
5cf0: 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20  ash initialiser 
5d00: 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33 52  */ .    sqlite3R
5d10: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
5d20: 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e  (pPager->cksumIn
5d30: 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b  it), &pPager->ck
5d40: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72 63  sumInit);.    rc
5d50: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
5d60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5d70: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b  ger->cksumInit);
5d80: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53  .  }.  if( rc==S
5d90: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
5da0: 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20 64  /* The initial d
5db0: 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f 0a  atabase size */.
5dc0: 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32      rc = write32
5dd0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
5de0: 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  d, pPager->dbSiz
5df0: 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  e);.  }.  if( rc
5e00: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5e10: 20 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d 65     /* The assume
5e20: 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66 6f  d sector size fo
5e30: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 2a  r this process *
5e40: 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  /.    rc = write
5e50: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5e60: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65 63  jfd, pPager->sec
5e70: 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20  torSize);.  }.. 
5e80: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
5e90: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
5ea0: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
5eb0: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
5ec0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
5ed0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
5ee0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
5ef0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
5f00: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
5f10: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
5f20: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65  .    sqlite3OsSe
5f30: 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
5f40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5f50: 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20 3d  Off-1);.    rc =
5f60: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5f70: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c  &pPager->jfd, "\
5f80: 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20 20  000", 1);.  }.  
5f90: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
5fa0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
5fb0: 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70 65  file must be ope
5fc0: 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20 63  n when this is c
5fd0: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
5fe0: 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a 20   header file.** 
5ff0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
6000: 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20 66  bytes) is read f
6010: 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74 20  rom the current 
6020: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  location in the 
6030: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e  journal.** file.
6040: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61 62   See comments ab
6050: 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72 69  ove function wri
6060: 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 66  teJournalHdr() f
6070: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
6080: 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e   of.** the journ
6090: 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61 74  al header format
60a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 68  ..**.** If the h
60b0: 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73 75  eader is read su
60c0: 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52 65  ccessfully, *nRe
60d0: 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  c is set to the 
60e0: 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61 67  number of.** pag
60f0: 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f 77  e records follow
6100: 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72 20  ing this header 
6110: 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20 73  and *dbSize is s
6120: 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20 6f  et to the size o
6130: 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  f the.** databas
6140: 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72 61  e before the tra
6150: 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c 20  nsaction began, 
6160: 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c 20  in pages. Also, 
6170: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
6180: 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 74  t.** is set to t
6190: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
61a0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  om the journal h
61b0: 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f 4b  eader. SQLITE_OK
61c0: 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20   is returned.** 
61d0: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2a  in this case..**
61e0: 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
61f0: 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20 61  al header file a
6200: 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f 72  ppears to be cor
6210: 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f 44  rupted, SQLITE_D
6220: 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72 6e  ONE is.** return
6230: 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e 64  ed and *nRec and
6240: 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f 74   *dbSize are not
6250: 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e 41   set.  If JOURNA
6260: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a 2a  L_HDR_SZ bytes.*
6270: 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61 64  * cannot be read
6280: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6290: 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72 20  l file an error 
62a0: 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64  code is returned
62b0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
62c0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 0a  readJournalHdr(.
62d0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c    Pager *pPager,
62e0: 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 53   .  i64 journalS
62f0: 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52 65  ize,.  u32 *pNRe
6300: 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53 69  c, .  u32 *pDbSi
6310: 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ze.){.  int rc;.
6320: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
6330: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
6340: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
6350: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
6360: 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b 4a  */..  rc = seekJ
6370: 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
6380: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
6390: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
63a0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
63b0: 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  ff+JOURNAL_HDR_S
63c0: 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75 72  Z(pPager) > jour
63d0: 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  nalSize ){.    r
63e0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e  eturn SQLITE_DON
63f0: 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 73  E;.  }..  rc = s
6400: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
6410: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67 69  ager->jfd, aMagi
6420: 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63  c, sizeof(aMagic
6430: 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  ));.  if( rc ) r
6440: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
6450: 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c 20   memcmp(aMagic, 
6460: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
6470: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21 3d  izeof(aMagic))!=
6480: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
6490: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d  SQLITE_DONE;.  }
64a0: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
64b0: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
64c0: 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28 20  , pNRec);.  if( 
64d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
64e0: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
64f0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
6500: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
6510: 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nit);.  if( rc )
6520: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6530: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
6540: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62  pPager->jfd, pDb
6550: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20  Size);.  if( rc 
6560: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6570: 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73  /* Update the as
6580: 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a  sumed sector-siz
6590: 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76  e to match the v
65a0: 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20  alue used by .  
65b0: 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  ** the process t
65c0: 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73  hat created this
65d0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69   journal. If thi
65e0: 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20  s journal was.  
65f0: 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20  ** created by a 
6600: 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68  process other th
6610: 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65  an this one, the
6620: 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  n this routine. 
6630: 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c   ** is being cal
6640: 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20  led from within 
6650: 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
6660: 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75  . The local valu
6670: 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e  e.  ** of Pager.
6680: 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65  sectorSize is re
6690: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e  stored at the en
66a0: 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e  d of that routin
66b0: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  e..  */.  rc = r
66c0: 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67 65  ead32bits(&pPage
66d0: 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26  r->jfd, (u32 *)&
66e0: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
66f0: 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ze);.  if( rc ) 
6700: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
6710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
6720: 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f   += JOURNAL_HDR_
6730: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63  SZ(pPager);.  rc
6740: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
6750: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
6760: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6770: 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  f);.  return rc;
6780: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65  .}.../*.** Write
6790: 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d 61   the supplied ma
67a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
67b0: 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
67c0: 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65  al file for page
67d0: 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20 74  r.** pPager at t
67e0: 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74  he current locat
67f0: 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72 20  ion. The master 
6800: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73  journal name mus
6810: 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a  t be the last.**
6820: 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20 74   thing written t
6830: 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  o a journal file
6840: 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20 69  . If the pager i
6850: 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  s in full-sync m
6860: 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72  ode, the.** jour
6870: 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70  nal file descrip
6880: 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64 20  tor is advanced 
6890: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
68a0: 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66 6f  or boundary befo
68b0: 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69  re.** anything i
68c0: 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20 66  s written. The f
68d0: 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20  ormat is:.**.** 
68e0: 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45 52  + 4 bytes: PAGER
68f0: 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e  _MJ_PGNO..** + N
6900: 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f   bytes: length o
6910: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
6920: 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79   name..** + 4 by
6930: 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79  tes: N.** + 4 by
6940: 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72  tes: Master jour
6950: 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73 75  nal name checksu
6960: 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a  m..** + 8 bytes:
6970: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
6980: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
6990: 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20  er journal page 
69a0: 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65 20  checksum is the 
69b0: 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65 73  sum of the bytes
69c0: 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a 2a   in the master.*
69d0: 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a  * journal name..
69e0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72  */.static int wr
69f0: 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  iteMasterJournal
6a00: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
6a10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73  const char *zMas
6a20: 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ter){.  int rc;.
6a30: 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69 6e    int len; .  in
6a40: 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73 75  t i; .  u32 cksu
6a50: 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20 21  m = 0; ..  if( !
6a60: 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67 65  zMaster || pPage
6a70: 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72 65  r->setMaster) re
6a80: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
6a90: 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
6aa0: 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20  ter = 1;..  len 
6ab0: 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72  = strlen(zMaster
6ac0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
6ad0: 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63  len; i++){.    c
6ae0: 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b  ksum += zMaster[
6af0: 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  i];.  }..  /* If
6b00: 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f   in full-sync mo
6b10: 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20 74  de, advance to t
6b20: 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65 63  he next disk sec
6b30: 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74 69  tor before writi
6b40: 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73 74  ng.  ** the mast
6b50: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  er journal name.
6b60: 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73 65   This is in case
6b70: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70 61   the previous pa
6b80: 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20 20  ge written to.  
6b90: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
6ba0: 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
6bb0: 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  synced..  */.  i
6bc0: 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  f( pPager->fullS
6bd0: 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ync ){.    rc = 
6be0: 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70  seekJournalHdr(p
6bf0: 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
6c00: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6c10: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20  return rc;.  }. 
6c20: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
6c30: 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b  Off += (len+20);
6c40: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6c50: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
6c60: 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  d, PAGER_MJ_PGNO
6c70: 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28  (pPager));.  if(
6c80: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6c90: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6ca0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
6cb0: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
6cc0: 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a   zMaster, len);.
6cd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6ce0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6cf0: 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33 32  ..  rc = write32
6d00: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
6d10: 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  d, len);.  if( r
6d20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
6d30: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
6d40: 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70  = write32bits(&p
6d50: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73 75  Pager->jfd, cksu
6d60: 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  m);.  if( rc!=SQ
6d70: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
6d80: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6d90: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
6da0: 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e  ger->jfd, aJourn
6db0: 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28  alMagic, sizeof(
6dc0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b  aJournalMagic));
6dd0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
6de0: 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  ync = 1;.  retur
6df0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  n rc;.}../*.** A
6e00: 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20 70  dd or remove a p
6e10: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69 73  age from the lis
6e20: 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 74  t of all pages t
6e30: 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a 2a  hat are in the.*
6e40: 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  * statement jour
6e50: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50  nal..**.** The P
6e60: 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65 70  ager keeps a sep
6e70: 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70 61  arate list of pa
6e80: 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75 72  ges that are cur
6e90: 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65  rently in.** the
6ea0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6eb0: 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73 20  al.  This helps 
6ec0: 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65 72  the sqlite3pager
6ed0: 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a  _stmt_commit().*
6ee0: 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d 55  * routine run MU
6ef0: 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74 68  CH faster for th
6f00: 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68  e common case wh
6f10: 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d 61  ere there are ma
6f20: 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20 6d  ny.** pages in m
6f30: 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20 61  emory but only a
6f40: 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65 20   few are in the 
6f50: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
6f60: 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  l..*/.static voi
6f70: 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74  d page_add_to_st
6f80: 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70  mt_list(PgHdr *p
6f90: 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  Pg){.  Pager *pP
6fa0: 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
6fb0: 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69  er;.  if( pPg->i
6fc0: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
6fd0: 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70    assert( pPg->p
6fe0: 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70  PrevStmt==0 && p
6ff0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 30  Pg->pNextStmt==0
7000: 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76   );.  pPg->pPrev
7010: 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
7020: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b  pPager->pStmt ){
7030: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
7040: 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20  mt->pPrevStmt = 
7050: 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  pPg;.  }.  pPg->
7060: 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61 67  pNextStmt = pPag
7070: 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50 61  er->pStmt;.  pPa
7080: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67  ger->pStmt = pPg
7090: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
70a0: 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  = 1;.}.static vo
70b0: 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66  id page_remove_f
70c0: 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67  rom_stmt_list(Pg
70d0: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28  Hdr *pPg){.  if(
70e0: 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20   !pPg->inStmt ) 
70f0: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
7100: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b 0a  g->pPrevStmt ){.
7110: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
7120: 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78  >pPrevStmt->pNex
7130: 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  tStmt==pPg );.  
7140: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
7150: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50  ->pNextStmt = pP
7160: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20 20  g->pNextStmt;.  
7170: 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72  }else{.    asser
7180: 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e  t( pPg->pPager->
7190: 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20  pStmt==pPg );.  
71a0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
71b0: 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Stmt = pPg->pNex
71c0: 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66 28  tStmt;.  }.  if(
71d0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20   pPg->pNextStmt 
71e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
71f0: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70  Pg->pNextStmt->p
7200: 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29 3b  PrevStmt==pPg );
7210: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 53  .    pPg->pNextS
7220: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
7230: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 3b   pPg->pPrevStmt;
7240: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
7250: 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67  tStmt = 0;.  pPg
7260: 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30 3b  ->pPrevStmt = 0;
7270: 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d  .  pPg->inStmt =
7280: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e   0;.}../*.** Fin
7290: 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
72a0: 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65 6e  hash table given
72b0: 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65 72   its page number
72c0: 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20 70  .  Return.** a p
72d0: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
72e0: 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e 6f  ge or NULL if no
72f0: 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74  t found..*/.stat
7300: 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f  ic PgHdr *pager_
7310: 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70 50  lookup(Pager *pP
7320: 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
7330: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70  {.  PgHdr *p = p
7340: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
7350: 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b 0a  er_hash(pgno)];.
7360: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
7370: 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20  >pgno!=pgno ){. 
7380: 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 48     p = p->pNextH
7390: 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ash;.  }.  retur
73a0: 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e  n p;.}../*.** Un
73b0: 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61 73  lock the databas
73c0: 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65 20  e and clear the 
73d0: 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
73e0: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a    This routine.*
73f0: 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74 65  * sets the state
7400: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62 61   of the pager ba
7410: 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77 61  ck to what it wa
7420: 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66 69  s when it was fi
7430: 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20 20  rst.** opened.  
7440: 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67 20  Any outstanding 
7450: 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69  pages are invali
7460: 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65 71  dated and subseq
7470: 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a 2a  uent attempts.**
7480: 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73 65   to access those
7490: 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b 65   pages will like
74a0: 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63  ly result in a c
74b0: 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74  oredump..*/.stat
74c0: 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65  ic void pager_re
74d0: 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  set(Pager *pPage
74e0: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
74f0: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 69 66 28 20  , *pNext;.  if( 
7500: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
7510: 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28  ) return;.  for(
7520: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
7530: 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
7540: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
7550: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
7560: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 67    sqliteFree(pPg
7570: 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  );.  }.  pPager-
7580: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
7590: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
75a0: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
75b0: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
75c0: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 30  pPager->pAll = 0
75d0: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
75e0: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
75f0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
7600: 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  h));.  pPager->n
7610: 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28 20  Page = 0;.  if( 
7620: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
7630: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
7640: 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
7650: 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
7660: 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  r);.  }.  sqlite
7670: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
7680: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
7690: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
76a0: 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
76b0: 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
76c0: 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65 72  e = -1;.  pPager
76d0: 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61 73  ->nRef = 0;.  as
76e0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
76f0: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
7700: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
7710: 6e 63 74 69 6f 6e 20 69 73 20 75 73 65 64 20 74  nction is used t
7720: 6f 20 72 65 73 65 74 20 74 68 65 20 70 61 67 65  o reset the page
7730: 72 20 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f 63  r after a malloc
7740: 28 29 20 66 61 69 6c 75 72 65 2e 20 54 68 69 73  () failure. This
7750: 0a 2a 2a 20 64 6f 65 73 6e 27 74 20 77 6f 72 6b  .** doesn't work
7760: 20 77 69 74 68 20 69 6e 2d 6d 65 6d 6f 72 79 20   with in-memory 
7770: 64 61 74 61 62 61 73 65 73 2e 20 49 66 20 61 20  databases. If a 
7780: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 73 20 77  malloc() fails w
7790: 68 65 6e 20 61 6e 20 0a 2a 2a 20 69 6e 2d 6d 65  hen an .** in-me
77a0: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69 73  mory database is
77b0: 20 69 6e 20 75 73 65 20 69 74 20 69 73 20 6e 6f   in use it is no
77c0: 74 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 72 65  t possible to re
77d0: 63 6f 76 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  cover..**.** If 
77e0: 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6f 72  a transaction or
77f0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
7800: 61 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65  action is active
7810: 2c 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  , it is rolled b
7820: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 74 20 69 73  ack..**.** It is
7830: 20 61 6e 20 65 72 72 6f 72 20 74 6f 20 63 61 6c   an error to cal
7840: 6c 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  l this function 
7850: 69 66 20 61 6e 79 20 70 61 67 65 73 20 61 72 65  if any pages are
7860: 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 23 69 66 6e   in use..*/.#ifn
7870: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7880: 47 4c 4f 42 41 4c 52 45 43 4f 56 45 52 0a 69 6e  GLOBALRECOVER.in
7890: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  t sqlite3pager_r
78a0: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
78b0: 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
78c0: 72 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61  r ){.    if( pPa
78d0: 67 65 72 2d 3e 6e 52 65 66 20 7c 7c 20 4d 45 4d  ger->nRef || MEM
78e0: 44 42 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  DB ){.      retu
78f0: 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
7900: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
7910: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 3d 20 7e 28  r->errMask &= ~(
7920: 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 29 3b 0a  PAGER_ERR_MEM);.
7930: 20 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28      pager_reset(
7940: 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 72  pPager);.  }.  r
7950: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
7960: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a  .}.#endif.../*.*
7970: 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74  * When this rout
7980: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74  ine is called, t
7990: 68 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65  he pager has the
79a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70   journal file op
79b0: 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45  en and.** a RESE
79c0: 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
79d0: 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
79e0: 74 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f  tabase.  This ro
79f0: 75 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a  utine releases.*
7a00: 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c  * the database l
7a10: 6f 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73  ock and acquires
7a20: 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69   a SHARED lock i
7a30: 6e 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68  n its place.  Th
7a40: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
7a50: 65 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64  e is deleted and
7a60: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54   closed..**.** T
7a70: 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65  ODO: Consider ke
7a80: 65 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61  eping the journa
7a90: 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20  l file open for 
7aa0: 74 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61  temporary databa
7ab0: 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67  ses..** This mig
7ac0: 68 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72  ht give a perfor
7ad0: 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e  mance improvemen
7ae0: 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65  t on windows whe
7af0: 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20  re opening.** a 
7b00: 66 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e  file is an expen
7b10: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  sive operation..
7b20: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
7b30: 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28  ger_unwritelock(
7b40: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7b50: 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
7b60: 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
7b70: 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66  ( !MEMDB );.  if
7b80: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c  ( pPager->state<
7b90: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7ba0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
7bb0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71  ITE_OK;.  }.  sq
7bc0: 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
7bd0: 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
7be0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
7bf0: 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
7c00: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
7c10: 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20  ager->stfd);.   
7c20: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
7c30: 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  n = 0;.  }.  if(
7c40: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7c50: 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69  Open ){.    sqli
7c60: 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67  te3OsClose(&pPag
7c70: 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50  er->jfd);.    pP
7c80: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
7c90: 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  n = 0;.    sqlit
7ca0: 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65  e3OsDelete(pPage
7cb0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  r->zJournal);.  
7cc0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50    sqliteFree( pP
7cd0: 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
7ce0: 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
7cf0: 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  aInJournal = 0;.
7d00: 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
7d10: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
7d20: 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
7d30: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  ){.      pPg->in
7d40: 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
7d50: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
7d60: 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  0;.      pPg->ne
7d70: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 23 69 66 64  edSync = 0;.#ifd
7d80: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
7d90: 50 41 47 45 53 0a 20 20 20 20 20 20 70 50 67 2d  PAGES.      pPg-
7da0: 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
7db0: 72 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b  r_pagehash(pPg);
7dc0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20  .#endif.    }.  
7dd0: 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43    pPager->dirtyC
7de0: 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 70 50  ache = 0;.    pP
7df0: 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a  ager->nRec = 0;.
7e00: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
7e10: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72  ert( pPager->dir
7e20: 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50  tyCache==0 || pP
7e30: 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
7e40: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 72 63 20  ==0 );.  }.  rc 
7e50: 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63  = sqlite3OsUnloc
7e60: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53  k(&pPager->fd, S
7e70: 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70  HARED_LOCK);.  p
7e80: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7e90: 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 70  AGER_SHARED;.  p
7ea0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
7eb0: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
7ec0: 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a  >setMaster = 0;.
7ed0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
7ee0: 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 6e  /*.** Compute an
7ef0: 64 20 72 65 74 75 72 6e 20 61 20 63 68 65 63 6b  d return a check
7f00: 73 75 6d 20 66 6f 72 20 74 68 65 20 70 61 67 65  sum for the page
7f10: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20   of data..**.** 
7f20: 54 68 69 73 20 69 73 20 6e 6f 74 20 61 20 72 65  This is not a re
7f30: 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20 20 49 74  al checksum.  It
7f40: 20 69 73 20 72 65 61 6c 6c 79 20 6a 75 73 74 20   is really just 
7f50: 74 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 0a  the sum of the .
7f60: 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61  ** random initia
7f70: 6c 20 76 61 6c 75 65 20 61 6e 64 20 74 68 65 20  l value and the 
7f80: 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 57 65  page number.  We
7f90: 20 65 78 70 65 72 69 6d 65 6e 74 65 64 20 77 69   experimented wi
7fa0: 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b 73 75 6d  th.** a checksum
7fb0: 20 6f 66 20 74 68 65 20 65 6e 74 69 72 65 20 64   of the entire d
7fc0: 61 74 61 2c 20 62 75 74 20 74 68 61 74 20 77 61  ata, but that wa
7fd0: 73 20 66 6f 75 6e 64 20 74 6f 20 62 65 20 74 6f  s found to be to
7fe0: 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f  o slow..**.** No
7ff0: 74 65 20 74 68 61 74 20 74 68 65 20 70 61 67 65  te that the page
8000: 20 6e 75 6d 62 65 72 20 69 73 20 73 74 6f 72 65   number is store
8010: 64 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69  d at the beginni
8020: 6e 67 20 6f 66 20 64 61 74 61 20 61 6e 64 0a 2a  ng of data and.*
8030: 2a 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 69  * the checksum i
8040: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
8050: 65 6e 64 2e 20 20 54 68 69 73 20 69 73 20 69 6d  end.  This is im
8060: 70 6f 72 74 61 6e 74 2e 20 20 49 66 20 6a 6f 75  portant.  If jou
8070: 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75 70 74 69  rnal.** corrupti
8080: 6f 6e 20 6f 63 63 75 72 73 20 64 75 65 20 74 6f  on occurs due to
8090: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
80a0: 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69 6b 65 6c  , the most likel
80b0: 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a 20 69 73  y scenario.** is
80c0: 20 74 68 61 74 20 6f 6e 65 20 65 6e 64 20 6f 72   that one end or
80d0: 20 74 68 65 20 6f 74 68 65 72 20 6f 66 20 74 68   the other of th
80e0: 65 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  e record will be
80f0: 20 63 68 61 6e 67 65 64 2e 20 20 49 74 20 69 73   changed.  It is
8100: 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73 20 6c 69  .** much less li
8110: 6b 65 6c 79 20 74 68 61 74 20 74 68 65 20 74 77  kely that the tw
8120: 6f 20 65 6e 64 73 20 6f 66 20 74 68 65 20 6a 6f  o ends of the jo
8130: 75 72 6e 61 6c 20 72 65 63 6f 72 64 20 77 69 6c  urnal record wil
8140: 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65 63 74 20  l be.** correct 
8150: 61 6e 64 20 74 68 65 20 6d 69 64 64 6c 65 20 62  and the middle b
8160: 65 20 63 6f 72 72 75 70 74 2e 20 20 54 68 75 73  e corrupt.  Thus
8170: 2c 20 74 68 69 73 20 22 63 68 65 63 6b 73 75 6d  , this "checksum
8180: 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f  " scheme,.** tho
8190: 75 67 68 20 66 61 73 74 20 61 6e 64 20 73 69 6d  ugh fast and sim
81a0: 70 6c 65 2c 20 63 61 74 63 68 65 73 20 74 68 65  ple, catches the
81b0: 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c 79 20 6b   mostly likely k
81c0: 69 6e 64 20 6f 66 20 63 6f 72 72 75 70 74 69 6f  ind of corruptio
81d0: 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a  n..**.** FIX ME:
81e0: 20 20 43 6f 6e 73 69 64 65 72 20 61 64 64 69 6e    Consider addin
81f0: 67 20 65 76 65 72 79 20 32 30 30 74 68 20 28 6f  g every 200th (o
8200: 72 20 73 6f 29 20 62 79 74 65 20 6f 66 20 74 68  r so) byte of th
8210: 65 20 64 61 74 61 20 74 6f 20 74 68 65 0a 2a 2a  e data to the.**
8220: 20 63 68 65 63 6b 73 75 6d 2e 20 20 54 68 61 74   checksum.  That
8230: 20 77 61 79 20 69 66 20 61 20 73 69 6e 67 6c 65   way if a single
8240: 20 70 61 67 65 20 73 70 61 6e 73 20 33 20 6f 72   page spans 3 or
8250: 20 6d 6f 72 65 20 64 69 73 6b 20 73 65 63 74 6f   more disk secto
8260: 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74  rs and.** only t
8270: 68 65 20 6d 69 64 64 6c 65 20 73 65 63 74 6f 72  he middle sector
8280: 20 69 73 20 63 6f 72 72 75 70 74 2c 20 77 65 20   is corrupt, we 
8290: 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61 76 65 20  will still have 
82a0: 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20  a reasonable.** 
82b0: 63 68 61 6e 63 65 20 6f 66 20 66 61 69 6c 69 6e  chance of failin
82c0: 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 61  g the checksum a
82d0: 6e 64 20 74 68 75 73 20 64 65 74 65 63 74 69 6e  nd thus detectin
82e0: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a  g the problem..*
82f0: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 70 61 67  /.static u32 pag
8300: 65 72 5f 63 6b 73 75 6d 28 50 61 67 65 72 20 2a  er_cksum(Pager *
8310: 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
8320: 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  o, const char *a
8330: 44 61 74 61 29 7b 0a 20 20 75 33 32 20 63 6b 73  Data){.  u32 cks
8340: 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73  um = pPager->cks
8350: 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74 20 69 20  umInit;.  int i 
8360: 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  = pPager->pageSi
8370: 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69 6c 65 28  ze-200;.  while(
8380: 20 69 3e 30 20 29 7b 0a 20 20 20 20 63 6b 73 75   i>0 ){.    cksu
8390: 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d 3b 0a 20  m += aData[i];. 
83a0: 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a 20 20 7d     i -= 200;.  }
83b0: 0a 20 20 72 65 74 75 72 6e 20 63 6b 73 75 6d 3b  .  return cksum;
83c0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61  .}../*.** Read a
83d0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66 72 6f   single page fro
83e0: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
83f0: 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66 69 6c  le opened on fil
8400: 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a 2a 20  e descriptor.** 
8410: 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b 20 74  jfd.  Playback t
8420: 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a  his one page..**
8430: 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75 6d 3d  .** If useCksum=
8440: 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68 69 73  =0 it means this
8450: 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20 6e 6f   journal does no
8460: 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d 73 2e  t use checksums.
8470: 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a 20 61    Checksums.** a
8480: 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e 20 73  re not used in s
8490: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
84a0: 73 20 62 65 63 61 75 73 65 20 73 74 61 74 65 6d  s because statem
84b0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64 6f 20  ent journals do 
84c0: 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f 20 73  not.** need to s
84d0: 75 72 76 69 76 65 20 70 6f 77 65 72 20 66 61 69  urvive power fai
84e0: 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  lures..*/.static
84f0: 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62   int pager_playb
8500: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50 61 67  ack_one_page(Pag
8510: 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73 46 69  er *pPager, OsFi
8520: 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75 73 65  le *jfd, int use
8530: 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20 72 63  Cksum){.  int rc
8540: 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 20  ;.  PgHdr *pPg; 
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8560: 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69 6e 67    /* An existing
8570: 20 70 61 67 65 20 69 6e 20 74 68 65 20 63 61 63   page in the cac
8580: 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67 6e  he */.  Pgno pgn
8590: 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  o;              
85a0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67        /* The pag
85b0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20 70 61  e number of a pa
85c0: 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f  ge in journal */
85d0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20 20 20  .  u32 cksum;   
85e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
85f0: 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75 73 65   /* Checksum use
8600: 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63 68 65  d for sanity che
8610: 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20 61 44  cking */.  u8 aD
8620: 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ata[SQLITE_MAX_P
8630: 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f 2a 20 54  AGE_SIZE];  /* T
8640: 65 6d 70 20 73 74 6f 72 61 67 65 20 66 6f 72 20  emp storage for 
8650: 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20 2f 2a 20  a page */..  /* 
8660: 75 73 65 43 6b 73 75 6d 20 73 68 6f 75 6c 64 20  useCksum should 
8670: 62 65 20 74 72 75 65 20 66 6f 72 20 74 68 65 20  be true for the 
8680: 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  main journal and
8690: 20 66 61 6c 73 65 20 66 6f 72 0a 20 20 2a 2a 20   false for.  ** 
86a0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
86b0: 6c 73 2e 20 20 56 65 72 69 66 79 20 74 68 61 74  ls.  Verify that
86c0: 20 74 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   this is always 
86d0: 74 68 65 20 63 61 73 65 0a 20 20 2a 2f 0a 20 20  the case.  */.  
86e0: 61 73 73 65 72 74 28 20 6a 66 64 20 3d 3d 20 28  assert( jfd == (
86f0: 75 73 65 43 6b 73 75 6d 20 3f 20 26 70 50 61 67  useCksum ? &pPag
8700: 65 72 2d 3e 6a 66 64 20 3a 20 26 70 50 61 67 65  er->jfd : &pPage
8710: 72 2d 3e 73 74 66 64 29 20 29 3b 0a 0a 0a 20 20  r->stfd) );...  
8720: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
8730: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
8740: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
8750: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
8760: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
8770: 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20  ad(jfd, &aData, 
8780: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8790: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
87a0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
87b0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
87c0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
87d0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
87e0: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
87f0: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
8800: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
8810: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
8820: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
8830: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
8840: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
8850: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
8860: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
8870: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
8880: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
8890: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
88a0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
88b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
88c0: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
88d0: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
88e0: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
88f0: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
8900: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
8910: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
8920: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
8930: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
8940: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8950: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
8960: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
8970: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
8980: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
8990: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
89a0: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
89b0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
89c0: 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75  2bits(jfd, &cksu
89d0: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
89e0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
89f0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8a00: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
8a10: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
8a20: 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  ger, pgno, aData
8a30: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
8a40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8a50: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
8a60: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
8a70: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
8a80: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
8a90: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
8aa0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
8ab0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
8ac0: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
8ad0: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
8ae0: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
8af0: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
8b00: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
8b10: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
8b20: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
8b30: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
8b40: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
8b50: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
8b60: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
8b70: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
8b80: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
8b90: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
8ba0: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
8bb0: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
8bc0: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
8bd0: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
8be0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
8bf0: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
8c00: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
8c10: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 54 69 63 6b 65  .  **.  ** Ticke
8c20: 74 20 23 31 31 37 31 3a 20 20 54 68 65 20 73 74  t #1171:  The st
8c30: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
8c40: 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e 20 70 61  might contain pa
8c50: 67 65 20 63 6f 6e 74 65 6e 74 20 74 68 61 74 20  ge content that 
8c60: 69 73 0a 20 20 2a 2a 20 64 69 66 66 65 72 65 6e  is.  ** differen
8c70: 74 20 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20  t from the page 
8c80: 63 6f 6e 74 65 6e 74 20 61 74 20 74 68 65 20 73  content at the s
8c90: 74 61 72 74 20 6f 66 20 74 68 65 20 74 72 61 6e  tart of the tran
8ca0: 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68  saction..  ** Th
8cb0: 69 73 20 6f 63 63 75 72 73 20 77 68 65 6e 20 61  is occurs when a
8cc0: 20 70 61 67 65 20 69 73 20 63 68 61 6e 67 65 64   page is changed
8cd0: 20 70 72 69 6f 72 20 74 6f 20 74 68 65 20 73 74   prior to the st
8ce0: 61 72 74 20 6f 66 20 61 20 73 74 61 74 65 6d 65  art of a stateme
8cf0: 6e 74 0a 20 20 2a 2a 20 74 68 65 6e 20 63 68 61  nt.  ** then cha
8d00: 6e 67 65 64 20 61 67 61 69 6e 20 77 69 74 68 69  nged again withi
8d10: 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2e  n the statement.
8d20: 20 20 57 68 65 6e 20 72 6f 6c 6c 69 6e 67 20 62    When rolling b
8d30: 61 63 6b 20 73 75 63 68 20 61 0a 20 20 2a 2a 20  ack such a.  ** 
8d40: 73 74 61 74 65 6d 65 6e 74 20 77 65 20 6d 75 73  statement we mus
8d50: 74 20 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 74  t not write to t
8d60: 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  he original data
8d70: 62 61 73 65 20 75 6e 6c 65 73 73 20 77 65 20 6b  base unless we k
8d80: 6e 6f 77 0a 20 20 2a 2a 20 66 6f 72 20 63 65 72  now.  ** for cer
8d90: 74 61 69 6e 20 74 68 61 74 20 6f 72 69 67 69 6e  tain that origin
8da0: 61 6c 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 73  al page contents
8db0: 20 61 72 65 20 69 6e 20 74 68 65 20 6d 61 69 6e   are in the main
8dc0: 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 6a   rollback.  ** j
8dd0: 6f 75 72 6e 61 6c 2e 20 20 4f 74 68 65 72 77 69  ournal.  Otherwi
8de0: 73 65 2c 20 69 66 20 61 20 66 75 6c 6c 20 52 4f  se, if a full RO
8df0: 4c 4c 42 41 43 4b 20 6f 63 63 75 72 73 20 61 66  LLBACK occurs af
8e00: 74 65 72 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ter the statemen
8e10: 74 0a 20 20 2a 2a 20 72 6f 6c 6c 62 61 63 6b 20  t.  ** rollback 
8e20: 74 68 65 20 66 75 6c 6c 20 52 4f 4c 4c 42 41 43  the full ROLLBAC
8e30: 4b 20 77 69 6c 6c 20 6e 6f 74 20 72 65 73 74 6f  K will not resto
8e40: 72 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 69  re the page to i
8e50: 74 73 20 6f 72 69 67 69 6e 61 6c 0a 20 20 2a 2a  ts original.  **
8e60: 20 63 6f 6e 74 65 6e 74 2e 20 20 54 77 6f 20 63   content.  Two c
8e70: 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74 20 62  onditions must b
8e80: 65 20 6d 65 74 20 62 65 66 6f 72 65 20 77 72 69  e met before wri
8e90: 74 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  ting to the data
8ea0: 62 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 2e  base.  ** files.
8eb0: 20 28 31 29 20 74 68 65 20 64 61 74 61 62 61 73   (1) the databas
8ec0: 65 20 6d 75 73 74 20 62 65 20 6c 6f 63 6b 65 64  e must be locked
8ed0: 2e 20 20 28 32 29 20 77 65 20 6b 6e 6f 77 20 74  .  (2) we know t
8ee0: 68 61 74 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  hat the original
8ef0: 0a 20 20 2a 2a 20 70 61 67 65 20 63 6f 6e 74 65  .  ** page conte
8f00: 6e 74 20 69 73 20 69 6e 20 74 68 65 20 6d 61 69  nt is in the mai
8f10: 6e 20 6a 6f 75 72 6e 61 6c 20 65 69 74 68 65 72  n journal either
8f20: 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
8f30: 65 20 69 73 20 6e 6f 74 20 69 6e 0a 20 20 2a 2a  e is not in.  **
8f40: 20 63 61 63 68 65 20 6f 72 20 65 6c 73 65 20 69   cache or else i
8f50: 74 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 6e  t is marked as n
8f60: 65 65 64 53 79 6e 63 3d 3d 30 2e 0a 20 20 2a 2f  eedSync==0..  */
8f70: 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c  .  pPg = pager_l
8f80: 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
8f90: 6e 6f 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  no);.  assert( p
8fa0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
8fb0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c  GER_EXCLUSIVE ||
8fc0: 20 70 50 67 21 3d 30 20 29 3b 0a 20 20 54 52 41   pPg!=0 );.  TRA
8fd0: 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20 25 64  CE3("PLAYBACK %d
8fe0: 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
8ff0: 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 67  ERID(pPager), pg
9000: 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  no);.  if( pPage
9010: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9020: 45 58 43 4c 55 53 49 56 45 20 26 26 20 28 70 50  EXCLUSIVE && (pP
9030: 67 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 6e 65 65  g==0 || pPg->nee
9040: 64 53 79 6e 63 3d 3d 30 29 20 29 7b 0a 20 20 20  dSync==0) ){.   
9050: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
9060: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
9070: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
9080: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9090: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
90a0: 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
90b0: 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d  , aData, pPager-
90c0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
90d0: 69 66 28 20 70 50 67 20 29 20 70 50 67 2d 3e 64  if( pPg ) pPg->d
90e0: 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
90f0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 2f  if( pPg ){.    /
9100: 2a 20 4e 6f 20 70 61 67 65 20 73 68 6f 75 6c 64  * No page should
9110: 20 65 76 65 72 20 62 65 20 65 78 70 6c 69 63 69   ever be explici
9120: 74 6c 79 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20  tly rolled back 
9130: 74 68 61 74 20 69 73 20 69 6e 20 75 73 65 2c 20  that is in use, 
9140: 65 78 63 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f  except.    ** fo
9150: 72 20 70 61 67 65 20 31 20 77 68 69 63 68 20 69  r page 1 which i
9160: 73 20 68 65 6c 64 20 69 6e 20 75 73 65 20 69 6e  s held in use in
9170: 20 6f 72 64 65 72 20 74 6f 20 6b 65 65 70 20 74   order to keep t
9180: 68 65 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  he lock on the. 
9190: 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 61     ** database a
91a0: 63 74 69 76 65 2e 20 48 6f 77 65 76 65 72 20 73  ctive. However s
91b0: 75 63 68 20 61 20 70 61 67 65 20 6d 61 79 20 62  uch a page may b
91c0: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73  e rolled back as
91d0: 20 61 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a   a result.    **
91e0: 20 6f 66 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20   of an internal 
91f0: 65 72 72 6f 72 20 72 65 73 75 6c 74 69 6e 67 20  error resulting 
9200: 69 6e 20 61 6e 20 61 75 74 6f 6d 61 74 69 63 20  in an automatic 
9210: 63 61 6c 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73  call to.    ** s
9220: 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
9230: 62 61 63 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  back()..    */. 
9240: 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a     void *pData;.
9250: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 70      /* assert( p
9260: 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70  Pg->nRef==0 || p
9270: 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a  Pg->pgno==1 ); *
9280: 2f 0a 20 20 20 20 70 44 61 74 61 20 3d 20 50 47  /.    pData = PG
9290: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
92a0: 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 44 61  ;.    memcpy(pDa
92b0: 74 61 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  ta, aData, pPage
92c0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
92d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
92e0: 65 73 74 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a  estructor ){  /*
92f0: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 53 68 6f 75  ** FIX ME:  Shou
9300: 6c 64 20 74 68 69 73 20 62 65 20 78 52 65 69 6e  ld this be xRein
9310: 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70  it? ***/.      p
9320: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
9330: 6f 72 28 70 44 61 74 61 2c 20 70 50 61 67 65 72  or(pData, pPager
9340: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9350: 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
9360: 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
9370: 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d   pPg->pageHash =
9380: 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68 28   pager_pagehash(
9390: 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  pPg);.#endif.   
93a0: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
93b0: 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
93c0: 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   3);.  }.  retur
93d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
93e0: 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74 65 72  arameter zMaster
93f0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
9400: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
9410: 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c 65 20   file. A single 
9420: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20  journal.** file 
9430: 74 68 61 74 20 72 65 66 65 72 72 65 64 20 74 6f  that referred to
9440: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9450: 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a 75 73  nal file has jus
9460: 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20 62 61  t been rolled ba
9470: 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ck..** This rout
9480: 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20 69 74  ine checks if it
9490: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f 20   is possible to 
94a0: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
94b0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 0a  r journal file,.
94c0: 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f 20 69  ** and does so i
94d0: 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54  f it is..**.** T
94e0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
94f0: 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20  l file contains 
9500: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c  the names of all
9510: 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e   child journals.
9520: 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66 20 61  .** To tell if a
9530: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
9540: 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2c 20  can be deleted, 
9550: 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20 6f 66  check to each of
9560: 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72 65 6e   the.** children
9570: 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c 64 72  .  If all childr
9580: 65 6e 20 61 72 65 20 65 69 74 68 65 72 20 6d 69  en are either mi
9590: 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f 74 20  ssing or do not 
95a0: 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20 64 69  refer to.** a di
95b0: 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72 20 6a  fferent master j
95c0: 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74 68 69  ournal, then thi
95d0: 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  s master journal
95e0: 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64 2e   can be deleted.
95f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
9600: 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 63  ager_delmaster(c
9610: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
9620: 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
9630: 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70 65 6e   int master_open
9640: 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65 20 6d   = 0;.  OsFile m
9650: 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a  aster;.  char *z
9660: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
9670: 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73 20 6f  0; /* Contents o
9680: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
9690: 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6e   file */.  i64 n
96a0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 20 20  MasterJournal;  
96b0: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
96c0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
96d0: 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65  ile */..  /* Ope
96e0: 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  n the master jou
96f0: 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c 75 73  rnal file exclus
9700: 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20 73 6f  ively in case so
9710: 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
9720: 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69 6e 67  .  ** is running
9730: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   this routine al
9740: 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69 74 20  so. Not that it 
9750: 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68 20 64  makes too much d
9760: 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a  ifference..  */.
9770: 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74 65 72    memset(&master
9780: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61 73 74  , 0, sizeof(mast
9790: 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  er));.  rc = sql
97a0: 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e  ite3OsOpenReadOn
97b0: 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61 73  ly(zMaster, &mas
97c0: 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  ter);.  if( rc!=
97d0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
97e0: 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a   delmaster_out;.
97f0: 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20    master_open = 
9800: 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  1;.  rc = sqlite
9810: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d 61 73  3OsFileSize(&mas
9820: 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a 6f 75  ter, &nMasterJou
9830: 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72 63 21  rnal);.  if( rc!
9840: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
9850: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
9860: 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65 72 4a  ..  if( nMasterJ
9870: 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20 20 20  ournal>0 ){.    
9880: 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a  char *zJournal;.
9890: 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65      char *zMaste
98a0: 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20 20 2f  rPtr = 0;..    /
98b0: 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74 69 72  * Load the entir
98c0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
98d0: 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61 63 65   file into space
98e0: 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 0a 20   obtained from. 
98f0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61 6c 6c     ** sqliteMall
9900: 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74 65 64  oc() and pointed
9910: 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72 4a 6f   to by zMasterJo
9920: 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20  urnal. .    */. 
9930: 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61     zMasterJourna
9940: 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  l = (char *)sqli
9950: 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74 65 72  teMalloc(nMaster
9960: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
9970: 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  ( !zMasterJourna
9980: 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
9990: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
99a0: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
99b0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20  er_out;.    }.  
99c0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
99d0: 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20 7a 4d  Read(&master, zM
99e0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d  asterJournal, nM
99f0: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9a00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
9a10: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
9a20: 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 20 20  aster_out;..    
9a30: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61 73 74  zJournal = zMast
9a40: 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 77  erJournal;.    w
9a50: 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d  hile( (zJournal-
9a60: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3c  zMasterJournal)<
9a70: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  nMasterJournal )
9a80: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
9a90: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
9aa0: 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20  zJournal) ){.   
9ab0: 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66 20 74       /* One of t
9ac0: 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f 69 6e  he journals poin
9ad0: 74 65 64 20 74 6f 20 62 79 20 74 68 65 20 6d 61  ted to by the ma
9ae0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65 78 69  ster journal exi
9af0: 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20  sts..        ** 
9b00: 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68 65 63  Open it and chec
9b10: 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73 20 61  k if it points a
9b20: 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  t the master jou
9b30: 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20 20 20  rnal. If.       
9b40: 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e 20 77   ** so, return w
9b50: 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e 67 20  ithout deleting 
9b60: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9b70: 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
9b80: 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73 46 69   */.        OsFi
9b90: 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20  le journal;.    
9ba0: 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20 20 20      int c;..    
9bb0: 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f 75 72      memset(&jour
9bc0: 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6a  nal, 0, sizeof(j
9bd0: 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20 20 20  ournal));.      
9be0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
9bf0: 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f  OpenReadOnly(zJo
9c00: 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29  urnal, &journal)
9c10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
9c20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
9c30: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
9c40: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
9c50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
9c60: 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65 72 4a  rc = readMasterJ
9c70: 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c  ournal(&journal,
9c80: 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20   &zMasterPtr);. 
9c90: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
9ca0: 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c 29 3b  Close(&journal);
9cb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
9cc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
9cd0: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c          goto del
9ce0: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20  master_out;.    
9cf0: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 63      }..        c
9d00: 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21 3d 30   = zMasterPtr!=0
9d10: 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61 73 74   && strcmp(zMast
9d20: 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72 29 3d  erPtr, zMaster)=
9d30: 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  =0;.        sqli
9d40: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 50 74  teFree(zMasterPt
9d50: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
9d60: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  c ){.          /
9d70: 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61 74 63  * We have a matc
9d80: 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65 74 65  h. Do not delete
9d90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9da0: 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20 20 20  nal file. */.   
9db0: 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d         goto delm
9dc0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20  aster_out;.     
9dd0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
9de0: 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28     zJournal += (
9df0: 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29  strlen(zJournal)
9e00: 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  +1);.    }.  }. 
9e10: 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c   .  sqlite3OsDel
9e20: 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a 0a 64  ete(zMaster);..d
9e30: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a 20 20  elmaster_out:.  
9e40: 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  if( zMasterJourn
9e50: 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  al ){.    sqlite
9e60: 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f 75 72  Free(zMasterJour
9e70: 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20 69 66  nal);.  }  .  if
9e80: 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 29 7b  ( master_open ){
9e90: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c  .    sqlite3OsCl
9ea0: 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a 20 20  ose(&master);.  
9eb0: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
9ec0: 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65 76 65  ../*.** Make eve
9ed0: 72 79 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ry page in the c
9ee0: 61 63 68 65 20 61 67 72 65 65 20 77 69 74 68 20  ache agree with 
9ef0: 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73 6b 2e  what is on disk.
9f00: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9f10: 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68 65 20  ,.** reread the 
9f20: 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20 74 68  disk to reset th
9f30: 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 63  e state of the c
9f40: 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ache..**.** This
9f50: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
9f60: 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c 6c 62  ed after a rollb
9f70: 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73 6f 6d  ack in which som
9f80: 65 20 6f 66 20 74 68 65 20 64 69 72 74 79 20 63  e of the dirty c
9f90: 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20 68 61  ache.** pages ha
9fa0: 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77 72 69  d never been wri
9fb0: 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69 73 6b  tten out to disk
9fc0: 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20 72 6f  .  We need to ro
9fd0: 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a 20 63  ll back the.** c
9fe0: 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61 6e 64  ache content and
9ff0: 20 74 68 65 20 65 61 73 69 65 73 74 20 77 61 79   the easiest way
a000: 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73 20 74   to do that is t
a010: 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f 6c 64  o reread the old
a020: 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61 63 6b   content.** back
a030: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 2e 0a   from the disk..
a040: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a050: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
a060: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
a070: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
a080: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
a090: 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70  _OK;.  for(pPg=p
a0a0: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
a0b0: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
a0c0: 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72 20 7a  All){.    char z
a0d0: 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58 5f 50  Buf[SQLITE_MAX_P
a0e0: 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20 20 69  AGE_SIZE];.    i
a0f0: 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79 20 29  f( !pPg->dirty )
a100: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69   continue;.    i
a110: 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  f( (int)pPg->pgn
a120: 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  o <= pPager->ori
a130: 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20  gDbSize ){.     
a140: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
a150: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
a160: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
a170: 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31 29 29  4)(pPg->pgno-1))
a180: 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
a190: 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67  ite3OsRead(&pPag
a1a0: 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20 70 50  er->fd, zBuf, pP
a1b0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
a1c0: 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 52  .      TRACE3("R
a1d0: 45 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25  EFETCH %d page %
a1e0: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
a1f0: 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
a200: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
a210: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 43  ) break;.      C
a220: 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a 42 75  ODEC(pPager, zBu
a230: 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 32 29  f, pPg->pgno, 2)
a240: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
a250: 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66 2c 20     memset(zBuf, 
a260: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
a270: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
a280: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
a290: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c   || memcmp(zBuf,
a2a0: 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
a2b0: 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  Pg), pPager->pag
a2c0: 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 20 20  eSize) ){.      
a2d0: 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
a2e0: 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75 66 2c  DATA(pPg), zBuf,
a2f0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a300: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  e);.      if( pP
a310: 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
a320: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
a330: 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48  r->xReiniter(PGH
a340: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
a350: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
a360: 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  e);.      }else{
a370: 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
a380: 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
a390: 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
a3a0: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
a3b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a3c0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
a3d0: 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 64   = 0;.    pPg->d
a3e0: 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65 66  irty = 0;.#ifdef
a3f0: 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41   SQLITE_CHECK_PA
a400: 47 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67  GES.    pPg->pag
a410: 65 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61  eHash = pager_pa
a420: 67 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e  gehash(pPg);.#en
a430: 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dif.  }.  return
a440: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
a450: 75 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20  uncate the main 
a460: 66 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65  file of the give
a470: 6e 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e  n pager to the n
a480: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a  umber of pages.*
a490: 2a 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a  * indicated..*/.
a4a0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
a4b0: 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20  _truncate(Pager 
a4c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61  *pPager, int nPa
a4d0: 67 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ge){.  assert( p
a4e0: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
a4f0: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b  GER_EXCLUSIVE );
a500: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
a510: 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61  3OsTruncate(&pPa
a520: 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
a530: 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e  >pageSize*(i64)n
a540: 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Page);.}../*.** 
a550: 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a 6f 75  Playback the jou
a560: 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20 72 65  rnal and thus re
a570: 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 62 61  store the databa
a580: 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20 74 68  se file to.** th
a590: 65 20 73 74 61 74 65 20 69 74 20 77 61 73 20 69  e state it was i
a5a0: 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74 61 72  n before we star
a5b0: 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61 6e 67  ted making chang
a5c0: 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20  es.  .**.** The 
a5d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
a5e0: 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77  mat is as follow
a5f0: 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29 20 20  s: .**.**  (1)  
a600: 38 20 62 79 74 65 20 70 72 65 66 69 78 2e 20 20  8 byte prefix.  
a610: 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75 72 6e  A copy of aJourn
a620: 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28  alMagic[]..**  (
a630: 32 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65  2)  4 byte big-e
a640: 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68  ndian integer wh
a650: 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65  ich is the numbe
a660: 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67 65 20  r of valid page 
a670: 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20 20 20  records.**      
a680: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
a690: 20 20 49 66 20 74 68 69 73 20 76 61 6c 75 65 20    If this value 
a6a0: 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20 74  is 0xffffffff, t
a6b0: 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  hen compute the.
a6c0: 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65 72 20  **       number 
a6d0: 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64 73 20  of page records 
a6e0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
a6f0: 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29 20 20   size..**  (3)  
a700: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
a710: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
a720: 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 76  is the initial v
a730: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a 2a 2a  alue for the .**
a740: 20 20 20 20 20 20 20 73 61 6e 69 74 79 20 63 68         sanity ch
a750: 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34 29 20  ecksum..**  (4) 
a760: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
a770: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
a780: 62 65 72 20 6f 66 20 70 61 67 65 73 20 74 6f 20  ber of pages to 
a790: 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a 2a 20  truncate the.** 
a7a0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 74        database t
a7b0: 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c 6c 62  o during a rollb
a7c0: 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20 34 20  ack..**  (5)  4 
a7d0: 62 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69  byte integer whi
a7e0: 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72  ch is the number
a7f0: 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74 68 65   of bytes in the
a800: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 0a   master journal.
a810: 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e 20 20  **       name.  
a820: 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20 62 65  The value may be
a830: 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74 65 20   zero (indicate 
a840: 74 68 61 74 20 74 68 65 72 65 20 69 73 20 6e 6f  that there is no
a850: 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20 20 20   master.**      
a860: 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28   journal.).**  (
a870: 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66 20 74  6)  N bytes of t
a880: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
a890: 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e 61 6d  l name.  The nam
a8a0: 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d 74 65  e will be nul-te
a8b0: 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20 20 20  rminated.**     
a8c0: 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65 20 73    and might be s
a8d0: 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68 65 20  horter than the 
a8e0: 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20  value read from 
a8f0: 28 35 29 2e 20 20 49 66 20 74 68 65 20 66 69 72  (5).  If the fir
a900: 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20 20 20  st byte.**      
a910: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
a920: 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72 65 20  \000 then there 
a930: 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  is no master jou
a940: 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73 74 65  rnal.  The maste
a950: 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e  r.**       journ
a960: 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f 72 65  al name is store
a970: 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a 20 20  d in UTF-8..**  
a980: 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d 6f 72  (7)  Zero or mor
a990: 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e 63 65  e pages instance
a9a0: 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c 6c 6f  s, each as follo
a9b0: 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ws:.**        + 
a9c0: 20 34 20 62 79 74 65 20 70 61 67 65 20 6e 75 6d   4 byte page num
a9d0: 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ber..**        +
a9e0: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
a9f0: 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74 61  ze bytes of data
aa00: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34  ..**        +  4
aa10: 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d 0a 2a   byte checksum.*
aa20: 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73 70 65  *.** When we spe
aa30: 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ak of the journa
aa40: 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d 65 61  l header, we mea
aa50: 6e 20 74 68 65 20 66 69 72 73 74 20 36 20 69 74  n the first 6 it
aa60: 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20 45 61  ems above..** Ea
aa70: 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68 65 20  ch entry in the 
aa80: 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20 69 6e  journal is an in
aa90: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 37 74  stance of the 7t
aaa0: 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61  h item..**.** Ca
aab0: 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ll the value fro
aac0: 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62 75 6c  m the second bul
aad0: 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e 52 65  let "nRec".  nRe
aae0: 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  c is the number 
aaf0: 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61 67 65  of.** valid page
ab00: 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68 65 20   entries in the 
ab10: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73  journal.  In mos
ab20: 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63 61 6e  t cases, you can
ab30: 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20   compute the.** 
ab40: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 66 72  value of nRec fr
ab50: 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
ab60: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
ab70: 20 20 42 75 74 20 69 66 20 61 20 70 6f 77 65 72    But if a power
ab80: 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63 63 75  .** failure occu
ab90: 72 72 65 64 20 77 68 69 6c 65 20 74 68 65 20 6a  rred while the j
aba0: 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69 6e 67  ournal was being
abb0: 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63 6f 75   written, it cou
abc0: 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63 61 73  ld be the.** cas
abd0: 65 20 74 68 61 74 20 74 68 65 20 73 69 7a 65 20  e that the size 
abe0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
abf0: 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64 79 20  ile had already 
ac00: 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64 20 62  been increased b
ac10: 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72 61 20  ut.** the extra 
ac20: 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f 74 20  entries had not 
ac30: 79 65 74 20 6d 61 64 65 20 69 74 20 73 61 66 65  yet made it safe
ac40: 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49 6e 20  ly to disk.  In 
ac50: 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a 2a 20  such a case,.** 
ac60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ac70: 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f 6d 20  c computed from 
ac80: 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20 77 6f  the file size wo
ac90: 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72 67 65  uld be too large
aca0: 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74 20 72  .  For.** that r
acb0: 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61 79 73  eason, we always
acc0: 20 75 73 65 20 74 68 65 20 6e 52 65 63 20 76 61   use the nRec va
acd0: 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61 64 65  lue in the heade
ace0: 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  r..**.** If the 
acf0: 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20 30 78  nRec value is 0x
ad00: 66 66 66 66 66 66 66 66 20 69 74 20 6d 65 61 6e  ffffffff it mean
ad10: 73 20 74 68 61 74 20 6e 52 65 63 20 73 68 6f 75  s that nRec shou
ad20: 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64 0a 2a  ld be computed.*
ad30: 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
ad40: 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61 6c 75  size.  This valu
ad50: 65 20 69 73 20 75 73 65 64 20 77 68 65 6e 20 74  e is used when t
ad60: 68 65 20 75 73 65 72 20 73 65 6c 65 63 74 73 20  he user selects 
ad70: 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f  the.** no-sync o
ad80: 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6a 6f  ption for the jo
ad90: 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65 72 20  urnal.  A power 
ada0: 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65  failure could le
adb0: 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69 6f 6e  ad to corruption
adc0: 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65  .** in this case
add0: 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69 6e 67  .  But for thing
ade0: 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61 72 79  s like temporary
adf0: 20 74 61 62 6c 65 20 28 77 68 69 63 68 20 77 69   table (which wi
ae00: 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74 65 64  ll be.** deleted
ae10: 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65 72 20   when the power 
ae20: 69 73 20 72 65 73 74 6f 72 65 64 29 20 77 65 20  is restored) we 
ae30: 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a 2a 2a  don't care.  .**
ae40: 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c 65 20  .** If the file 
ae50: 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20 6a 6f  opened as the jo
ae60: 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 6f  urnal file is no
ae70: 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a  t a well-formed.
ae80: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  ** journal file 
ae90: 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20 75  then all pages u
aea0: 70 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 63  p to the first c
aeb0: 6f 72 72 75 70 74 65 64 20 70 61 67 65 20 61 72  orrupted page ar
aec0: 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b  e rolled.** back
aed0: 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20 69 66   (or no pages if
aee0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61   the journal hea
aef0: 64 65 72 20 69 73 20 63 6f 72 72 75 70 74 65 64  der is corrupted
af00: 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66  ). The journal f
af10: 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e 20 64  ile.** is then d
af20: 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c 49 54  eleted and SQLIT
af30: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c 20 6a  E_OK returned, j
af40: 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63 6f 72  ust as if no cor
af50: 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a 20 62  ruption had.** b
af60: 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e  een encountered.
af70: 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49 2f 4f  .**.** If an I/O
af80: 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65 72 72   or malloc() err
af90: 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65 20 6a  or occurs, the j
afa0: 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73 20 6e  ournal-file is n
afb0: 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 6e  ot deleted.** an
afc0: 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
afd0: 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  is returned..*/.
afe0: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
aff0: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
b000: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
b010: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
b020: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b030: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
b040: 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20 20 75   in bytes */.  u
b050: 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  32 nRec;        
b060: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b070: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69 6e 20  r of Records in 
b080: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
b090: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
b0a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
b0b0: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 50  p counter */.  P
b0c0: 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20 20 20  gno mxPg = 0;   
b0d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
b0e0: 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  of the original 
b0f0: 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20 2a 2f  file in pages */
b100: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
b110: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
b120: 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20 61 20  esult code of a 
b130: 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a 20 20  subroutine */.  
b140: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20 3d 20  char *zMaster = 
b150: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  0;       /* Name
b160: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
b170: 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79 20 2a  al file if any *
b180: 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20 6f  /..  /* Figure o
b190: 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f  ut how many reco
b1a0: 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20 6a  rds are in the j
b1b0: 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74 20 65  ournal.  Abort e
b1c0: 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74 68 65  arly if.  ** the
b1d0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d 70 74   journal is empt
b1e0: 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  y..  */.  assert
b1f0: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
b200: 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20  lOpen );.  rc = 
b210: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b220: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
b230: 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72 63 21  &szJ);.  if( rc!
b240: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b250: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b260: 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  ack;.  }..  /* R
b270: 65 61 64 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ead the master j
b280: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72 6f 6d  ournal name from
b290: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 69 66   the journal, if
b2a0: 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2e 0a   it is present..
b2b0: 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74 65 72    ** If a master
b2c0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
b2d0: 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c  me is specified,
b2e0: 20 62 75 74 20 74 68 65 20 66 69 6c 65 20 69 73   but the file is
b2f0: 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73 65 6e   not.  ** presen
b300: 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65 6e 20  t on disk, then 
b310: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6e  the journal is n
b320: 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65 73 20  ot hot and does 
b330: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 0a 20  not need to be. 
b340: 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63 6b 2e   ** played back.
b350: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61  .  */.  rc = rea
b360: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 26  dMasterJournal(&
b370: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d  pPager->jfd, &zM
b380: 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74  aster);.  assert
b390: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
b3a0: 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  E );.  if( rc!=S
b3b0: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61  QLITE_OK || (zMa
b3c0: 73 74 65 72 20 26 26 20 21 73 71 6c 69 74 65 33  ster && !sqlite3
b3d0: 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4d 61  OsFileExists(zMa
b3e0: 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20 73 71  ster)) ){.    sq
b3f0: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
b400: 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72 20 3d  );.    zMaster =
b410: 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   0;.    if( rc==
b420: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 72 63  SQLITE_DONE ) rc
b430: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
b440: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
b450: 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ack;.  }.  sqlit
b460: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
b470: 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70 50 61  ->jfd, 0);.  pPa
b480: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
b490: 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  = 0;..  /* This 
b4a0: 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65 73 20  loop terminates 
b4b0: 65 69 74 68 65 72 20 77 68 65 6e 20 74 68 65 20  either when the 
b4c0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 29  readJournalHdr()
b4d0: 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a 20 20   call returns.  
b4e0: 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20 6f  ** SQLITE_DONE o
b4f0: 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20 6f 63  r an IO error oc
b500: 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69 6c 65  curs. */.  while
b510: 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a 20 52  ( 1 ){..    /* R
b520: 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a 6f 75  ead the next jou
b530: 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72 6f 6d  rnal header from
b540: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b550: 65 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65  e.  If there are
b560: 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75  .    ** not enou
b570: 67 68 20 62 79 74 65 73 20 6c 65 66 74 20 69 6e  gh bytes left in
b580: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
b590: 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65 74 65  e for a complete
b5a0: 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20 20 20   header, or.    
b5b0: 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75 70 74  ** it is corrupt
b5c0: 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f 63 65  ed, then a proce
b5d0: 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69 6c 65  ss must of faile
b5e0: 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e 67 20  d while writing 
b5f0: 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69 73 20  it..    ** This 
b600: 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68 69 6e  indicates nothin
b610: 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74 6f 20  g more needs to 
b620: 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  be rolled back..
b630: 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
b640: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
b650: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
b660: 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20 20 69  c, &mxPg);.    i
b670: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
b680: 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28 20 72   ){ .      if( r
b690: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b6a0: 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
b6b0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20  QLITE_OK;.      
b6c0: 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  }.      goto end
b6d0: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d  _playback;.    }
b6e0: 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65 63  ..    /* If nRec
b6f0: 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c 20   is 0xffffffff, 
b700: 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72 6e 61  then this journa
b710: 6c 20 77 61 73 20 63 72 65 61 74 65 64 20 62 79  l was created by
b720: 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20 20 2a   a process.    *
b730: 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d  * working in no-
b740: 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69 73 20  sync mode. This 
b750: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 72  means that the r
b760: 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  est of the journ
b770: 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65 20 63  al.    ** file c
b780: 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67 65 73  onsists of pages
b790: 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d  , there are no m
b7a0: 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  ore journal head
b7b0: 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20 20 20  ers. Compute.   
b7c0: 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66   ** the value of
b7d0: 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e 20 74   nRec based on t
b7e0: 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e 2e 0a  his assumption..
b7f0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e      */.    if( n
b800: 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66 66 20  Rec==0xffffffff 
b810: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
b820: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b830: 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52  Off==JOURNAL_HDR
b840: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
b850: 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a       nRec = (szJ
b860: 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   - JOURNAL_HDR_S
b870: 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55 52 4e  Z(pPager))/JOURN
b880: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
b890: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
b8a0: 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
b8b0: 69 72 73 74 20 68 65 61 64 65 72 20 72 65 61 64  irst header read
b8c0: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
b8d0: 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  l, truncate the.
b8e0: 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
b8f0: 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69 74 27  file back to it'
b900: 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65 2e  s original size.
b910: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
b920: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
b930: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 26  AGER_EXCLUSIVE &
b940: 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
b950: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
b960: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b970: 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 61  ager) ){.      a
b980: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f  ssert( pPager->o
b990: 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c 20  rigDbSize==0 || 
b9a0: 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
b9b0: 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20 20  ze==mxPg );.    
b9c0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75    rc = pager_tru
b9d0: 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d 78  ncate(pPager, mx
b9e0: 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  Pg);.      if( r
b9f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ba00: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64          goto end
ba10: 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 20  _playback;.     
ba20: 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d   }.      pPager-
ba30: 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b 0a  >dbSize = mxPg;.
ba40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72 63      }..    /* rc
ba50: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
ba60: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 4a  (&pPager->jfd, J
ba70: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ba80: 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20 69  ager)); */.    i
ba90: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
baa0: 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79   ) goto end_play
bab0: 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a 20  back;.  .    /* 
bac0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
bad0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 6a  ges out of the j
bae0: 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20  ournal and back 
baf0: 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  into the databas
bb00: 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
bb10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 52     for(i=0; i<nR
bb20: 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ec; i++){.      
bb30: 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
bb40: 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61  ack_one_page(pPa
bb50: 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ger, &pPager->jf
bb60: 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28  d, 1);.      if(
bb70: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bb80: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  {.        if( rc
bb90: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
bba0: 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
bbb0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 20  SQLITE_OK;.     
bbc0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
bbd0: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
bbe0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
bbf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
bc00: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e           goto en
bc10: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
bc20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bc30: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61    }.  }..  /* Pa
bc40: 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62 65  ges that have be
bc50: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
bc60: 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e 65  e journal but ne
bc70: 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a 20  ver synced.  ** 
bc80: 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f 72  where not restor
bc90: 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20 61  ed by the loop a
bca0: 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20 74  bove.  We have t
bcb0: 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65 0a  o restore those.
bcc0: 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72 65    ** pages by re
bcd0: 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b 20  ading them back 
bce0: 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61  from the origina
bcf0: 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a 2f  l database..  */
bd00: 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d 53  .  assert( rc==S
bd10: 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70 61  QLITE_OK );.  pa
bd20: 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68 65  ger_reload_cache
bd30: 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f 70  (pPager);..end_p
bd40: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
bd50: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
bd60: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75      rc = pager_u
bd70: 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
bd80: 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 4d  r);.  }.  if( zM
bd90: 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a 20  aster ){.    /* 
bda0: 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20 6d  If there was a m
bdb0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61 6e  aster journal an
bdc0: 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77  d this routine w
bdd0: 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65 2c  ill return true,
bde0: 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20 69  .    ** see if i
bdf0: 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74 6f  t is possible to
be00: 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74   delete the mast
be10: 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20  er journal..    
be20: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  */.    if( rc==S
be30: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
be40: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65 6c    rc = pager_del
be50: 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29 3b  master(zMaster);
be60: 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
be70: 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a  eFree(zMaster);.
be80: 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61    }..  /* The Pa
be90: 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 76  ger.sectorSize v
bea0: 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76 65  ariable may have
beb0: 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77 68   been updated wh
bec0: 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a  ile rolling.  **
bed0: 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20   back a journal 
bee0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
bef0: 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66 66  cess with a diff
bf00: 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43 54  erent PAGER_SECT
bf10: 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c  OR_SIZE.  ** val
bf20: 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f 20  ue. Reset it to 
bf30: 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c 75  the correct valu
bf40: 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65  e for this proce
bf50: 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65  ss..  */.  pPage
bf60: 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d 20  r->sectorSize = 
bf70: 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a  PAGER_SECTOR_SIZ
bf80: 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  E;.  return rc;.
bf90: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63  }../*.** Playbac
bfa0: 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  k the statement 
bfb0: 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54  journal..**.** T
bfc0: 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20 74  his is similar t
bfd0: 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74  o playing back t
bfe0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
bff0: 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68 0a  ournal but with.
c000: 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20 74  ** a few extra t
c010: 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  wists..**.**    
c020: 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72 20  (1)  The number 
c030: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
c040: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 74  database file at
c050: 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a   the start of.**
c060: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74 61           the sta
c070: 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65 64  tement is stored
c080: 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d 74   in pPager->stmt
c090: 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65  Size, not in the
c0a0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75 72  .**         jour
c0b0: 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66 2e  nal file itself.
c0c0: 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20 49  .**.**    (2)  I
c0d0: 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c  n addition to pl
c0e0: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 73  aying back the s
c0f0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c100: 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20  , also.**       
c110: 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70    playback all p
c120: 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61 6e  ages of the tran
c130: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
c140: 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20  beginning.**    
c150: 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20 70       at offset p
c160: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
c180: 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62  pager_stmt_playb
c190: 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
c1a0: 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20  r){.  i64 szJ;  
c1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
c1c0: 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66 75  * Size of the fu
c1d0: 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20  ll journal */.  
c1e0: 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e  i64 hdrOff;.  in
c1f0: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
c200: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
c210: 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20   of Records */. 
c220: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
c230: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
c240: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69  p counter */.  i
c250: 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20  nt rc;..  szJ = 
c260: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
c270: 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  ff;.#ifndef NDEB
c280: 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34 20  UG .  {.    i64 
c290: 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d  os_szJ;.    rc =
c2a0: 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
c2b0: 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
c2c0: 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69   &os_szJ);.    i
c2d0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
c2e0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
c2f0: 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f    assert( szJ==o
c300: 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e  s_szJ );.  }.#en
c310: 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64  dif..  /* Set hd
c320: 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20 6f  rOff to be the o
c330: 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69 72  ffset to the fir
c340: 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  st journal heade
c350: 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  r written.  ** t
c360: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
c370: 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68  ansaction, or th
c380: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
c390: 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a  e if no journal.
c3a0: 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73 20    ** header was 
c3b0: 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20  written..  */.  
c3c0: 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d  hdrOff = pPager-
c3d0: 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61  >stmtHdrOff;.  a
c3e0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 66  ssert( pPager->f
c3f0: 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f  ullSync || !hdrO
c400: 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64 72  ff );.  if( !hdr
c410: 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f 66  Off ){.    hdrOf
c420: 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a  f = szJ;.  }.  .
c430: 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68    /* Truncate th
c440: 65 20 64 61 74 61 62 61 73 65 20 62 61 63 6b 20  e database back 
c450: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20  to its original 
c460: 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  size..  */.  if(
c470: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
c480: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
c490: 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
c4a0: 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
c4b0: 72 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  r, pPager->stmtS
c4c0: 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  ize);.  }.  pPag
c4d0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
c4e0: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
c4f0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
c500: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
c510: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
c520: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
c530: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
c540: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
c550: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
c560: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
c570: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
c580: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
c590: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
c5a0: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
c5b0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
c5c0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
c5d0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
c5e0: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
c5f0: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c600: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
c610: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
c620: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
c630: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
c640: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
c650: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
c660: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
c670: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
c680: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
c690: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
c6a0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
c6b0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
c6c0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
c6d0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
c6e0: 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  , &pPager->stfd,
c6f0: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
c700: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c710: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
c720: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
c730: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
c740: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
c750: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
c760: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
c770: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
c780: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
c790: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
c7a0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
c7b0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
c7c0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
c7d0: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
c7e0: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
c7f0: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
c800: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
c810: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
c820: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
c830: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
c840: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
c850: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
c860: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
c870: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
c880: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
c890: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
c8a0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
c8b0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
c8c0: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
c8d0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
c8e0: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
c8f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
c900: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
c910: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
c920: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
c930: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
c940: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c950: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
c960: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
c970: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
c980: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
c990: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
c9a0: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
c9b0: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
c9c0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
c9d0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
c9e0: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
c9f0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
ca00: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
ca10: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
ca20: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
ca30: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
ca40: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
ca50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
ca60: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
ca70: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
ca80: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ca90: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
caa0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
cab0: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
cac0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
cad0: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
cae0: 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20  2 nRec;.    u32 
caf0: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
cb00: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
cb10: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
cb20: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
cb30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
cb40: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
cb50: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
cb60: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
cb70: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
cb80: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
cb90: 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nRec==0 ){.   
cba0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
cbb0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
cbc0: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
cbd0: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
cbe0: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65   }.    for(i=nRe
cbf0: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
cc00: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
cc10: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
cc20: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
cc30: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
cc40: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
cc50: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
cc60: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
cc70: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
cc80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
cc90: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
cca0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
ccb0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
ccc0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
ccd0: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
cce0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
ccf0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
cd00: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
cd10: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
cd20: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
cd30: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
cd40: 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52  PT;  /* bkpt-COR
cd50: 52 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  RUPT */.  }else{
cd60: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
cd70: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
cd80: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
cd90: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
cda0: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
cdb0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
cdc0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
cdd0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
cde0: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
cdf0: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
ce00: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
ce10: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
ce20: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
ce30: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
ce40: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
ce50: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
ce60: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
ce70: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
ce80: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
ce90: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
cea0: 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20  3OsSync().  The 
ceb0: 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20  pager runs much 
cec0: 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79  faster with noSy
ced0: 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66  nc on,.** but if
cee0: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
cef0: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
cf00: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72   there is an abr
cf10: 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61  upt power .** fa
cf20: 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62  ilure, the datab
cf30: 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ase file might b
cf40: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
cf50: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a  onsistent and.**
cf60: 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74   unrepairable st
cf70: 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ate.  .*/.void s
cf80: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
cf90: 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  cachesize(Pager 
cfa0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
cfb0: 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
cfc0: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>=0 ){.    pPa
cfd0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
cfe0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
cff0: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
d000: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
d010: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a  >needSync = 0; .
d020: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
d030: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
d040: 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d  .    mxPage = -m
d050: 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
d060: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
d070: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
d080: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
d090: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
d0a0: 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
d0b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
d0c0: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
d0d0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
d0e0: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
d0f0: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
d100: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
d110: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
d120: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
d130: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
d140: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
d150: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
d160: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
d170: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
d180: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
d190: 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
d1a0: 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
d1b0: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
d1c0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
d1d0: 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
d1e0: 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
d1f0: 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
d200: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
d210: 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
d220: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
d230: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
d240: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
d250: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
d260: 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
d270: 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
d280: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
d290: 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
d2a0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
d2b0: 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
d2c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
d2d0: 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
d2e0: 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
d2f0: 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
d300: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
d310: 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
d320: 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
d330: 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
d340: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
d360: 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
d370: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
d380: 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
d390: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
d3a0: 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
d3b0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
d3c0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d3d0: 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
d3e0: 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
d3f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
d400: 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
d410: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
d420: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
d430: 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
d440: 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
d450: 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
d460: 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
d470: 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
d480: 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
d490: 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
d4a0: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
d4b0: 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
d4c0: 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
d4d0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
d4e0: 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
d4f0: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
d500: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
d510: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
d520: 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
d530: 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
d540: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
d550: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
d560: 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
d570: 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
d580: 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
d590: 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
d5a0: 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
d5b0: 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64  FULL=3..*/.#ifnd
d5c0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
d5d0: 41 47 45 52 5f 50 52 41 47 4d 41 53 0a 76 6f 69  AGER_PRAGMAS.voi
d5e0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
d5f0: 65 74 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28  et_safety_level(
d600: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
d610: 6e 74 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61  nt level){.  pPa
d620: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
d630: 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
d640: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
d650: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
d660: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
d670: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
d680: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e  .  if( pPager->n
d690: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
d6a0: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a  needSync = 0;.}.
d6b0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70  #endif../*.** Op
d6c0: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
d6d0: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
d6e0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
d6f0: 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28   into zName.** (
d700: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74  zName must be at
d710: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
d720: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
d730: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
d740: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
d750: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
d760: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
d770: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
d780: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
d790: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
d7a0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
d7b0: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
d7c0: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
d7d0: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
d7e0: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
d7f0: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
d800: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
d810: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
d820: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66  zFile, OsFile *f
d830: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
d840: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  8;.  int rc;.  d
d850: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
d860: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
d870: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
d880: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d890: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
d8a0: 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20  zFile, fd, 1);. 
d8b0: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
d8c0: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
d8d0: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
d8e0: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
d8f0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
d900: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
d910: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
d920: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
d930: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
d940: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
d950: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
d960: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
d970: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
d980: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
d990: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
d9a0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
d9b0: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
d9c0: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
d9d0: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
d9e0: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
d9f0: 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72  ing sqlite3pager
da00: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
da10: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
da20: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
da30: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
da40: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
da50: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
da60: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
da70: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
da80: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
da90: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
daa0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
dab0: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
dac0: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
dad0: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
dae0: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
daf0: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
db00: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
db10: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
db20: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
db30: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
db40: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
db50: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
db60: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
db70: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
db80: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
db90: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
dba0: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
dbb0: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
dbc0: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
dbd0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
dbe0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
dbf0: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
dc00: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
dc10: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
dc20: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
dc30: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
dc40: 2a 2f 0a 20 20 69 6e 74 20 66 6c 61 67 73 20 20  */.  int flags  
dc50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
dc60: 20 66 6c 61 67 73 20 63 6f 6e 74 72 6f 6c 6c 69   flags controlli
dc70: 6e 67 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  ng this file */.
dc80: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
dc90: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  er;.  char *zFul
dca0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
dcb0: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
dcc0: 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74  OsFile fd;.  int
dcd0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
dce0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
dcf0: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
dd00: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
dd10: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
dd20: 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  0;.  int useJour
dd30: 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20 50  nal = (flags & P
dd40: 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41  AGER_OMIT_JOURNA
dd50: 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f 52  L)==0;.  int noR
dd60: 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67 73  eadlock = (flags
dd70: 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41 44   & PAGER_NO_READ
dd80: 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61 72  LOCK)!=0;.  char
dd90: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
dda0: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20  MPNAME_SIZE];.. 
ddb0: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
ddc0: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
ddd0: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69  sizeof(fd));.  i
dde0: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
ddf0: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
de00: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
de10: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
de20: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
de30: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
de40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
de50: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
de60: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
de70: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
de80: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
de90: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
dea0: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
deb0: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
dec0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
ded0: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  K;.    }else.#en
dee0: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
def0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
df00: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
df10: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
df20: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
df30: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
df40: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
df50: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
df60: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
df70: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
df80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
df90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
dfa0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
dfb0: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
dfc0: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
dfd0: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
dfe0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
dff0: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
e000: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
e010: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
e020: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
e030: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
e040: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a    }.  }.  if( !z
e050: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
e060: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
e070: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74  se(&fd);.    ret
e080: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
e090: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
e0a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e0b0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
e0c0: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
e0d0: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
e0e0: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
e0f0: 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65  rc;.  }.  nameLe
e100: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
e110: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
e120: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
e130: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
e140: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20  er) + nameLen*3 
e150: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
e160: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
e170: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
e180: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
e190: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
e1a0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
e1b0: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
e1c0: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25    TRACE3("OPEN %
e1d0: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
e1e0: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
e1f0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
e200: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
e210: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
e220: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
e230: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
e240: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
e250: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
e260: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
e270: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e280: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
e290: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
e2a0: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
e2b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
e2c0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
e2d0: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
e2e0: 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  hname);.  for(i=
e2f0: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
e300: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
e310: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
e320: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
e330: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
e340: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
e350: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
e360: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
e370: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
e380: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
e390: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
e3a0: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
e3b0: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
e3c0: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
e3d0: 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f  ->fd = fd;.#if O
e3e0: 53 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d  S_UNIX.  pPager-
e3f0: 3e 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61  >fd.pPager = pPa
e400: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  ger;.#endif.  pP
e410: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
e420: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
e430: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
e440: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
e450: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f  Db;.  pPager->no
e460: 52 65 61 64 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61  Readlock = noRea
e470: 64 6c 6f 63 6b 20 26 26 20 72 65 61 64 4f 6e 6c  dlock && readOnl
e480: 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  y;.  pPager->stm
e490: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  tOpen = 0;.  pPa
e4a0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
e4b0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
e4c0: 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ef = 0;.  pPager
e4d0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62  ->dbSize = memDb
e4e0: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61  -1;.  pPager->pa
e4f0: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
e500: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
e510: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41  E;.  pPager->psA
e520: 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41  ligned = FORCE_A
e530: 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
e540: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 70 50  >pageSize);.  pP
e550: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
e560: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
e570: 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mtJSize = 0;.  p
e580: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
e590: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  ;.  pPager->nMax
e5a0: 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Page = 0;.  pPag
e5b0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 30  er->mxPage = 100
e5c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
e5d0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
e5e0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ;.  pPager->errM
e5f0: 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ask = 0;.  pPage
e600: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20 74 65  r->tempFile = te
e610: 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65 72  mpFile;.  pPager
e620: 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b  ->memDb = memDb;
e630: 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f  .  pPager->readO
e640: 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a  nly = readOnly;.
e650: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
e660: 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  nc = 0;.  pPager
e670: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65  ->noSync = pPage
e680: 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c 20 21  r->tempFile || !
e690: 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20 70 50  useJournal;.  pP
e6a0: 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d  ager->fullSync =
e6b0: 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   (pPager->noSync
e6c0: 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65 72 2d  ?0:1);.  pPager-
e6d0: 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20 70  >pFirst = 0;.  p
e6e0: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
e6f0: 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ced = 0;.  pPage
e700: 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20 20  r->pLast = 0;.  
e710: 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 20 3d  pPager->nExtra =
e720: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
e730: 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50 61 67  (nExtra);.  pPag
e740: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
e750: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
e760: 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  ZE;.  pPager->pB
e770: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30 3b 0a  usyHandler = 0;.
e780: 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d    memset(pPager-
e790: 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f  >aHash, 0, sizeo
e7a0: 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29  f(pPager->aHash)
e7b0: 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20 3d 20  );.  *ppPager = 
e7c0: 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75 72 6e  pPager;.  return
e7d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
e7e0: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62 75 73  *.** Set the bus
e7f0: 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63 74 69  y handler functi
e800: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
e810: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62 75 73  te3pager_set_bus
e820: 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72 20 2a  yhandler(Pager *
e830: 70 50 61 67 65 72 2c 20 42 75 73 79 48 61 6e 64  pPager, BusyHand
e840: 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65  ler *pBusyHandle
e850: 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 70 42  r){.  pPager->pB
e860: 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70 42 75  usyHandler = pBu
e870: 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a 2f 2a  syHandler;.}../*
e880: 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65 73 74  .** Set the dest
e890: 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69 73 20  ructor for this 
e8a0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
e8b0: 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72 75 63  ULL, the destruc
e8c0: 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a 2a 2a  tor is called.**
e8d0: 20 77 68 65 6e 20 74 68 65 20 72 65 66 65 72 65   when the refere
e8e0: 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65 61 63  nce count on eac
e8f0: 68 20 70 61 67 65 20 72 65 61 63 68 65 73 20 7a  h page reaches z
e900: 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74 72 75  ero.  The destru
e910: 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65 20 75  ctor can.** be u
e920: 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75 70 20  sed to clean up 
e930: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74  information in t
e940: 68 65 20 65 78 74 72 61 20 73 65 67 6d 65 6e 74  he extra segment
e950: 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65 61 63   appended to eac
e960: 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 54 68  h page..**.** Th
e970: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
e980: 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20 61 20  not called as a 
e990: 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33 70 61  result sqlite3pa
e9a0: 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20 0a 2a  ger_close().  .*
e9b0: 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61 72  * Destructors ar
e9c0: 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62 79  e only called by
e9d0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
e9e0: 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
e9f0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
ea00: 64 65 73 74 72 75 63 74 6f 72 28 50 61 67 65 72  destructor(Pager
ea10: 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28   *pPager, void (
ea20: 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c 69 6e  *xDesc)(void*,in
ea30: 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
ea40: 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
ea50: 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
ea60: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
ea70: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
ea80: 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
ea90: 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
eaa0: 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
eab0: 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
eac0: 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
ead0: 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
eae0: 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
eaf0: 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
eb00: 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
eb10: 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
eb20: 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
eb30: 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
eb40: 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
eb50: 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
eb60: 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
eb70: 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
eb80: 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
eb90: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
eba0: 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69 6e 69  3pager_set_reini
ebb0: 74 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  ter(Pager *pPage
ebc0: 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69  r, void (*xReini
ebd0: 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a  t)(void*,int)){.
ebe0: 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
ebf0: 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
ec00: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
ec10: 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a 2a 2a  page size..**.**
ec20: 20 54 68 65 20 70 61 67 65 20 73 69 7a 65 20 6d   The page size m
ec30: 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e  ust only be chan
ec40: 67 65 64 20 77 68 65 6e 20 74 68 65 20 63 61 63  ged when the cac
ec50: 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a 2f 0a  he is empty..*/.
ec60: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
ec70: 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65 28 50  r_set_pagesize(P
ec80: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
ec90: 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61  t pageSize){.  a
eca0: 73 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e  ssert( pageSize>
ecb0: 3d 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65  =512 && pageSize
ecc0: 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47  <=SQLITE_MAX_PAG
ecd0: 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50 61 67  E_SIZE );.  pPag
ece0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 70  er->pageSize = p
ecf0: 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61 67 65  ageSize;.  pPage
ed00: 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 3d 20 46  r->psAligned = F
ed10: 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 70  ORCE_ALIGNMENT(p
ed20: 61 67 65 53 69 7a 65 29 3b 0a 7d 0a 0a 2f 2a 0a  ageSize);.}../*.
ed30: 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73  ** Read the firs
ed40: 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74  t N bytes from t
ed50: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
ed60: 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65  the file into me
ed70: 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65  mory.** that pDe
ed80: 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 20 4e  st points to.  N
ed90: 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  o error checking
eda0: 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76 6f 69   is done..*/.voi
edb0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  d sqlite3pager_r
edc0: 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72 28 50  ead_fileheader(P
edd0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
ede0: 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20 63 68  t N, unsigned ch
edf0: 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20 6d 65  ar *pDest){.  me
ee00: 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e  mset(pDest, 0, N
ee10: 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d  );.  if( MEMDB==
ee20: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
ee30: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
ee40: 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  fd, 0);.    sqli
ee50: 74 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65  te3OsRead(&pPage
ee60: 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20 4e 29  r->fd, pDest, N)
ee70: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  ;.  }.}../*.** R
ee80: 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61 6c 20  eturn the total 
ee90: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
eea0: 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65  in the disk file
eeb0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68   associated with
eec0: 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f 0a 69  .** pPager..*/.i
eed0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
eee0: 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65 72 20  pagecount(Pager 
eef0: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
ef00: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  n;.  assert( pPa
ef10: 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  ger!=0 );.  if( 
ef20: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d  pPager->dbSize>=
ef30: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
ef40: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
ef50: 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65    }.  if( sqlite
ef60: 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
ef70: 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d 53 51  ger->fd, &n)!=SQ
ef80: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
ef90: 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
efa0: 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b  = PAGER_ERR_DISK
efb0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
efc0: 20 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61 67 65    }.  n /= pPage
efd0: 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 69  r->pageSize;.  i
efe0: 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e 3d 3d  f( !MEMDB && n==
eff0: 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61  PENDING_BYTE/pPa
f000: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b  ger->pageSize ){
f010: 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20  .    n++;.  }.  
f020: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
f030: 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
f040: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
f050: 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d 0a 20  bSize = n;.  }. 
f060: 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a   return n;.}../*
f070: 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63 6c  .** Forward decl
f080: 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  aration.*/.stati
f090: 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61  c int syncJourna
f0a0: 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f 2a 0a  l(Pager*);.../*.
f0b0: 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  ** Unlink pPg fr
f0c0: 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
f0d0: 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
f0e0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
f0f0: 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
f100: 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
f110: 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
f120: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
f130: 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
f140: 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
f150: 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76 65 70  lite3pager_movep
f160: 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61  age() routine ca
f170: 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69  n leave a page i
f180: 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46  n the .** pNextF
f190: 72 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69  ree/pPrevFree li
f1a0: 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61  st that is not a
f1b0: 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73   part of any has
f1c0: 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  h-chain..*/.stat
f1d0: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61  ic void unlinkHa
f1e0: 73 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70  shChain(Pager *p
f1f0: 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50  Pager, PgHdr *pP
f200: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  g){.  if( pPg->p
f210: 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  gno==0 ){.    /*
f220: 20 49 66 20 74 68 65 20 70 61 67 65 20 6e 75 6d   If the page num
f230: 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74 68 65  ber is zero, the
f240: 6e 20 74 68 69 73 20 70 61 67 65 20 69 73 20 6e  n this page is n
f250: 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68 20 63  ot in any hash c
f260: 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72 65 74  hain. */.    ret
f270: 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  urn;.  }.  if( p
f280: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
f290: 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48  .    pPg->pNextH
f2a0: 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
f2b0: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 3b   pPg->pPrevHash;
f2c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
f2d0: 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20 20 20  pPrevHash ){.   
f2e0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f2f0: 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73  >aHash[pager_has
f300: 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21 3d 70  h(pPg->pgno)]!=p
f310: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
f320: 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48  PrevHash->pNextH
f330: 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ash = pPg->pNext
f340: 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Hash;.  }else{. 
f350: 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67 65 72     int h = pager
f360: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
f370: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
f380: 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3d 3d  ager->aHash[h]==
f390: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
f3a0: 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
f3b0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
f3c0: 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  }..  pPg->pgno =
f3d0: 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74   0;.  pPg->pNext
f3e0: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
f3f0: 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  vHash = 0;.}../*
f400: 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61 67  .** Unlink a pag
f410: 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 20  e from the free 
f420: 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20 6f  list (the list o
f430: 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65 72  f all pages wher
f440: 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61 6e  e nRef==0).** an
f450: 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68 20  d from its hash 
f460: 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e 2e  collision chain.
f470: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
f480: 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64 72  unlinkPage(PgHdr
f490: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
f4a0: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
f4b0: 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65 65  Pager;..  /* Kee
f4c0: 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e 63  p the pFirstSync
f4d0: 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e 74  ed pointer point
f4e0: 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73 74  ing at the first
f4f0: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70 61   synchronized pa
f500: 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 3d  ge */.  if( pPg=
f510: 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  =pPager->pFirstS
f520: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67 48  ynced ){.    PgH
f530: 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e 65  dr *p = pPg->pNe
f540: 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69 6c  xtFree;.    whil
f550: 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64 53  e( p && p->needS
f560: 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e  ync ){ p = p->pN
f570: 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20 70  extFree; }.    p
f580: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
f590: 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20 20  ced = p;.  }..  
f5a0: 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20 74  /* Unlink from t
f5b0: 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a 20  he freelist */. 
f5c0: 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46   if( pPg->pPrevF
f5d0: 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ree ){.    pPg->
f5e0: 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74  pPrevFree->pNext
f5f0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Free = pPg->pNex
f600: 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  tFree;.  }else{.
f610: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
f620: 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67 20  er->pFirst==pPg 
f630: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
f640: 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65  First = pPg->pNe
f650: 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69 66  xtFree;.  }.  if
f660: 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  ( pPg->pNextFree
f670: 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   ){.    pPg->pNe
f680: 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
f690: 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
f6a0: 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ee;.  }else{.   
f6b0: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
f6c0: 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a 20  >pLast==pPg );. 
f6d0: 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74     pPager->pLast
f6e0: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
f6f0: 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e  e;.  }.  pPg->pN
f700: 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  extFree = pPg->p
f710: 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a 20  PrevFree = 0;.. 
f720: 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
f730: 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74 61  the pgno hash ta
f740: 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48  ble */.  unlinkH
f750: 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c  ashChain(pPager,
f760: 20 70 50 67 29 3b 0a 7d 0a 0a 23 69 66 6e 64 65   pPg);.}..#ifnde
f770: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
f780: 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 54 68 69  MORYDB./*.** Thi
f790: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
f7a0: 64 20 74 6f 20 74 72 75 6e 63 61 74 65 20 61 6e  d to truncate an
f7b0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
f7c0: 61 73 65 2e 20 20 44 65 6c 65 74 65 0a 2a 2a 20  ase.  Delete.** 
f7d0: 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73 65 20  all pages whose 
f7e0: 70 67 6e 6f 20 69 73 20 6c 61 72 67 65 72 20 74  pgno is larger t
f7f0: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
f800: 7a 65 20 61 6e 64 20 69 73 20 75 6e 72 65 66 65  ze and is unrefe
f810: 72 65 6e 63 65 64 2e 0a 2a 2a 20 52 65 66 65 72  renced..** Refer
f820: 65 6e 63 65 64 20 70 61 67 65 73 20 6c 61 72 67  enced pages larg
f830: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
f840: 64 62 53 69 7a 65 20 61 72 65 20 7a 65 72 6f 65  dbSize are zeroe
f850: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
f860: 64 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65  d memoryTruncate
f870: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
f880: 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
f890: 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a 20   PgHdr **ppPg;. 
f8a0: 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70 50   int dbSize = pP
f8b0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
f8c0: 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72 2d   ppPg = &pPager-
f8d0: 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28 20  >pAll;.  while( 
f8e0: 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d 30  (pPg = *ppPg)!=0
f8f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d   ){.    if( pPg-
f900: 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29 7b  >pgno<=dbSize ){
f910: 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26 70  .      ppPg = &p
f920: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20  Pg->pNextAll;.  
f930: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67 2d    }else if( pPg-
f940: 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20 20  >nRef>0 ){.     
f950: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
f960: 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70  _DATA(pPg), 0, p
f970: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
f980: 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  ;.      ppPg = &
f990: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
f9a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f9b0: 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e 65  *ppPg = pPg->pNe
f9c0: 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 75 6e 6c  xtAll;.      unl
f9d0: 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20  inkPage(pPg);.  
f9e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
f9f0: 50 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65  Pg);.      pPage
fa00: 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a 20 20 20 20  r->nPage--;.    
fa10: 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 64  }.  }.}.#else.#d
fa20: 65 66 69 6e 65 20 6d 65 6d 6f 72 79 54 72 75 6e  efine memoryTrun
fa30: 63 61 74 65 28 70 29 0a 23 65 6e 64 69 66 0a 0a  cate(p).#endif..
fa40: 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62 74  /*.** Try to obt
fa50: 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61 20  ain a lock on a 
fa60: 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74 68  file.  Invoke th
fa70: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
fa80: 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20 69  if the lock.** i
fa90: 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74 20  s currently not 
faa0: 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70 65  available.  Repe
fab0: 61 74 65 20 75 6e 74 69 6c 20 74 68 65 20 62 75  ate until the bu
fac0: 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74 75  sy callback retu
fad0: 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72 20  rns.** false or 
fae0: 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20 73  until the lock s
faf0: 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20 52  ucceeds..**.** R
fb00: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
fb10: 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20 61  on success and a
fb20: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66 20  n error code if 
fb30: 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69 6e  we cannot obtain
fb40: 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a 2f  .** the lock..*/
fb50: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
fb60: 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 50  r_wait_on_lock(P
fb70: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e  ager *pPager, in
fb80: 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20 69  t locktype){.  i
fb90: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
fba0: 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d 53   PAGER_SHARED==S
fbb0: 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
fbc0: 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52 45  assert( PAGER_RE
fbd0: 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45 44  SERVED==RESERVED
fbe0: 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72  _LOCK );.  asser
fbf0: 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  t( PAGER_EXCLUSI
fc00: 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c 4f  VE==EXCLUSIVE_LO
fc10: 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  CK );.  if( pPag
fc20: 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b 74  er->state>=lockt
fc30: 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ype ){.    rc = 
fc40: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c  SQLITE_OK;.  }el
fc50: 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 75 73 79  se{.    int busy
fc60: 20 3d 20 31 3b 0a 20 20 20 20 42 75 73 79 48 61   = 1;.    BusyHa
fc70: 6e 64 6c 65 72 20 2a 70 48 3b 0a 20 20 20 20 64  ndler *pH;.    d
fc80: 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o {.      rc = s
fc90: 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
fca0: 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79  ager->fd, lockty
fcb0: 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28  pe);.    }while(
fcc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
fcd0: 20 26 26 20 0a 20 20 20 20 20 20 20 20 28 70 48   && .        (pH
fce0: 20 3d 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79   = pPager->pBusy
fcf0: 48 61 6e 64 6c 65 72 29 21 3d 30 20 26 26 20 0a  Handler)!=0 && .
fd00: 20 20 20 20 20 20 20 20 70 48 2d 3e 78 46 75 6e          pH->xFun
fd10: 63 20 26 26 20 70 48 2d 3e 78 46 75 6e 63 28 70  c && pH->xFunc(p
fd20: 48 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b 29  H->pArg, busy++)
fd30: 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
fd40: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
fd50: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73  .      pPager->s
fd60: 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b  tate = locktype;
fd70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
fd80: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
fd90: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66 69   Truncate the fi
fda0: 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72  le to the number
fdb0: 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69 66   of pages specif
fdc0: 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ied..*/.int sqli
fdd0: 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74  te3pager_truncat
fde0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
fdf0: 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
fe00: 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c 69 74 65  int rc;.  sqlite
fe10: 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
fe20: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
fe30: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
fe40: 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
fe50: 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
fe60: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
fe70: 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e   rc;.  }.  if( n
fe80: 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e 65 64 29  Page>=(unsigned)
fe90: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
fea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
feb0: 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
fec0: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 70  ( MEMDB ){.    p
fed0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
fee0: 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65 6d 6f 72  nPage;.    memor
fef0: 79 54 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  yTruncate(pPager
ff00: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
ff10: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72  LITE_OK;.  }.  r
ff20: 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
ff30: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
ff40: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
ff50: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ff60: 20 7d 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20   }..  /* Get an 
ff70: 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
ff80: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62  n the database b
ff90: 65 66 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67  efore truncating
ffa0: 2e 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65  . */.  rc = page
ffb0: 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70  r_wait_on_lock(p
ffc0: 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45  Pager, EXCLUSIVE
ffd0: 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63  _LOCK);.  if( rc
ffe0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
fff0: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
10000 7d 0a 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  }..  rc = pager_
10010 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
10020 20 6e 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72   nPage);.  if( r
10030 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10040 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
10050 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 7d 0a  ze = nPage;.  }.
10060 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
10070 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77 6e 20 74  /*.** Shutdown t
10080 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 20  he page cache.  
10090 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f 72 79 20  Free all memory 
100a0 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c 20 66 69  and close all fi
100b0 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 20  les..**.** If a 
100c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
100d0 69 6e 20 70 72 6f 67 72 65 73 73 20 77 68 65 6e  in progress when
100e0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
100f0 20 63 61 6c 6c 65 64 2c 20 74 68 61 74 0a 2a 2a   called, that.**
10100 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
10110 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 20 41 6c  rolled back.  Al
10120 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61  l outstanding pa
10130 67 65 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61  ges are invalida
10140 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68 65 69 72  ted.** and their
10150 20 6d 65 6d 6f 72 79 20 69 73 20 66 72 65 65 64   memory is freed
10160 2e 20 20 41 6e 79 20 61 74 74 65 6d 70 74 20 74  .  Any attempt t
10170 6f 20 75 73 65 20 61 20 70 61 67 65 20 61 73 73  o use a page ass
10180 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69 74 68 20  ociated.** with 
10190 74 68 69 73 20 70 61 67 65 20 63 61 63 68 65 20  this page cache 
101a0 61 66 74 65 72 20 74 68 69 73 20 66 75 6e 63 74  after this funct
101b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 77 69 6c 6c  ion returns will
101c0 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65 73 75 6c   likely.** resul
101d0 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
101e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
101f0 61 67 65 72 5f 63 6c 6f 73 65 28 50 61 67 65 72  ager_close(Pager
10200 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
10210 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b  dr *pPg, *pNext;
10220 0a 20 20 73 77 69 74 63 68 28 20 70 50 61 67 65  .  switch( pPage
10230 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20 20 20 20  r->state ){.    
10240 63 61 73 65 20 50 41 47 45 52 5f 52 45 53 45 52  case PAGER_RESER
10250 56 45 44 3a 0a 20 20 20 20 63 61 73 65 20 50 41  VED:.    case PA
10260 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a 20 20 20  GER_SYNCED: .   
10270 20 63 61 73 65 20 50 41 47 45 52 5f 45 58 43 4c   case PAGER_EXCL
10280 55 53 49 56 45 3a 20 7b 0a 20 20 20 20 20 20 2f  USIVE: {.      /
10290 2a 20 57 65 20 69 67 6e 6f 72 65 20 61 6e 79 20  * We ignore any 
102a0 49 4f 20 65 72 72 6f 72 73 20 74 68 61 74 20 6f  IO errors that o
102b0 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 65 20  ccur during the 
102c0 72 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a  rollback.      *
102d0 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 53 6f 20  * operation. So 
102e0 64 69 73 61 62 6c 65 20 49 4f 20 65 72 72 6f 72  disable IO error
102f0 20 73 69 6d 75 6c 61 74 69 6f 6e 20 73 6f 20 74   simulation so t
10300 68 61 74 20 74 65 73 74 69 6e 67 0a 20 20 20 20  hat testing.    
10310 20 20 2a 2a 20 77 6f 72 6b 73 20 6d 6f 72 65 20    ** works more 
10320 65 61 73 69 6c 79 2e 0a 20 20 20 20 20 20 2a 2f  easily..      */
10330 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
10340 49 54 45 5f 54 45 53 54 29 20 26 26 20 28 64 65  ITE_TEST) && (de
10350 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c  fined(OS_UNIX) |
10360 7c 20 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e  | defined(OS_WIN
10370 29 29 0a 20 20 20 20 20 20 65 78 74 65 72 6e 20  )).      extern 
10380 69 6e 74 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  int sqlite3_io_e
10390 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
103a0 20 20 20 20 69 6e 74 20 69 6f 65 72 72 5f 63 6e      int ioerr_cn
103b0 74 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65  t = sqlite3_io_e
103c0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20  rror_pending;.  
103d0 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65      sqlite3_io_e
103e0 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 2d  rror_pending = -
103f0 31 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  1;.#endif.      
10400 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
10410 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 23  lback(pPager);.#
10420 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10430 45 5f 54 45 53 54 29 20 26 26 20 28 64 65 66 69  E_TEST) && (defi
10440 6e 65 64 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20  ned(OS_UNIX) || 
10450 64 65 66 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29  defined(OS_WIN))
10460 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
10470 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67 20  o_error_pending 
10480 3d 20 69 6f 65 72 72 5f 63 6e 74 3b 0a 23 65 6e  = ioerr_cnt;.#en
10490 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 21 4d  dif.      if( !M
104a0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
104b0 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28  sqlite3OsUnlock(
104c0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f  &pPager->fd, NO_
104d0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LOCK);.      }. 
104e0 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
104f0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 7c 20  ger->errMask || 
10500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10510 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
10520 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
10530 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
10540 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
10550 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
10560 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
10570 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
10580 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
10590 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
105a0 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
105b0 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
105c0 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
105d0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
105e0 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
105f0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
10600 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65  g=pNext){.#ifnde
10610 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28  f NDEBUG.    if(
10620 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
10630 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
10640 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
10650 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
10660 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
10670 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
10680 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
10690 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
106a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
106b0 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
106c0 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
106d0 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
106e0 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
106f0 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
10700 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c    }.  TRACE2("CL
10710 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
10720 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 61  ID(pPager));.  a
10730 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65  ssert( pPager->e
10740 72 72 4d 61 73 6b 20 7c 7c 20 28 70 50 61 67 65  rrMask || (pPage
10750 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
10760 30 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 6d  0 && pPager->stm
10770 74 4f 70 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  tOpen==0) );.  i
10780 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
10790 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  alOpen ){.    sq
107a0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
107b0 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a  ager->jfd);.  }.
107c0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
107d0 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  mtOpen ){.    sq
107e0 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50  lite3OsClose(&pP
107f0 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d  ager->stfd);.  }
10800 0a 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73  .  sqlite3OsClos
10810 65 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a  e(&pPager->fd);.
10820 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
10830 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
10840 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
10850 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
10860 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
10870 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
10880 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
10890 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
108a0 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69 74   }.  */..  sqlit
108b0 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
108c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
108d0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
108e0 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
108f0 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
10900 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
10910 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  gno sqlite3pager
10920 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64  _pagenumber(void
10930 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
10940 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50  r *p = DATA_TO_P
10950 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
10960 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
10970 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
10980 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
10990 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
109a0 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
109b0 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
109c0 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
109d0 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
109e0 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
109f0 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
10a00 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
10a10 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
10a20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
10a30 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
10a40 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
10a50 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
10a60 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
10a70 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
10a80 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
10a90 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
10aa0 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
10ab0 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
10ac0 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
10ad0 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
10ae0 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
10af0 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
10b00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
10b10 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
10b20 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
10b30 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
10b40 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
10b50 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
10b60 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
10b70 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
10b80 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
10b90 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
10ba0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
10bb0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
10bc0 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
10bd0 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
10be0 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
10bf0 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
10c00 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
10c10 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
10c20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
10c30 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
10c40 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
10c50 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
10c60 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
10c70 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
10c80 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
10c90 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
10ca0 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
10cb0 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
10cc0 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
10cd0 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
10ce0 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
10cf0 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
10d00 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
10d10 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
10d20 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
10d30 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
10d40 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
10d50 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
10d60 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
10d70 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
10d80 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76 6f  EBUG.  static vo
10d90 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64  id page_ref(PgHd
10da0 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28  r *pPg){.    if(
10db0 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
10dc0 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66  .      _page_ref
10dd0 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  (pPg);.    }else
10de0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65  {.      pPg->nRe
10df0 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e  f++;.      REFIN
10e00 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20  FO(pPg);.    }. 
10e10 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e   }.#else.# defin
10e20 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20  e page_ref(P)   
10e30 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70  ((P)->nRef==0?_p
10e40 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64  age_ref(P):(void
10e50 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65  )(P)->nRef++).#e
10e60 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72  ndif../*.** Incr
10e70 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65  ement the refere
10e80 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20  nce count for a 
10e90 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74  page.  The input
10ea0 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61   pointer is.** a
10eb0 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   reference to th
10ec0 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  e page data..*/.
10ed0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
10ee0 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61  _ref(void *pData
10ef0 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
10f00 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
10f10 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72  pData);.  page_r
10f20 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72  ef(pPg);.  retur
10f30 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
10f40 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a  /*.** Sync the j
10f50 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65  ournal.  In othe
10f60 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75  r words, make su
10f70 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73  re all the pages
10f80 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65   that have.** be
10f90 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  en written to th
10fa0 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61  e journal have a
10fb0 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20  ctually reached 
10fc0 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74  the surface of t
10fd0 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20  he.** disk.  It 
10fe0 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d  is not safe to m
10ff0 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e  odify the origin
11000 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
11010 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20   until after.** 
11020 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
11030 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66  been synced.  If
11040 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
11050 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69  tabase is modifi
11060 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65  ed before.** the
11070 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
11080 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66  ed and a power f
11090 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74  ailure occurs, t
110a0 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72  he unsynced jour
110b0 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c  nal.** data woul
110c0 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65  d be lost and we
110d0 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65   would be unable
110e0 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72   to completely r
110f0 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64  ollback the.** d
11100 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e  atabase changes.
11110 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75    Database corru
11120 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75  ption would occu
11130 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72  r..** .** This r
11140 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61  outine also upda
11150 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65  tes the nRec fie
11160 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72  ld in the header
11170 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   of the journal.
11180 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74  .** (See comment
11190 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70  s on the pager_p
111a0 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e  layback() routin
111b0 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c  e for additional
111c0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a   information.).*
111d0 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f  * If the sync mo
111e0 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20  de is FULL, two 
111f0 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72  syncs will occur
11200 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f  .  First the who
11210 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73  le journal.** is
11220 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68   synced, then th
11230 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
11240 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20  updated, then a 
11250 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75  second sync occu
11260 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65  rs..**.** For te
11270 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65  mporary database
11280 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72  s, we do not car
11290 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65  e if we are able
112a0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
112b0 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61  after a power fa
112c0 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f  ilure, so sync o
112d0 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ccurs..**.** Thi
112e0 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73  s routine clears
112f0 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69   the needSync fi
11300 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67  eld of every pag
11310 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69  e current held i
11320 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a  n.** memory..*/.
11330 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a  static int syncJ
11340 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
11350 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
11360 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  pPg;.  int rc = 
11370 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a  SQLITE_OK;..  /*
11380 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   Sync the journa
11390 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69  l before modifyi
113a0 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  ng the main data
113b0 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d  base.  ** (assum
113c0 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a  ing there is a j
113d0 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65  ournal and it ne
113e0 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64  eds to be synced
113f0 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50  .).  */.  if( pP
11400 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
11410 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  {.    if( !pPage
11420 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20  r->tempFile ){. 
11430 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
11440 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
11450 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73   );.      /* ass
11460 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f  ert( !pPager->no
11470 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e  Sync ); // noSyn
11480 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69  c might be set i
11490 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20  f synchronous.  
114a0 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65      ** was turne
114b0 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20  d off after the 
114c0 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
114d0 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74  started.  Ticket
114e0 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66   #615 */.#ifndef
114f0 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a   NDEBUG.      {.
11500 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20          /* Make 
11510 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d  sure the pPager-
11520 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65  >nRec counter we
11530 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72   are keeping agr
11540 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77  ees.        ** w
11550 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d  ith the nRec com
11560 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73  puted from the s
11570 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
11580 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  al file..       
11590 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20   */.        i64 
115a0 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20  jSz;.        rc 
115b0 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
115c0 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
115d0 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20  , &jSz);.       
115e0 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74   if( rc!=0 ) ret
115f0 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
11600 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
11610 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20  journalOff==jSz 
11620 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
11630 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  f.      {.      
11640 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e    /* Write the n
11650 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74  Rec value into t
11660 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
11670 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20  header. If in.  
11680 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79        ** full-sy
11690 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20  nchronous mode, 
116a0 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
116b0 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73   first. This ens
116c0 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20  ures that.      
116d0 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61    ** all data ha
116e0 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65  s really hit the
116f0 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65   disk before nRe
11700 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20  c is updated to 
11710 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20  mark.        ** 
11720 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74  it as a candidat
11730 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20  e for rollback. 
11740 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
11750 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
11760 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
11770 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59        TRACE2("SY
11780 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64  NC journal of %d
11790 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
117a0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20  ger));.         
117b0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
117c0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
117d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
117e0 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20   rc!=0 ) return 
117f0 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rc;.        }.  
11800 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
11810 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
11820 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
11830 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a  lHdr + sizeof(aJ
11840 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20  ournalMagic));. 
11850 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
11860 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
11870 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52  >jfd, pPager->nR
11880 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ec);.        if(
11890 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
118a0 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ..        sqlite
118b0 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
118c0 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f  >jfd, pPager->jo
118d0 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20  urnalOff);.     
118e0 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28   }.      TRACE2(
118f0 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66  "SYNC journal of
11900 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
11910 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
11920 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
11930 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
11940 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
11950 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
11960 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
11970 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b  rnalStarted = 1;
11980 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
11990 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
119a0 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74  ..    /* Erase t
119b0 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67  he needSync flag
119c0 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65   from every page
119d0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72  ..    */.    for
119e0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
119f0 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d  l; pPg; pPg=pPg-
11a00 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20  >pNextAll){.    
11a10 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
11a20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  = 0;.    }.    p
11a30 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
11a40 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  ced = pPager->pF
11a50 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64  irst;.  }..#ifnd
11a60 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49  ef NDEBUG.  /* I
11a70 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64  f the Pager.need
11a80 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65  Sync flag is cle
11a90 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64  ar then the PgHd
11aa0 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20  r.needSync.  ** 
11ab0 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62  flag must also b
11ac0 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20  e clear for all 
11ad0 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74  pages.  Verify t
11ae0 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e  hat this.  ** in
11af0 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e  variant is true.
11b00 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20  .  */.  else{.  
11b10 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72    for(pPg=pPager
11b20 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67  ->pAll; pPg; pPg
11b30 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b  =pPg->pNextAll){
11b40 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
11b50 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
11b60 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
11b70 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
11b80 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65  rstSynced==pPage
11b90 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d  r->pFirst );.  }
11ba0 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72  .#endif..  retur
11bb0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  n rc;.}../*.** G
11bc0 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20 70  iven a list of p
11bd0 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64 20  ages (connected 
11be0 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44 69  by the PgHdr.pDi
11bf0 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72 69  rty pointer) wri
11c00 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65 20  te.** every one 
11c10 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20 6f  of those pages o
11c20 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ut to the databa
11c30 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72 6b  se file and mark
11c40 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20   them all.** as 
11c50 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  clean..*/.static
11c60 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74 65   int pager_write
11c70 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72 20  _pagelist(PgHdr 
11c80 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65 72  *pList){.  Pager
11c90 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20   *pPager;.  int 
11ca0 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73 74  rc;..  if( pList
11cb0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c  ==0 ) return SQL
11cc0 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
11cd0 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65 72   = pList->pPager
11ce0 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73 20  ;..  /* At this 
11cf0 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79 20  point there may 
11d00 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53 45  be either a RESE
11d10 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56  RVED or EXCLUSIV
11d20 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20  E lock on the.  
11d30 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
11d40 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6c  . If there is al
11d50 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53 49  ready an EXCLUSI
11d60 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f 6c  VE lock, the fol
11d70 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c  lowing.  ** call
11d80 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c 6f  s to sqlite3OsLo
11d90 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73 2e  ck() are no-ops.
11da0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e  .  **.  ** Movin
11db0 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d 20  g the lock from 
11dc0 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43 4c  RESERVED to EXCL
11dd0 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20 69  USIVE actually i
11de0 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20 20  nvolves going.  
11df0 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69 6e  ** through an in
11e00 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74 65  termediate state
11e10 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50 45   PENDING.   A PE
11e20 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76 65  NDING lock preve
11e30 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65 61  nts new.  ** rea
11e40 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63 68  ders from attach
11e50 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
11e60 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75 66  ase but is unsuf
11e70 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20 74  ficient for us t
11e80 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20 54  o.  ** write.  T
11e90 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45 4e  he idea of a PEN
11ea0 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f 20  DING lock is to 
11eb0 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61 64  prevent new read
11ec0 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f  ers from.  ** co
11ed0 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77 65  ming in while we
11ee0 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74 69   wait for existi
11ef0 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63 6c  ng readers to cl
11f00 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57  ear..  **.  ** W
11f10 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20 69  hile the pager i
11f20 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56 45  s in the RESERVE
11f30 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72 69  D state, the ori
11f40 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66  ginal database f
11f50 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63 68  ile.  ** is unch
11f60 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61 6e  anged and we can
11f70 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f 75   rollback withou
11f80 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61 79  t having to play
11f90 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a 6f  back the.  ** jo
11fa0 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20 6f  urnal into the o
11fb0 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
11fc0 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65 20   file.  Once we 
11fd0 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20 20  transition to.  
11fe0 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69 74  ** EXCLUSIVE, it
11ff0 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61 62   means the datab
12000 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65 65  ase file has bee
12010 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61 6e  n changed and an
12020 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20  y rollback.  ** 
12030 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20 6a  will require a j
12040 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b 2e  ournal playback.
12050 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67  .  */.  rc = pag
12060 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
12070 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56  pPager, EXCLUSIV
12080 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72  E_LOCK);.  if( r
12090 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
120a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
120b0 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c 69   }..  while( pLi
120c0 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  st ){.    assert
120d0 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20 29  ( pList->dirty )
120e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  ;.    sqlite3OsS
120f0 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  eek(&pPager->fd,
12100 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
12110 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
12120 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 2f 2a 20  geSize);.    /* 
12130 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69 72  If there are dir
12140 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  ty pages in the 
12150 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68 20  page cache with 
12160 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72 65  page numbers gre
12170 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ater.    ** than
12180 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20 74   Pager.dbSize, t
12190 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74 65  his means sqlite
121a0 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28  3pager_truncate(
121b0 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f 0a  ) was called to.
121c0 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65 20      ** make the 
121d0 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70 72  file smaller (pr
121e0 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74 6f  esumably by auto
121f0 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20 44  -vacuum code). D
12200 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20 20  o not write.    
12210 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67 65  ** any such page
12220 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a 20  s to the file.. 
12230 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 4c     */.    if( pL
12240 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65  ist->pgno<=pPage
12250 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
12260 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
12270 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12280 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
12290 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54 52  no, 6);.      TR
122a0 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20 70  ACE3("STORE %d p
122b0 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
122c0 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69 73  ID(pPager), pLis
122d0 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  t->pgno);.      
122e0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
122f0 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ite(&pPager->fd,
12300 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
12310 4c 69 73 74 29 2c 20 70 50 61 67 65 72 2d 3e 70  List), pPager->p
12320 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
12330 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
12340 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73  HDR_TO_DATA(pLis
12350 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c  t), pList->pgno,
12360 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65   0);.      pPage
12370 72 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20 20  r->nWrite++;.   
12380 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55   }.#ifndef NDEBU
12390 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  G.    else{.    
123a0 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f 52    TRACE3("NOSTOR
123b0 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  E %d page %d\n",
123c0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
123d0 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a  , pList->pgno);.
123e0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
123f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
12400 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e   rc;.    pList->
12410 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64 65  dirty = 0;.#ifde
12420 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50  f SQLITE_CHECK_P
12430 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d 3e  AGES.    pList->
12440 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
12450 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74 29  _pagehash(pList)
12460 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c 69  ;.#endif.    pLi
12470 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72  st = pList->pDir
12480 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ty;.  }.  return
12490 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
124a0 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65  *.** Collect eve
124b0 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69 6e  ry dirty page in
124c0 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74 20  to a dirty list 
124d0 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20  and.** return a 
124e0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68  pointer to the h
124f0 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74  ead of that list
12500 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65  .  All pages are
12510 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76  .** collected ev
12520 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20 73  en if they are s
12530 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a  till in use..*/.
12540 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61  static PgHdr *pa
12550 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
12560 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a 70  y_pages(Pager *p
12570 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
12580 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c  *p, *pList;.  pL
12590 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70  ist = 0;.  for(p
125a0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
125b0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
125c0 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72  {.    if( p->dir
125d0 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70  ty ){.      p->p
125e0 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20  Dirty = pList;. 
125f0 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a       pList = p;.
12600 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
12610 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
12620 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69  ** Return TRUE i
12630 66 20 74 68 65 72 65 20 69 73 20 61 20 68 6f 74  f there is a hot
12640 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 65 20   journal on the 
12650 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
12660 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20 69 73  A hot journal is
12670 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64 73 20   one that needs 
12680 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
12690 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
126a0 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
126b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
126c0 65 20 69 73 20 30 20 62 75 74 20 61 20 6a 6f 75  e is 0 but a jou
126d0 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65 78 69  rnal file.** exi
126e0 73 74 73 2c 20 74 68 61 74 20 69 73 20 70 72 6f  sts, that is pro
126f0 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a 6f 75  bably an old jou
12700 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72 20 66  rnal left over f
12710 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a 20 64  rom a prior.** d
12720 61 74 61 62 61 73 65 20 77 69 74 68 20 74 68 65  atabase with the
12730 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a 75 73   same name.  Jus
12740 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  t delete the jou
12750 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
12760 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72 6e 61  int hasHotJourna
12770 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  l(Pager *pPager)
12780 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  {.  if( !pPager-
12790 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20 72 65  >useJournal ) re
127a0 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
127b0 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73  qlite3OsFileExis
127c0 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  ts(pPager->zJour
127d0 6e 61 6c 29 20 29 20 72 65 74 75 72 6e 20 30 3b  nal) ) return 0;
127e0 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73  .  if( sqlite3Os
127f0 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63  CheckReservedLoc
12800 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29 20 29  k(&pPager->fd) )
12810 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
12820 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61   sqlite3pager_pa
12830 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3d  gecount(pPager)=
12840 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
12850 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
12860 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
12870 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
12880 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  se{.    return 1
12890 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ;.  }.}../*.** A
128a0 63 71 75 69 72 65 20 61 20 70 61 67 65 2e 0a 2a  cquire a page..*
128b0 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f 63 6b  *.** A read lock
128c0 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66 69 6c   on the disk fil
128d0 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 77 68  e is obtained wh
128e0 65 6e 20 74 68 65 20 66 69 72 73 74 20 70 61 67  en the first pag
128f0 65 20 69 73 20 61 63 71 75 69 72 65 64 2e 20 0a  e is acquired. .
12900 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c 6f 63  ** This read loc
12910 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77 68 65  k is dropped whe
12920 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20  n the last page 
12930 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a 2a 0a  is released..**.
12940 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b 73 20  ** A _get works 
12950 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e 75 6d  for any page num
12960 62 65 72 20 67 72 65 61 74 65 72 20 74 68 61 6e  ber greater than
12970 20 30 2e 20 20 49 66 20 74 68 65 20 64 61 74 61   0.  If the data
12980 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69 73 20  base.** file is 
12990 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
129a0 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 2c   requested page,
129b0 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61 6c 20   then no actual 
129c0 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f 63 63  disk.** read occ
129d0 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65 6d 6f  urs and the memo
129e0 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68 65 20  ry image of the 
129f0 70 61 67 65 20 69 73 20 69 6e 69 74 69 61 6c 69  page is initiali
12a00 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20 7a 65  zed to.** all ze
12a10 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72 61 20  ros.  The extra 
12a20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20 74 6f  data appended to
12a30 20 61 20 70 61 67 65 20 69 73 20 61 6c 77 61 79   a page is alway
12a40 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a 2a 2a  s initialized.**
12a50 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20 66 69   to zeros the fi
12a60 72 73 74 20 74 69 6d 65 20 61 20 70 61 67 65 20  rst time a page 
12a70 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f 20 6d  is loaded into m
12a80 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  emory..**.** The
12a90 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d 69 67   acquisition mig
12aa0 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65 76 65  ht fail for seve
12ab0 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20 49 6e  ral reasons.  In
12ac0 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a 20 61   all cases,.** a
12ad0 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20 65 72  n appropriate er
12ae0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
12af0 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61 67 65  rned and *ppPage
12b00 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c 4c 2e   is set to NULL.
12b10 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73 6f 20  .**.** See also 
12b20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f  sqlite3pager_loo
12b30 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74 68 69  kup().  Both thi
12b40 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20 5f 6c  s routine and _l
12b50 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70 74 0a  ookup() attempt.
12b60 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70 61 67  ** to find a pag
12b70 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  e in the in-memo
12b80 72 79 20 63 61 63 68 65 20 66 69 72 73 74 2e 20  ry cache first. 
12b90 20 49 66 20 74 68 65 20 70 61 67 65 20 69 73 20   If the page is 
12ba0 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a 20 69  not already.** i
12bb0 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73 20 72  n memory, this r
12bc0 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f 20 64  outine goes to d
12bd0 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74 20 69  isk to read it i
12be0 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f 6b 75  n whereas _looku
12bf0 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65 74 75  p().** just retu
12c00 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72 6f 75  rns 0.  This rou
12c10 74 69 6e 65 20 61 63 71 75 69 72 65 73 20 61 20  tine acquires a 
12c20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20 66 69  read-lock the fi
12c30 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a 20 68  rst time it.** h
12c40 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69 73 6b  as to go to disk
12c50 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c 73 6f  , and could also
12c60 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f 6c 64   playback an old
12c70 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65 63 65   journal if nece
12c80 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63 65 20  ssary..** Since 
12c90 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65 72 20  _lookup() never 
12ca0 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20 69 74  goes to disk, it
12cb0 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20 64 65   never has to de
12cc0 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a 2a 2a  al with locks.**
12cd0 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   or journal file
12ce0 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
12cf0 33 70 61 67 65 72 5f 67 65 74 28 50 61 67 65 72  3pager_get(Pager
12d00 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
12d10 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70 50 61  gno, void **ppPa
12d20 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ge){.  PgHdr *pP
12d30 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  g;.  int rc;..  
12d40 2f 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 70  /* The maximum p
12d50 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 32 5e  age number is 2^
12d60 33 31 2e 20 52 65 74 75 72 6e 20 53 51 4c 49 54  31. Return SQLIT
12d70 45 5f 43 4f 52 52 55 50 54 20 69 66 20 61 20 70  E_CORRUPT if a p
12d80 61 67 65 0a 20 20 2a 2a 20 6e 75 6d 62 65 72 20  age.  ** number 
12d90 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 69  greater than thi
12da0 73 2c 20 6f 72 20 7a 65 72 6f 2c 20 69 73 20 72  s, or zero, is r
12db0 65 71 75 65 73 74 65 64 2e 0a 20 20 2a 2f 0a 20  equested..  */. 
12dc0 20 69 66 28 20 70 67 6e 6f 3e 50 41 47 45 52 5f   if( pgno>PAGER_
12dd0 4d 41 58 5f 50 47 4e 4f 20 7c 7c 20 70 67 6e 6f  MAX_PGNO || pgno
12de0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
12df0 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  n SQLITE_CORRUPT
12e00 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4d 61 6b 65  ;.  }..  /* Make
12e10 20 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f   sure we have no
12e20 74 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63  t hit any critic
12e30 61 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20  al errors..  */ 
12e40 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
12e50 72 21 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67  r!=0 );.  *ppPag
12e60 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  e = 0;.  if( pPa
12e70 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e  ger->errMask & ~
12e80 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29  (PAGER_ERR_FULL)
12e90 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
12ea0 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
12eb0 67 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ger);.  }..  /* 
12ec0 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
12ed0 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
12ee0 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
12ef0 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
12f00 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
12f10 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  file..  */.  if(
12f20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
12f30 20 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20   && !MEMDB ){.  
12f40 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6e    if( !pPager->n
12f50 6f 52 65 61 64 6c 6f 63 6b 20 29 7b 0a 20 20 20  oReadlock ){.   
12f60 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61     rc = pager_wa
12f70 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65  it_on_lock(pPage
12f80 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b  r, SHARED_LOCK);
12f90 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
12fa0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12fb0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12fc0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
12fd0 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61    /* If a journa
12fe0 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61  l file exists, a
12ff0 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52  nd there is no R
13000 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20  ESERVED lock on 
13010 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62  the.    ** datab
13020 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69  ase file, then i
13030 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74  t either needs t
13040 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b  o be played back
13050 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   or deleted..   
13060 20 2a 2f 0a 20 20 20 20 69 66 28 20 68 61 73 48   */.    if( hasH
13070 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  otJournal(pPager
13080 29 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20  ) ){.       int 
13090 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  rc;..       /* G
130a0 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
130b0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
130c0 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
130d0 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
130e0 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
130f0 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
13100 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
13110 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
13120 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
13130 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
13140 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
13150 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
13160 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
13170 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
13180 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
13190 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
131a0 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
131b0 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a  hat the.       *
131c0 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
131d0 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
131e0 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
131f0 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
13200 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63  t .       ** bac
13210 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  k..       ** .  
13220 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
13230 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
13240 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
13250 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
13260 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73   the.       ** s
13270 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
13280 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
13290 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
132a0 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
132b0 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
132c0 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
132d0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
132e0 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
132f0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
13300 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
13310 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  &pPager->fd, EXC
13320 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
13330 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
13340 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
13350 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
13360 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
13370 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
13380 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
13390 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
133a0 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
133b0 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
133c0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
133d0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
133e0 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  SIVE;..       /*
133f0 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
13400 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
13410 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
13420 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
13430 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
13440 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
13450 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
13460 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a       **.       *
13470 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
13480 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
13490 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
134a0 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
134b0 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
134c0 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
134d0 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
134e0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
134f0 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20  lds.       ** a 
13500 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74  write lock, so t
13510 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
13520 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20  y chance of two 
13530 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a  or more.       *
13540 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e  * processes open
13550 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
13560 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
13570 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
13580 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
13590 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50  sOpenReadOnly(pP
135a0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
135b0 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
135c0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
135d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
135e0 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
135f0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
13600 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
13610 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
13620 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
13630 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
13640 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
13650 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
13660 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
13670 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70  en = 1;.       p
13680 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
13690 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
136a0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
136b0 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
136c0 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
136d0 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  er = 0;.       p
136e0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
136f0 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  r = 0;..       /
13700 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
13710 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
13720 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
13730 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
13740 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
13750 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
13760 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
13770 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
13780 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
13790 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28  ger);.       if(
137a0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
137b0 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
137c0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
137d0 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30     }.    pPg = 0
137e0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
137f0 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67  * Search for pag
13800 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  e in cache */.  
13810 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
13820 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
13830 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  o);.    if( MEMD
13840 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  B && pPager->sta
13850 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
13860 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
13870 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
13880 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
13890 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
138a0 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
138b0 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
138c0 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
138d0 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
138e0 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   h;.    pPager->
138f0 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28  nMiss++;.    if(
13900 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
13910 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
13920 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
13930 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
13940 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
13950 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
13960 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
13970 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
13980 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
13990 3e 70 73 41 6c 69 67 6e 65 64 0a 20 20 20 20 20  >psAligned.     
139a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139b0 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
139c0 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
139d0 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
139e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
139f0 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
13a00 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
13a10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
13a20 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
13a30 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c  Pager->errMask |
13a40 3d 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b  = PAGER_ERR_MEM;
13a50 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
13a60 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
13a70 20 20 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73      }.      mems
13a80 65 74 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f  et(pPg, 0, sizeo
13a90 66 28 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20  f(*pPg));.      
13aa0 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
13ab0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
13ac0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
13ad0 50 61 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f  Pager), 0, sizeo
13ae0 66 28 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20  f(PgHistory));. 
13af0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
13b00 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65  ->pPager = pPage
13b10 72 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e  r;.      pPg->pN
13b20 65 78 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d  extAll = pPager-
13b30 3e 70 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61  >pAll;.      pPa
13b40 67 65 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b  ger->pAll = pPg;
13b50 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
13b60 50 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 69 66  Page++;.      if
13b70 28 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3e  ( pPager->nPage>
13b80 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50 61 67 65  pPager->nMaxPage
13b90 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65   ){.        asse
13ba0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78  rt( pPager->nMax
13bb0 50 61 67 65 3d 3d 28 70 50 61 67 65 72 2d 3e 6e  Page==(pPager->n
13bc0 50 61 67 65 2d 31 29 20 29 3b 0a 20 20 20 20 20  Page-1) );.     
13bd0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4d 61 78 50     pPager->nMaxP
13be0 61 67 65 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  age++;.      }. 
13bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13c00 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20 74  /* Find a page t
13c10 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20  o recycle.  Try 
13c20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65  to locate a page
13c30 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20   that does not. 
13c40 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20       ** require 
13c50 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e  us to do an fsyn
13c60 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e  c() on the journ
13c70 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  al..      */.   
13c80 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
13c90 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a  >pFirstSynced;..
13ca0 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63        /* If we c
13cb0 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20  ould not find a 
13cc0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
13cd0 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20 66 73  ot require an fs
13ce0 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f  ync().      ** o
13cf0 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
13d00 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68  le then fsync th
13d10 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
13d20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20 20 20   This is a.     
13d30 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70   ** very slow op
13d40 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77  eration, so we w
13d50 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69  ork hard to avoi
13d60 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74  d it.  But somet
13d70 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74  imes.      ** it
13d80 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64   can't be helped
13d90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
13da0 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20   if( pPg==0 ){. 
13db0 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
13dc0 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
13dd0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  er);.        if(
13de0 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13df0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
13e00 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
13e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
13e20 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52  urn SQLITE_IOERR
13e30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
13e40 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
13e50 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20  fullSync ){.    
13e60 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66        /* If in f
13e70 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77  ull-sync mode, w
13e80 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e  rite a new journ
13e90 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74  al header into t
13ea0 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  he..  ** journal
13eb0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
13ec0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
13ed0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
13ee0 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64  urnal..  ** head
13ef0 65 72 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c  er that is invol
13f00 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62  ved in the rollb
13f10 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61  ack of pages tha
13f20 74 20 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72  t have..  ** alr
13f30 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
13f40 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  n to the databas
13f50 65 20 28 69 6e 20 63 61 73 65 20 74 68 65 20 68  e (in case the h
13f60 65 61 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74  eader is..  ** t
13f70 72 61 73 68 65 64 20 77 68 65 6e 20 74 68 65 20  rashed when the 
13f80 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75 70  nRec field is up
13f90 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20  dated)..        
13fa0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70    */.          p
13fb0 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b  Pager->nRec = 0;
13fc0 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
13fd0 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
13fe0 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20  alOff > 0 );.   
13ff0 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74         rc = writ
14000 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  eJournalHdr(pPag
14010 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  er);.          i
14020 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
14030 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14040 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
14050 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
14060 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
14070 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20  _IOERR;.        
14080 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
14090 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67        pPg = pPag
140a0 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20  er->pFirst;.    
140b0 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74    }.      assert
140c0 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
140d0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74  ;..      /* Writ
140e0 65 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  e the page to th
140f0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
14100 69 66 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a  if it is dirty..
14110 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
14120 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b  f( pPg->dirty ){
14130 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
14140 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d   pPg->needSync==
14150 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67  0 );.        pPg
14160 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20  ->pDirty = 0;.  
14170 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14180 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
14190 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20   pPg );.        
141a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
141b0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  K ){.          s
141c0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
141d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
141e0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
141f0 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20  QLITE_IOERR;.   
14200 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
14210 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
14220 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20  ->dirty==0 );.. 
14230 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70       /* If the p
14240 61 67 65 20 77 65 20 61 72 65 20 72 65 63 79 63  age we are recyc
14250 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61  ling is marked a
14260 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
14270 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20  , then.      ** 
14280 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61  set the global a
14290 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
142a0 61 67 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69  ag, thus disabli
142b0 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ng the.      ** 
142c0 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c  sqlite_dont_roll
142d0 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74  back() optimizat
142e0 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74  ion for the rest
142f0 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73 61 63   of this transac
14300 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49  tion..      ** I
14310 74 20 69 73 20 6e 65 63 65 73 73 61 72 79 20 74  t is necessary t
14320 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61 75 73  o do this becaus
14330 65 20 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65  e the page marke
14340 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  d alwaysRollback
14350 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20  .      ** might 
14360 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61  be reloaded at a
14370 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75 74 20   later time but 
14380 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65  at that point we
14390 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a   won't remember.
143a0 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73        ** that is
143b0 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61   was marked alwa
143c0 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69  ysRollback.  Thi
143d0 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c  s means that all
143e0 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20   pages must.    
143f0 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61    ** be marked a
14400 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  s alwaysRollback
14410 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75   from here on ou
14420 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  t..      */.    
14430 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
14440 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20  sRollback ){.   
14450 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77       pPager->alw
14460 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b  aysRollback = 1;
14470 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
14480 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
14490 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
144a0 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
144b0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20  e hash table.   
144c0 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69     */.      unli
144d0 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20  nkPage(pPg);.   
144e0 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c     pPager->nOvfl
144f0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  ++;.    }.    pP
14500 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a  g->pgno = pgno;.
14510 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14520 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  aInJournal && (i
14530 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
14540 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20  >origDbSize ){. 
14550 20 20 20 20 20 73 71 6c 69 74 65 33 43 68 65 63       sqlite3Chec
14560 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e  kMemory(pPager->
14570 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f  aInJournal, pgno
14580 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  /8);.      asser
14590 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
145a0 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20  alOpen );.      
145b0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
145c0 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75   (pPager->aInJou
145d0 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  rnal[pgno/8] & (
145e0 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
145f0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
14600 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
14610 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
14620 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
14630 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
14640 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
14650 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61     if( pPager->a
14660 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70  InStmt && (int)p
14670 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
14680 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20  tSize.          
14690 20 20 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61     && (pPager->a
146a0 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26  InStmt[pgno/8] &
146b0 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
146c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  =0 ){.      page
146d0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
146e0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  t(pPg);.    }els
146f0 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65  e{.      page_re
14700 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c  move_from_stmt_l
14710 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  ist(pPg);.    }.
14720 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d      pPg->dirty =
14730 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65   0;.    pPg->nRe
14740 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e  f = 1;.    REFIN
14750 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61  FO(pPg);.    pPa
14760 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  ger->nRef++;.   
14770 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28   h = pager_hash(
14780 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e  pgno);.    pPg->
14790 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 61 67  pNextHash = pPag
147a0 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20  er->aHash[h];.  
147b0 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b    pPager->aHash[
147c0 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66  h] = pPg;.    if
147d0 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
147e0 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
147f0 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  ( pPg->pNextHash
14800 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29  ->pPrevHash==0 )
14810 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  ;.      pPg->pNe
14820 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73  xtHash->pPrevHas
14830 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  h = pPg;.    }. 
14840 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
14850 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20  Extra>0 ){.     
14860 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
14870 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
14880 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
14890 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20  nExtra);.    }. 
148a0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65     if( pPager->e
148b0 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20  rrMask!=0 ){.   
148c0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
148d0 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
148e0 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
148f0 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72 63   rc = pager_errc
14900 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ode(pPager);.   
14910 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
14920 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
14930 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
14940 6e 74 28 70 50 61 67 65 72 29 3c 28 69 6e 74 29  nt(pPager)<(int)
14950 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d 65  pgno ){.      me
14960 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
14970 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
14980 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14990 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
149a0 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61 73  int rc;.      as
149b0 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29  sert( MEMDB==0 )
149c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f  ;.      sqlite3O
149d0 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66  sSeek(&pPager->f
149e0 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34  d, (pgno-1)*(i64
149f0 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  )pPager->pageSiz
14a00 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
14a10 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
14a20 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52 5f  ager->fd, PGHDR_
14a30 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
14a40 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14a50 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 46  .      TRACE3("F
14a60 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64 5c  ETCH %d page %d\
14a70 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
14a80 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
14a90 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
14aa0 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
14ab0 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
14ac0 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69 66  no, 3);.      if
14ad0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14ae0 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20 66  ){.        i64 f
14af0 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  ileSize;.       
14b00 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
14b10 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e  leSize(&pPager->
14b20 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d 53  fd,&fileSize)!=S
14b30 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20  QLITE_OK.       
14b40 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65 53          || fileS
14b50 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65 72  ize>=pgno*pPager
14b60 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20  ->pageSize ){.  
14b70 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
14b80 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44 52  ager_unref(PGHDR
14b90 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b 0a  _TO_DATA(pPg));.
14ba0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14bb0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   rc;.        }el
14bc0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65  se{.          me
14bd0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41  mset(PGHDR_TO_DA
14be0 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67  TA(pPg), 0, pPag
14bf0 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
14c00 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
14c10 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50  else{.        pP
14c20 61 67 65 72 2d 3e 6e 52 65 61 64 2b 2b 3b 0a 20  ager->nRead++;. 
14c30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 69 66       }.    }.#if
14c40 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
14c50 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
14c60 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
14c70 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
14c80 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a  #endif.  }else{.
14c90 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65      /* The reque
14ca0 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e 20  sted page is in 
14cb0 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20  the page cache. 
14cc0 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  */.    pPager->n
14cd0 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f  Hit++;.    page_
14ce0 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ref(pPg);.  }.  
14cf0 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f  *ppPage = PGHDR_
14d00 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
14d10 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
14d20 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69  ;.}../*.** Acqui
14d30 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74 20  re a page if it 
14d40 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68  is already in th
14d50 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
14d60 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65  e.  Do.** not re
14d70 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d  ad the page from
14d80 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61   disk.  Return a
14d90 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14da0 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66  page,.** or 0 if
14db0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
14dc0 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a   in cache..**.**
14dd0 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65   See also sqlite
14de0 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54  3pager_get().  T
14df0 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62 65  he difference be
14e00 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69  tween this routi
14e10 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65  ne.** and sqlite
14e20 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73 20  3pager_get() is 
14e30 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c  that _get() will
14e40 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20   go to the disk 
14e50 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74  and read.** in t
14e60 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20 70  he page if the p
14e70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
14e80 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68  dy in cache.  Th
14e90 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65  is routine.** re
14ea0 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68  turns NULL if th
14eb0 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e  e page is not in
14ec0 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20 64   cache or if a d
14ed0 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a  isk I/O error .*
14ee0 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70 65  * has ever happe
14ef0 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71  ned..*/.void *sq
14f00 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75  lite3pager_looku
14f10 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  p(Pager *pPager,
14f20 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
14f30 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73  gHdr *pPg;..  as
14f40 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
14f50 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e  );.  assert( pgn
14f60 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50  o!=0 );.  if( pP
14f70 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
14f80 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ~(PAGER_ERR_FULL
14f90 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
14fa0 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70  0;.  }.  pPg = p
14fb0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
14fc0 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
14fd0 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e   pPg==0 ) return
14fe0 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70   0;.  page_ref(p
14ff0 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47  Pg);.  return PG
15000 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
15010 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61  ;.}../*.** Relea
15020 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  se a page..**.**
15030 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   If the number o
15040 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20  f references to 
15050 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f  the page drop to
15060 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a   zero, then the.
15070 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65 64  ** page is added
15080 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74   to the LRU list
15090 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65  .  When all refe
150a0 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61  rences to all pa
150b0 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61  ges.** are relea
150c0 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20  sed, a rollback 
150d0 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c  occurs and the l
150e0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
150f0 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65  ase is.** remove
15100 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
15110 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69  3pager_unref(voi
15120 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
15130 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44  dr *pPg;..  /* D
15140 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66  ecrement the ref
15150 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72  erence count for
15160 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a   this page.  */.
15170 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f    pPg = DATA_TO_
15180 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15190 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
151a0 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52  f>0 );.  pPg->nR
151b0 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28  ef--;.  REFINFO(
151c0 70 50 67 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  pPg);..  CHECK_P
151d0 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
151e0 57 68 65 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  When the number 
151f0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
15200 20 61 20 70 61 67 65 20 72 65 61 63 68 20 30 2c   a page reach 0,
15210 20 63 61 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64   call the.  ** d
15220 65 73 74 72 75 63 74 6f 72 20 61 6e 64 20 61 64  estructor and ad
15230 64 20 74 68 65 20 70 61 67 65 20 74 6f 20 74 68  d the page to th
15240 65 20 66 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f  e freelist..  */
15250 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
15260 3d 3d 30 20 29 7b 0a 20 20 20 20 50 61 67 65 72  ==0 ){.    Pager
15270 20 2a 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50   *pPager;.    pP
15280 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
15290 65 72 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  er;.    pPg->pNe
152a0 78 74 46 72 65 65 20 3d 20 30 3b 0a 20 20 20 20  xtFree = 0;.    
152b0 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
152c0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a   pPager->pLast;.
152d0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
152e0 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28  t = pPg;.    if(
152f0 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20   pPg->pPrevFree 
15300 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  ){.      pPg->pP
15310 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46 72  revFree->pNextFr
15320 65 65 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65  ee = pPg;.    }e
15330 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 61 67 65  lse{.      pPage
15340 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 3b  r->pFirst = pPg;
15350 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
15360 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
15370 26 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  && pPager->pFirs
15380 74 53 79 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20  tSynced==0 ){.  
15390 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
153a0 73 74 53 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a  stSynced = pPg;.
153b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
153c0 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f  ager->xDestructo
153d0 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  r ){.      pPage
153e0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70  r->xDestructor(p
153f0 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
15400 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
15410 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c   .    /* When al
15420 6c 20 70 61 67 65 73 20 72 65 61 63 68 20 74 68  l pages reach th
15430 65 20 66 72 65 65 6c 69 73 74 2c 20 64 72 6f 70  e freelist, drop
15440 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 20 66   the read lock f
15450 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68 65 20 64  rom.    ** the d
15460 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
15470 20 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d    */.    pPager-
15480 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73  >nRef--;.    ass
15490 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
154a0 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20  f>=0 );.    if( 
154b0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20  pPager->nRef==0 
154c0 26 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  && !MEMDB ){.   
154d0 20 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70     pager_reset(p
154e0 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
154f0 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  }.  return SQLIT
15500 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  E_OK;.}../*.** C
15510 72 65 61 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20  reate a journal 
15520 66 69 6c 65 20 66 6f 72 20 70 50 61 67 65 72 2e  file for pPager.
15530 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64 20 61    There should a
15540 6c 72 65 61 64 79 20 62 65 20 61 20 52 45 53 45  lready be a RESE
15550 52 56 45 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55  RVED.** or EXCLU
15560 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
15570 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 77   database file w
15580 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
15590 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a   is called..**.*
155a0 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
155b0 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67  OK if everything
155c0 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 65 72 72  .  Return an err
155d0 6f 72 20 63 6f 64 65 20 61 6e 64 20 72 65 6c 65  or code and rele
155e0 61 73 65 20 74 68 65 0a 2a 2a 20 77 72 69 74 65  ase the.** write
155f0 20 6c 6f 63 6b 20 69 66 20 61 6e 79 74 68 69 6e   lock if anythin
15600 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f  g goes wrong..*/
15610 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
15620 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50  r_open_journal(P
15630 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
15640 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72   int rc;.  asser
15650 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61  t( !MEMDB );.  a
15660 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15670 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
15680 52 56 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74  RVED );.  assert
15690 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
156a0 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73  lOpen==0 );.  as
156b0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 75 73  sert( pPager->us
156c0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71  eJournal );.  sq
156d0 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
156e0 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
156f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15700 61 6c 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  al = sqliteMallo
15710 63 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  c( pPager->dbSiz
15720 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20 69 66 28  e/8 + 1 );.  if(
15730 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
15740 6e 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63  nal==0 ){.    rc
15750 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
15760 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65 64  .    goto failed
15770 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  _to_open_journal
15780 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
15790 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
157a0 69 76 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  ive(pPager->zJou
157b0 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
157c0 66 64 2c 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  fd,pPager->tempF
157d0 69 6c 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ile);.  pPager->
157e0 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
157f0 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73    pPager->setMas
15800 74 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ter = 0;.  pPage
15810 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20  r->journalHdr = 
15820 30 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  0;.  if( rc!=SQL
15830 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
15840 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
15850 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
15860 20 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70 50   SET_FULLSYNC(pP
15870 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
15880 72 2d 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20  r->fullSync);.  
15890 53 45 54 5f 46 55 4c 4c 53 59 4e 43 28 70 50 61  SET_FULLSYNC(pPa
158a0 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d  ger->fd, pPager-
158b0 3e 66 75 6c 6c 53 79 6e 63 29 3b 0a 20 20 73 71  >fullSync);.  sq
158c0 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
158d0 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
158e0 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
158f0 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
15900 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
15910 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
15920 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
15930 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
15940 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
15950 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
15960 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
15970 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
15980 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
15990 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
159a0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
159b0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
159c0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
159d0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
159e0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
159f0 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
15a00 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
15a10 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
15a20 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
15a30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
15a40 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
15a50 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
15a60 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
15a70 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15a80 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
15a90 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
15aa0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
15ab0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
15ac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
15ad0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
15ae0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
15af0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
15b00 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
15b10 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
15b20 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
15b30 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
15b40 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  al = 0;.  sqlite
15b50 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
15b60 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
15b70 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
15b80 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
15b90 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15ba0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
15bb0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
15bc0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
15bd0 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
15be0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
15bf0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
15c00 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
15c10 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
15c20 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
15c30 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
15c40 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
15c50 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
15c60 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
15c70 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
15c80 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
15c90 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
15ca0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
15cb0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
15cc0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
15cd0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
15ce0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
15cf0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
15d00 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
15d10 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
15d20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
15d30 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
15d40 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
15d50 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
15d60 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
15d70 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
15d80 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
15d90 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
15da0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
15db0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
15dc0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
15dd0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
15de0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
15df0 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
15e00 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
15e10 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
15e20 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
15e30 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
15e40 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
15e50 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
15e60 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
15e70 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
15e80 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
15e90 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
15ea0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
15eb0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
15ec0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
15ed0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
15ee0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
15ef0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
15f00 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
15f10 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
15f20 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
15f30 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
15f40 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
15f50 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
15f60 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
15f70 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
15f80 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
15f90 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
15fa0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
15fb0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
15fc0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
15fd0 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
15fe0 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
15ff0 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
16000 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
16010 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
16020 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
16030 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
16040 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
16050 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
16060 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  n(void *pData, i
16070 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67  nt exFlag){.  Pg
16080 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
16090 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
160a0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
160b0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
160c0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
160d0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
160e0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
160f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16100 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
16110 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
16120 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
16130 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
16140 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16150 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
16160 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
16170 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
16180 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
16190 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
161a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
161b0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
161c0 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
161d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
161e0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
161f0 2d 3e 66 64 2c 20 52 45 53 45 52 56 45 44 5f 4c  ->fd, RESERVED_L
16200 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  OCK);.      if( 
16210 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16220 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16230 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
16240 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
16250 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
16260 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
16270 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
16280 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
16290 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
162a0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
162b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
162c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
162d0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
162e0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
162f0 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
16300 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54 52        TRACE2("TR
16310 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
16320 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16330 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
16340 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
16350 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
16360 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
16370 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
16380 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
16390 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
163a0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
163b0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
163c0 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
163d0 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
163e0 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
163f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
16400 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
16410 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
16420 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
16430 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
16440 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
16450 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
16460 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
16470 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
16480 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
16490 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
164a0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
164b0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
164c0 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
164d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
164e0 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
164f0 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
16500 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
16510 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16520 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
16530 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
16540 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
16550 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
16560 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
16570 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
16580 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
16590 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
165a0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
165b0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
165c0 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
165d0 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
165e0 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
165f0 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
16600 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
16610 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
16620 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
16630 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
16640 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
16650 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
16660 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
16670 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
16680 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
16690 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
166a0 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
166b0 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
166c0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
166d0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
166e0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
166f0 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
16700 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
16710 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
16720 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
16730 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
16740 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
16750 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
16760 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
16770 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
16780 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
16790 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74  Mask ){ .    ret
167a0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
167b0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
167c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
167d0 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
167e0 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
167f0 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
16800 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
16810 65 72 20 29 3b 0a 0a 20 20 43 48 45 43 4b 5f 50  er );..  CHECK_P
16820 41 47 45 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20  AGE(pPg);..  /* 
16830 4d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73  Mark the page as
16840 20 64 69 72 74 79 2e 20 20 49 66 20 74 68 65 20   dirty.  If the 
16850 70 61 67 65 20 68 61 73 20 61 6c 72 65 61 64 79  page has already
16860 20 62 65 65 6e 20 77 72 69 74 74 65 6e 0a 20 20   been written.  
16870 2a 2a 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  ** to the journa
16880 6c 20 74 68 65 6e 20 77 65 20 63 61 6e 20 72 65  l then we can re
16890 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 2e  turn right away.
168a0 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e 64 69 72  .  */.  pPg->dir
168b0 74 79 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50  ty = 1;.  if( pP
168c0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
168d0 28 70 50 67 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20  (pPg->inStmt || 
168e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
168f0 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
16900 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
16910 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
16920 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
16930 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
16940 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
16950 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
16960 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
16970 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
16980 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
16990 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
169a0 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
169b0 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
169c0 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
169d0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
169e0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
169f0 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
16a00 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
16a10 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
16a20 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
16a30 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
16a40 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
16a50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
16a60 65 72 5f 62 65 67 69 6e 28 70 44 61 74 61 2c 20  er_begin(pData, 
16a70 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
16a80 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16a90 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
16aa0 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20    }.    assert( 
16ab0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
16ac0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
16ad0 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
16ae0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26  ->journalOpen &&
16af0 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
16b00 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
16b10 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
16b20 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
16b30 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16b40 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
16b50 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  c;.    }.    ass
16b60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
16b70 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61  rnalOpen || !pPa
16b80 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
16b90 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  );.    pPager->d
16ba0 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20  irtyCache = 1;. 
16bb0 20 0a 20 20 20 20 2f 2a 20 54 68 65 20 74 72 61   .    /* The tra
16bc0 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
16bd0 20 6e 6f 77 20 65 78 69 73 74 73 20 61 6e 64 20   now exists and 
16be0 77 65 20 68 61 76 65 20 61 20 52 45 53 45 52 56  we have a RESERV
16bf0 45 44 20 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20  ED or an.    ** 
16c00 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
16c10 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  n the main datab
16c20 61 73 65 20 66 69 6c 65 2e 20 20 57 72 69 74 65  ase file.  Write
16c30 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
16c40 65 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20  e to.    ** the 
16c50 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
16c60 6e 61 6c 20 69 66 20 69 74 20 69 73 20 6e 6f 74  nal if it is not
16c70 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 0a   there already..
16c80 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
16c90 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
16ca0 26 20 28 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  & (pPager->useJo
16cb0 75 72 6e 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20  urnal || MEMDB) 
16cc0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 69 6e  ){.      if( (in
16cd0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
16ce0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16cf0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  e ){.        int
16d00 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 75   szPg;.        u
16d10 33 32 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20  32 saved;.      
16d20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
16d30 20 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f           PgHisto
16d40 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
16d50 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
16d60 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
16d70 20 20 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41    TRACE3("JOURNA
16d80 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c  L %d page %d\n",
16d90 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
16da0 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20  , pPg->pgno);.  
16db0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16dc0 70 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20  pHist->pOrig==0 
16dd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69  );.          pHi
16de0 73 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69  st->pOrig = sqli
16df0 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61  teMallocRaw( pPa
16e00 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b  ger->pageSize );
16e10 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
16e20 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
16e30 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70             memcp
16e40 79 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20  y(pHist->pOrig, 
16e50 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
16e60 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
16e70 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Size);.         
16e80 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65   }.        }else
16e90 7b 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20  {.          u32 
16ea0 63 6b 73 75 6d 3b 0a 20 20 20 20 20 20 20 20 20  cksum;.         
16eb0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
16ec0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
16ed0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63   7);.          c
16ee0 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f 63 6b 73  ksum = pager_cks
16ef0 75 6d 28 70 50 61 67 65 72 2c 20 70 50 67 2d 3e  um(pPager, pPg->
16f00 70 67 6e 6f 2c 20 70 44 61 74 61 29 3b 0a 20 20  pgno, pData);.  
16f10 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d 20          saved = 
16f20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f  *(u32*)PGHDR_TO_
16f30 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65  EXTRA(pPg, pPage
16f40 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74  r);.          st
16f50 6f 72 65 33 32 62 69 74 73 28 63 6b 73 75 6d 2c  ore32bits(cksum,
16f60 20 70 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61   pPg, pPager->pa
16f70 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
16f80 20 20 20 73 7a 50 67 20 3d 20 70 50 61 67 65 72     szPg = pPager
16f90 2d 3e 70 61 67 65 53 69 7a 65 2b 38 3b 0a 20 20  ->pageSize+8;.  
16fa0 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
16fb0 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
16fc0 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20  Pg, -4);.       
16fd0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
16fe0 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
16ff0 6a 66 64 2c 20 26 28 28 63 68 61 72 2a 29 70 44  jfd, &((char*)pD
17000 61 74 61 29 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b  ata)[-4], szPg);
17010 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
17020 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d  r->journalOff +=
17030 20 73 7a 50 67 3b 0a 20 20 20 20 20 20 20 20 20   szPg;.         
17040 20 54 52 41 43 45 34 28 22 4a 4f 55 52 4e 41 4c   TRACE4("JOURNAL
17050 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64   %d page %d need
17060 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20  Sync=%d\n",.    
17070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41                PA
17080 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
17090 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e  Pg->pgno, pPg->n
170a0 65 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20  eedSync);.      
170b0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
170c0 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
170d0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  no, 0);.        
170e0 20 20 2a 28 75 33 32 2a 29 50 47 48 44 52 5f 54    *(u32*)PGHDR_T
170f0 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
17100 67 65 72 29 20 3d 20 73 61 76 65 64 3b 0a 20 20  ger) = saved;.  
17110 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
17120 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17130 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
17140 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
17150 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17160 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
17170 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
17180 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _FULL;.         
17190 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
171a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
171b0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63      pPager->nRec
171c0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  ++;.          as
171d0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
171e0 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
171f0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
17200 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
17210 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
17220 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
17230 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65          pPg->nee
17240 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d  dSync = !pPager-
17250 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
17260 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
17270 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
17280 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
17290 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e  aInStmt[pPg->pgn
172a0 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
172b0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
172c0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
172d0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
172e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
172f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
17300 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 50 67  lse{.        pPg
17310 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
17320 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
17330 72 74 65 64 20 26 26 20 21 70 50 61 67 65 72 2d  rted && !pPager-
17340 3e 6e 6f 53 79 6e 63 3b 0a 20 20 20 20 20 20 20  >noSync;.       
17350 20 54 52 41 43 45 34 28 22 41 50 50 45 4e 44 20   TRACE4("APPEND 
17360 25 64 20 70 61 67 65 20 25 64 20 6e 65 65 64 53  %d page %d needS
17370 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20  ync=%d\n",.     
17380 20 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52             PAGER
17390 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
173a0 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64  >pgno, pPg->need
173b0 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Sync);.      }. 
173c0 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65       if( pPg->ne
173d0 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  edSync ){.      
173e0 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
173f0 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  nc = 1;.      }.
17400 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75        pPg->inJou
17410 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  rnal = 1;.    }.
17420 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
17430 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
17440 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64 20 74  al is open and t
17450 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
17460 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74 68 65  n it,.    ** the
17470 6e 20 77 72 69 74 65 20 74 68 65 20 63 75 72 72  n write the curr
17480 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68 65 20  ent page to the 
17490 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
174a0 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  l.  Note that.  
174b0 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65    ** the stateme
174c0 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  nt journal forma
174d0 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d 20 74  t differs from t
174e0 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f 75 72  he standard jour
174f0 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20 20 2a  nal format.    *
17500 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f 6d 69  * in that it omi
17510 74 73 20 74 68 65 20 63 68 65 63 6b 73 75 6d 73  ts the checksums
17520 20 61 6e 64 20 74 68 65 20 68 65 61 64 65 72 2e   and the header.
17530 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
17540 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
17550 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
17560 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
17570 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
17580 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 61  tSize ){.      a
17590 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
175a0 75 72 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50  urnal || (int)pP
175b0 67 2d 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e  g->pgno>pPager->
175c0 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20  origDbSize );.  
175d0 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
175e0 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
175f0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
17600 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17610 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
17620 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70  assert( pHist->p
17630 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Stmt==0 );.     
17640 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20     pHist->pStmt 
17650 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
17660 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  w( pPager->pageS
17670 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ize );.        i
17680 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  f( pHist->pStmt 
17690 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65 6d  ){.          mem
176a0 63 70 79 28 70 48 69 73 74 2d 3e 70 53 74 6d 74  cpy(pHist->pStmt
176b0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
176c0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
176d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20  geSize);.       
176e0 20 7d 0a 20 20 20 20 20 20 20 20 54 52 41 43 45   }.        TRACE
176f0 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20  3("STMT-JOURNAL 
17700 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
17710 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
17720 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
17730 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
17740 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
17750 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
17760 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28  ;.        CODEC(
17770 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
17780 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
17790 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
177a0 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65  e3OsWrite(&pPage
177b0 72 2d 3e 73 74 66 64 2c 28 28 63 68 61 72 2a 29  r->stfd,((char*)
177c0 70 44 61 74 61 29 2d 34 2c 20 70 50 61 67 65 72  pData)-4, pPager
177d0 2d 3e 70 61 67 65 53 69 7a 65 2b 34 29 3b 0a 20  ->pageSize+4);. 
177e0 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
177f0 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
17800 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
17810 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
17820 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  >pgno);.        
17830 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
17840 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
17850 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
17860 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
17870 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
17880 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
17890 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
178a0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
178b0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
178c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20  _FULL;.         
178d0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
178e0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50      }.        pP
178f0 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b  ager->stmtNRec++
17900 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
17910 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d  ( pPager->aInStm
17920 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
17930 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
17940 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
17950 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
17960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
17970 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
17980 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
17990 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 70 64 61  }.  }..  /* Upda
179a0 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  te the database 
179b0 73 69 7a 65 20 61 6e 64 20 72 65 74 75 72 6e 2e  size and return.
179c0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
179d0 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74 29  er->dbSize<(int)
179e0 70 50 67 2d 3e 70 67 6e 6f 20 29 7b 0a 20 20 20  pPg->pgno ){.   
179f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
17a00 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20  = pPg->pgno;.   
17a10 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 70   if( !MEMDB && p
17a20 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 50  Pager->dbSize==P
17a30 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70 50 61 67  ENDING_BYTE/pPag
17a40 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
17a50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
17a60 53 69 7a 65 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Size++;.    }.  
17a70 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
17a80 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54  ../*.** Return T
17a90 52 55 45 20 69 66 20 74 68 65 20 70 61 67 65 20  RUE if the page 
17aa0 67 69 76 65 6e 20 69 6e 20 74 68 65 20 61 72 67  given in the arg
17ab0 75 6d 65 6e 74 20 77 61 73 20 70 72 65 76 69 6f  ument was previo
17ac0 75 73 6c 79 20 70 61 73 73 65 64 0a 2a 2a 20 74  usly passed.** t
17ad0 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  o sqlite3pager_w
17ae0 72 69 74 65 28 29 2e 20 20 49 6e 20 6f 74 68 65  rite().  In othe
17af0 72 20 77 6f 72 64 73 2c 20 72 65 74 75 72 6e 20  r words, return 
17b00 54 52 55 45 20 69 66 20 69 74 20 69 73 20 6f 6b  TRUE if it is ok
17b10 0a 2a 2a 20 74 6f 20 63 68 61 6e 67 65 20 74 68  .** to change th
17b20 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65  e content of the
17b30 20 70 61 67 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   page..*/.int sq
17b40 6c 69 74 65 33 70 61 67 65 72 5f 69 73 77 72 69  lite3pager_iswri
17b50 74 65 61 62 6c 65 28 76 6f 69 64 20 2a 70 44 61  teable(void *pDa
17b60 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
17b70 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
17b80 52 28 70 44 61 74 61 29 3b 0a 20 20 72 65 74 75  R(pData);.  retu
17b90 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a 7d  rn pPg->dirty;.}
17ba0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
17bb0 5f 4f 4d 49 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a  _OMIT_VACUUM./*.
17bc0 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20 63  ** Replace the c
17bd0 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67  ontent of a sing
17be0 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68 65  le page with the
17bf0 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
17c00 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67  the third.** arg
17c10 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ument..*/.int sq
17c20 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77  lite3pager_overw
17c30 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
17c40 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76  er, Pgno pgno, v
17c50 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76  oid *pData){.  v
17c60 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e  oid *pPage;.  in
17c70 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  t rc;..  rc = sq
17c80 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
17c90 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50  Pager, pgno, &pP
17ca0 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  age);.  if( rc==
17cb0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
17cc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
17cd0 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b  er_write(pPage);
17ce0 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17cf0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
17d00 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44  memcpy(pPage, pD
17d10 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
17d20 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
17d30 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
17d40 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d  nref(pPage);.  }
17d50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
17d60 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
17d70 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
17d80 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
17d90 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
17da0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
17db0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
17dc0 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
17dd0 65 20 22 70 67 6e 6f 22 20 62 61 63 6b 20 74 6f  e "pgno" back to
17de0 20 74 68 65 20 64 69 73 6b 2c 20 65 76 65 6e 20   the disk, even 
17df0 74 68 6f 75 67 68 0a 2a 2a 20 74 68 61 74 20 70  though.** that p
17e00 61 67 65 20 6d 69 67 68 74 20 62 65 20 6d 61 72  age might be mar
17e10 6b 65 64 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a  ked as dirty..**
17e20 0a 2a 2a 20 54 68 65 20 6f 76 65 72 6c 79 69 6e  .** The overlyin
17e30 67 20 73 6f 66 74 77 61 72 65 20 6c 61 79 65 72  g software layer
17e40 20 63 61 6c 6c 73 20 74 68 69 73 20 72 6f 75 74   calls this rout
17e50 69 6e 65 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20  ine when all of 
17e60 74 68 65 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74  the data.** on t
17e70 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 69 73  he given page is
17e80 20 75 6e 75 73 65 64 2e 20 20 54 68 65 20 70 61   unused.  The pa
17e90 67 65 72 20 6d 61 72 6b 73 20 74 68 65 20 70 61  ger marks the pa
17ea0 67 65 20 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a  ge as clean so.*
17eb0 2a 20 74 68 61 74 20 69 74 20 64 6f 65 73 20 6e  * that it does n
17ec0 6f 74 20 67 65 74 20 77 72 69 74 74 65 6e 20 74  ot get written t
17ed0 6f 20 64 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65  o disk..**.** Te
17ee0 73 74 73 20 73 68 6f 77 20 74 68 61 74 20 74 68  sts show that th
17ef0 69 73 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c  is optimization,
17f00 20 74 6f 67 65 74 68 65 72 20 77 69 74 68 20 74   together with t
17f10 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
17f20 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
17f30 28 29 20 62 65 6c 6f 77 2c 20 6d 6f 72 65 20 74  () below, more t
17f40 68 61 6e 20 64 6f 75 62 6c 65 20 74 68 65 20 73  han double the s
17f50 70 65 65 64 0a 2a 2a 20 6f 66 20 6c 61 72 67 65  peed.** of large
17f60 20 49 4e 53 45 52 54 20 6f 70 65 72 61 74 69 6f   INSERT operatio
17f70 6e 73 20 61 6e 64 20 71 75 61 64 72 75 70 6c 65  ns and quadruple
17f80 20 74 68 65 20 73 70 65 65 64 20 6f 66 20 6c 61   the speed of la
17f90 72 67 65 20 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a  rge DELETEs..**.
17fa0 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75  ** When this rou
17fb0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
17fc0 73 65 74 20 74 68 65 20 61 6c 77 61 79 73 52 6f  set the alwaysRo
17fd0 6c 6c 62 61 63 6b 20 66 6c 61 67 20 74 6f 20 74  llback flag to t
17fe0 72 75 65 2e 0a 2a 2a 20 53 75 62 73 65 71 75 65  rue..** Subseque
17ff0 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69  nt calls to sqli
18000 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f  te3pager_dont_ro
18010 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74 68 65  llback() for the
18020 20 73 61 6d 65 20 70 61 67 65 0a 2a 2a 20 77 69   same page.** wi
18030 6c 6c 20 74 68 65 72 65 61 66 74 65 72 20 62 65  ll thereafter be
18040 20 69 67 6e 6f 72 65 64 2e 20 20 54 68 69 73 20   ignored.  This 
18050 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
18060 61 76 6f 69 64 20 61 20 70 72 6f 62 6c 65 6d 0a  avoid a problem.
18070 2a 2a 20 77 68 65 72 65 20 61 20 70 61 67 65 20  ** where a page 
18080 77 69 74 68 20 64 61 74 61 20 69 73 20 61 64 64  with data is add
18090 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
180a0 73 74 20 64 75 72 69 6e 67 20 6f 6e 65 20 70 61  st during one pa
180b0 72 74 20 6f 66 0a 2a 2a 20 61 20 74 72 61 6e 73  rt of.** a trans
180c0 61 63 74 69 6f 6e 20 74 68 65 6e 20 72 65 6d 6f  action then remo
180d0 76 65 64 20 66 72 6f 6d 20 74 68 65 20 66 72 65  ved from the fre
180e0 65 6c 69 73 74 20 64 75 72 69 6e 67 20 61 20 6c  elist during a l
180f0 61 74 65 72 20 70 61 72 74 0a 2a 2a 20 6f 66 20  ater part.** of 
18100 74 68 65 20 73 61 6d 65 20 74 72 61 6e 73 61 63  the same transac
18110 74 69 6f 6e 20 61 6e 64 20 72 65 75 73 65 64 20  tion and reused 
18120 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65 72 20 70  for some other p
18130 75 72 70 6f 73 65 2e 20 20 57 68 65 6e 20 69 74  urpose.  When it
18140 0a 2a 2a 20 69 73 20 66 69 72 73 74 20 61 64 64  .** is first add
18150 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
18160 73 74 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  st, this routine
18170 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 57 68 65   is called.  Whe
18180 6e 20 72 65 75 73 65 64 2c 0a 2a 2a 20 74 68 65  n reused,.** the
18190 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
181a0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
181b0 65 64 2e 20 20 42 75 74 20 62 65 63 61 75 73 65  ed.  But because
181c0 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 61 69   the page contai
181d0 6e 73 0a 2a 2a 20 63 72 69 74 69 63 61 6c 20 64  ns.** critical d
181e0 61 74 61 2c 20 77 65 20 73 74 69 6c 6c 20 6e 65  ata, we still ne
181f0 65 64 20 74 6f 20 62 65 20 73 75 72 65 20 69 74  ed to be sure it
18200 20 67 65 74 73 20 72 6f 6c 6c 65 64 20 62 61 63   gets rolled bac
18210 6b 20 69 6e 20 73 70 69 74 65 0a 2a 2a 20 6f 66  k in spite.** of
18220 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61   the dont_rollba
18230 63 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f  ck() call..*/.vo
18240 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
18250 64 6f 6e 74 5f 77 72 69 74 65 28 50 61 67 65 72  dont_write(Pager
18260 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
18270 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
18280 50 67 3b 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42  Pg;..  if( MEMDB
18290 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 70 50   ) return;..  pP
182a0 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70  g = pager_lookup
182b0 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a  (pPager, pgno);.
182c0 20 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c    pPg->alwaysRol
182d0 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20 69 66 28  lback = 1;.  if(
182e0 20 70 50 67 20 26 26 20 70 50 67 2d 3e 64 69 72   pPg && pPg->dir
182f0 74 79 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50  ty ){.    if( pP
18300 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d 28 69  ager->dbSize==(i
18310 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26 26 20  nt)pPg->pgno && 
18320 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
18330 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ze<pPager->dbSiz
18340 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49 66  e ){.      /* If
18350 20 74 68 69 73 20 70 61 67 65 73 20 69 73 20 74   this pages is t
18360 68 65 20 6c 61 73 74 20 70 61 67 65 20 69 6e 20  he last page in 
18370 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65  the file and the
18380 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77 6e 0a   file has grown.
18390 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e 67 20        ** during 
183a0 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
183b0 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20 64 6f  saction, then do
183c0 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20 70 61   NOT mark the pa
183d0 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20 20 20  ge as clean..   
183e0 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65 20 64     ** When the d
183f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 67 72 6f  atabase file gro
18400 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61 6b 65  ws, we must make
18410 20 73 75 72 65 20 74 68 61 74 20 74 68 65 20 6c   sure that the l
18420 61 73 74 20 70 61 67 65 0a 20 20 20 20 20 20 2a  ast page.      *
18430 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e 20 61  * gets written a
18440 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73 6f 20  t least once so 
18450 74 68 61 74 20 74 68 65 20 64 69 73 6b 20 66 69  that the disk fi
18460 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65 20 63  le will be the c
18470 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a 2a 20  orrect.      ** 
18480 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64 6f 20  size. If you do 
18490 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73 20 70  not write this p
184a0 61 67 65 20 61 6e 64 20 74 68 65 20 73 69 7a 65  age and the size
184b0 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20 20 20   of the file.   
184c0 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64 69 73     ** on the dis
184d0 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e 67 20  k ends up being 
184e0 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61 74 20  too small, that 
184f0 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61 74 61  can lead to data
18500 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20 63 6f  base.      ** co
18510 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e 67 20  rruption during 
18520 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73 61 63  the next transac
18530 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  tion..      */. 
18540 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
18550 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 57 52 49  TRACE3("DONT_WRI
18560 54 45 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  TE page %d of %d
18570 5c 6e 22 2c 20 70 67 6e 6f 2c 20 50 41 47 45 52  \n", pgno, PAGER
18580 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
18590 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
185a0 30 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  0;.#ifdef SQLITE
185b0 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
185c0 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
185d0 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
185e0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
185f0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
18600 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
18610 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
18620 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
18630 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
18640 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
18650 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
18660 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
18670 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
18680 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
18690 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
186a0 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
186b0 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
186c0 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
186d0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
186e0 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  l..*/.void sqlit
186f0 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c  e3pager_dont_rol
18700 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74  lback(void *pDat
18710 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
18720 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
18730 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
18740 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
18750 70 50 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70  pPager;..  if( p
18760 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41  Pager->state!=PA
18770 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c  GER_EXCLUSIVE ||
18780 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
18790 4f 70 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e  Open==0 ) return
187a0 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77  ;.  if( pPg->alw
187b0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70  aysRollback || p
187c0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
187d0 6c 62 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29  lback || MEMDB )
187e0 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21   return;.  if( !
187f0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26  pPg->inJournal &
18800 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  & (int)pPg->pgno
18810 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67   <= pPager->orig
18820 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73  DbSize ){.    as
18830 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
18840 6e 4a 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20  nJournal!=0 );. 
18850 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f     pPager->aInJo
18860 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f  urnal[pPg->pgno/
18870 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70  8] |= 1<<(pPg->p
18880 67 6e 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d  gno&7);.    pPg-
18890 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a  >inJournal = 1;.
188a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
188b0 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
188c0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
188d0 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  mt[pPg->pgno/8] 
188e0 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
188f0 26 37 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f  &7);.      page_
18900 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74  add_to_stmt_list
18910 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
18920 20 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f   TRACE3("DONT_RO
18930 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
18940 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
18950 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
18960 65 72 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  er));.  }.  if( 
18970 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
18980 65 20 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d  e && !pPg->inStm
18990 74 20 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70  t && (int)pPg->p
189a0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
189b0 74 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73  tSize ){.    ass
189c0 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72  ert( pPg->inJour
189d0 6e 61 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d  nal || (int)pPg-
189e0 3e 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72  >pgno>pPager->or
189f0 69 67 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20  igDbSize );.    
18a00 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
18a10 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20  aInStmt!=0 );.  
18a20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
18a30 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  t[pPg->pgno/8] |
18a40 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
18a50 37 29 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64  7);.    page_add
18a60 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50  _to_stmt_list(pP
18a70 67 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e  g);.  }.}...#ifn
18a80 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
18a90 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43  MEMORYDB./*.** C
18aa0 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72 79  lear a PgHistory
18ab0 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63   block.*/.static
18ac0 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f   void clearHisto
18ad0 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48  ry(PgHistory *pH
18ae0 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72  ist){.  sqliteFr
18af0 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29  ee(pHist->pOrig)
18b00 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
18b10 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
18b20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30  pHist->pOrig = 0
18b30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  ;.  pHist->pStmt
18b40 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64   = 0;.}.#else.#d
18b50 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74 6f  efine clearHisto
18b60 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ry(x).#endif../*
18b70 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61 6c 6c 20 63  .** Commit all c
18b80 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64 61  hanges to the da
18b90 74 61 62 61 73 65 20 61 6e 64 20 72 65 6c 65 61  tabase and relea
18ba0 73 65 20 74 68 65 20 77 72 69 74 65 20 6c 6f 63  se the write loc
18bb0 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  k..**.** If the 
18bc0 63 6f 6d 6d 69 74 20 66 61 69 6c 73 20 66 6f 72  commit fails for
18bd0 20 61 6e 79 20 72 65 61 73 6f 6e 2c 20 61 20 72   any reason, a r
18be0 6f 6c 6c 62 61 63 6b 20 61 74 74 65 6d 70 74 20  ollback attempt 
18bf0 69 73 20 6d 61 64 65 0a 2a 2a 20 61 6e 64 20 61  is made.** and a
18c00 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
18c10 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 74 68  returned.  If th
18c20 65 20 63 6f 6d 6d 69 74 20 77 6f 72 6b 65 64 2c  e commit worked,
18c30 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73   SQLITE_OK.** is
18c40 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e   returned..*/.in
18c50 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
18c60 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
18c70 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
18c80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
18c90 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
18ca0 4d 61 73 6b 3d 3d 50 41 47 45 52 5f 45 52 52 5f  Mask==PAGER_ERR_
18cb0 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 63 20 3d  FULL ){.    rc =
18cc0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
18cd0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
18ce0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
18cf0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
18d00 63 20 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b  c = SQLITE_FULL;
18d10 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
18d20 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20  n rc;.  }.  if( 
18d30 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21  pPager->errMask!
18d40 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  =0 ){.    rc = p
18d50 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
18d60 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
18d70 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70   rc;.  }.  if( p
18d80 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50 41 47  Pager->state<PAG
18d90 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
18da0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
18db0 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a 20 20 54 52  _ERROR;.  }.  TR
18dc0 41 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c  ACE2("COMMIT %d\
18dd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18de0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
18df0 42 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70  B ){.    pPg = p
18e00 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
18e10 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
18e20 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67  ;.    while( pPg
18e30 20 29 7b 0a 20 20 20 20 20 20 63 6c 65 61 72 48   ){.      clearH
18e40 69 73 74 6f 72 79 28 50 47 48 44 52 5f 54 4f 5f  istory(PGHDR_TO_
18e50 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
18e60 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
18e70 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
18e80 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
18e90 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69   0;.      pPg->i
18ea0 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20  nStmt = 0;.     
18eb0 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
18ec0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  = pPg->pNextStmt
18ed0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20   = 0;.      pPg 
18ee0 3d 20 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20  = pPg->pDirty;. 
18ef0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
18f00 42 55 47 0a 20 20 20 20 66 6f 72 28 70 50 67 3d  BUG.    for(pPg=
18f10 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
18f20 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78  g; pPg=pPg->pNex
18f30 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48  tAll){.      PgH
18f40 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
18f50 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
18f60 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
18f70 20 20 61 73 73 65 72 74 28 20 21 70 50 67 2d 3e    assert( !pPg->
18f80 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29  alwaysRollback )
18f90 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
18fa0 21 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b  !pHist->pOrig );
18fb0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
18fc0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a  pHist->pStmt );.
18fd0 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
18fe0 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d   pPager->pStmt =
18ff0 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
19000 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48  state = PAGER_SH
19010 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75 72 6e  ARED;.    return
19020 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
19030 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 69    if( pPager->di
19040 72 74 79 43 61 63 68 65 3d 3d 30 20 29 7b 0a 20  rtyCache==0 ){. 
19050 20 20 20 2f 2a 20 45 78 69 74 20 65 61 72 6c 79     /* Exit early
19060 20 28 77 69 74 68 6f 75 74 20 64 6f 69 6e 67 20   (without doing 
19070 74 68 65 20 74 69 6d 65 2d 63 6f 6e 73 75 6d 69  the time-consumi
19080 6e 67 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  ng sqlite3OsSync
19090 28 29 20 63 61 6c 6c 73 29 0a 20 20 20 20 2a 2a  () calls).    **
190a0 20 69 66 20 74 68 65 72 65 20 68 61 76 65 20 62   if there have b
190b0 65 65 6e 20 6e 6f 20 63 68 61 6e 67 65 73 20 74  een no changes t
190c0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
190d0 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 61 73 73 65  ile. */.    asse
190e0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
190f0 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 72  Sync==0 );.    r
19100 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
19110 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
19120 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
19130 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
19140 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73 73  rn rc;.  }.  ass
19150 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
19160 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
19170 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
19180 73 79 6e 63 28 70 50 61 67 65 72 2c 20 30 2c 20  sync(pPager, 0, 
19190 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
191a0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67  LITE_OK ){.    g
191b0 6f 74 6f 20 63 6f 6d 6d 69 74 5f 61 62 6f 72 74  oto commit_abort
191c0 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
191d0 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
191e0 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
191f0 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
19200 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
19210 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 61  * Jump here if a
19220 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f  nything goes wro
19230 6e 67 20 64 75 72 69 6e 67 20 74 68 65 20 63 6f  ng during the co
19240 6d 6d 69 74 20 70 72 6f 63 65 73 73 2e 0a 20 20  mmit process..  
19250 2a 2f 0a 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a  */.commit_abort:
19260 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
19270 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
19280 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
19290 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b  ../*.** Rollback
192a0 20 61 6c 6c 20 63 68 61 6e 67 65 73 2e 20 20 54   all changes.  T
192b0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 6c 6c  he database fall
192c0 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45 52 5f  s back to PAGER_
192d0 53 48 41 52 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20  SHARED mode..** 
192e0 41 6c 6c 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  All in-memory ca
192f0 63 68 65 20 70 61 67 65 73 20 72 65 76 65 72 74  che pages revert
19300 20 74 6f 20 74 68 65 69 72 20 6f 72 69 67 69 6e   to their origin
19310 61 6c 20 64 61 74 61 20 63 6f 6e 74 65 6e 74 73  al data contents
19320 2e 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ..** The journal
19330 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a   is deleted..**.
19340 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19350 63 61 6e 6e 6f 74 20 66 61 69 6c 20 75 6e 6c 65  cannot fail unle
19360 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 20 70 72  ss some other pr
19370 6f 63 65 73 73 20 69 73 20 6e 6f 74 20 66 6f 6c  ocess is not fol
19380 6c 6f 77 69 6e 67 0a 2a 2a 20 74 68 65 20 63 6f  lowing.** the co
19390 72 72 65 63 74 20 6c 6f 63 6b 69 6e 67 20 70 72  rrect locking pr
193a0 6f 74 6f 63 6f 6c 20 28 53 51 4c 49 54 45 5f 50  otocol (SQLITE_P
193b0 52 4f 54 4f 43 4f 4c 29 20 6f 72 20 75 6e 6c 65  ROTOCOL) or unle
193c0 73 73 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a  ss some other.**
193d0 20 70 72 6f 63 65 73 73 20 69 73 20 77 72 69 74   process is writ
193e0 69 6e 67 20 74 72 61 73 68 20 69 6e 74 6f 20 74  ing trash into t
193f0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
19400 28 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 29  (SQLITE_CORRUPT)
19410 20 6f 72 0a 2a 2a 20 75 6e 6c 65 73 73 20 61 20   or.** unless a 
19420 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 66  prior malloc() f
19430 61 69 6c 65 64 20 28 53 51 4c 49 54 45 5f 4e 4f  ailed (SQLITE_NO
19440 4d 45 4d 29 2e 20 20 41 70 70 72 6f 70 72 69 61  MEM).  Appropria
19450 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
19460 73 20 61 72 65 20 72 65 74 75 72 6e 65 64 20 66  s are returned f
19470 6f 72 20 61 6c 6c 20 74 68 65 73 65 20 6f 63 63  or all these occ
19480 61 73 69 6f 6e 73 2e 20 20 4f 74 68 65 72 77 69  asions.  Otherwi
19490 73 65 2c 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  se,.** SQLITE_OK
194a0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
194b0 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
194c0 72 5f 72 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  r_rollback(Pager
194d0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
194e0 20 72 63 3b 0a 20 20 54 52 41 43 45 32 28 22 52   rc;.  TRACE2("R
194f0 4f 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50  OLLBACK %d\n", P
19500 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
19510 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
19520 20 20 20 20 50 67 48 64 72 20 2a 70 3b 0a 20 20      PgHdr *p;.  
19530 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
19540 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
19550 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 50  extAll){.      P
19560 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 3b  gHistory *pHist;
19570 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
19580 70 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  p->alwaysRollbac
19590 6b 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21  k );.      if( !
195a0 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20  p->dirty ){.    
195b0 20 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50      assert( !((P
195c0 67 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52  gHistory *)PGHDR
195d0 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
195e0 65 72 29 29 2d 3e 70 4f 72 69 67 20 29 3b 0a 20  er))->pOrig );. 
195f0 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
19600 28 28 50 67 48 69 73 74 6f 72 79 20 2a 29 50 47  ((PgHistory *)PG
19610 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70  HDR_TO_HIST(p, p
19620 50 61 67 65 72 29 29 2d 3e 70 53 74 6d 74 20 29  Pager))->pStmt )
19630 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
19640 75 65 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  ue;.      }..   
19650 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44 52     pHist = PGHDR
19660 5f 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67  _TO_HIST(p, pPag
19670 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  er);.      if( p
19680 48 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20  Hist->pOrig ){. 
19690 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
196a0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20  HDR_TO_DATA(p), 
196b0 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 70 50  pHist->pOrig, pP
196c0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
196d0 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28  .        TRACE3(
196e0 22 52 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25  "ROLLBACK-PAGE %
196f0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70  d of %d\n", p->p
19700 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
19710 67 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ger));.      }el
19720 73 65 7b 0a 20 20 20 20 20 20 20 20 54 52 41 43  se{.        TRAC
19730 45 33 28 22 50 41 47 45 20 25 64 20 69 73 20 63  E3("PAGE %d is c
19740 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22 2c 20 70  lean on %d\n", p
19750 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28  ->pgno, PAGERID(
19760 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20  pPager));.      
19770 7d 0a 20 20 20 20 20 20 63 6c 65 61 72 48 69 73  }.      clearHis
19780 74 6f 72 79 28 70 48 69 73 74 29 3b 0a 20 20 20  tory(pHist);.   
19790 20 20 20 70 2d 3e 64 69 72 74 79 20 3d 20 30 3b     p->dirty = 0;
197a0 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a 6f 75 72  .      p->inJour
197b0 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
197c0 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20  ->inStmt = 0;.  
197d0 20 20 20 20 70 2d 3e 70 50 72 65 76 53 74 6d 74      p->pPrevStmt
197e0 20 3d 20 70 2d 3e 70 4e 65 78 74 53 74 6d 74 20   = p->pNextStmt 
197f0 3d 20 30 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  = 0;..      if( 
19800 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
19810 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
19820 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
19830 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
19840 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
19850 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
19860 20 20 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61    .    }.    pPa
19870 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
19880 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
19890 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
198a0 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 6d 65 6d  gDbSize;.    mem
198b0 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61 67  oryTruncate(pPag
198c0 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  er);.    pPager-
198d0 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
198e0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
198f0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
19900 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
19910 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69  ITE_OK;.  }..  i
19920 66 28 20 21 70 50 61 67 65 72 2d 3e 64 69 72 74  f( !pPager->dirt
19930 79 43 61 63 68 65 20 7c 7c 20 21 70 50 61 67 65  yCache || !pPage
19940 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
19950 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
19960 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
19970 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65 72  ger);.    pPager
19980 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a 20  ->dbSize = -1;. 
19990 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
199a0 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  }..  if( pPager-
199b0 3e 65 72 72 4d 61 73 6b 21 3d 30 20 26 26 20 70  >errMask!=0 && p
199c0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
199d0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29  PAGER_ERR_FULL )
199e0 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
199f0 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45  ->state>=PAGER_E
19a00 58 43 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20  XCLUSIVE ){.    
19a10 20 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b    pager_playback
19a20 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a  (pPager);.    }.
19a30 20 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72      return pager
19a40 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
19a50 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
19a60 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
19a70 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
19a80 20 69 6e 74 20 72 63 32 3b 0a 20 20 20 20 72 63   int rc2;.    rc
19a90 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f   = pager_reload_
19aa0 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
19ab0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 75     rc2 = pager_u
19ac0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
19ad0 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d  r);.    if( rc==
19ae0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
19af0 20 20 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20     rc = rc2;.   
19b00 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19b10 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
19b20 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
19b30 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
19b40 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
19b50 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
19b60 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50    /* bkpt-CORRUP
19b70 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  T */.    pPager-
19b80 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
19b90 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
19ba0 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
19bb0 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
19bc0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
19bd0 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
19be0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19bf0 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
19c00 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
19c10 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
19c20 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
19c30 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
19c40 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19c50 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50  ger_isreadonly(P
19c60 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
19c70 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
19c80 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
19c90 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
19ca0 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
19cb0 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
19cc0 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
19cd0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
19ce0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
19cf0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
19d00 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
19d10 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
19d20 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
19d30 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
19d40 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
19d50 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
19d60 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
19d70 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
19d80 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
19d90 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
19da0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
19db0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
19dc0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
19dd0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
19de0 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
19df0 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
19e00 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
19e10 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
19e20 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
19e30 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
19e40 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
19e50 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
19e60 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
19e70 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
19e80 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
19e90 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
19ea0 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
19eb0 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
19ec0 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
19ed0 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
19ee0 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
19ef0 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
19f00 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
19f10 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
19f20 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
19f30 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
19f40 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
19f50 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
19f60 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
19f70 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
19f80 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
19f90 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
19fa0 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
19fb0 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32  e>=0 );.  TRACE2
19fc0 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
19fd0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
19fe0 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
19ff0 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
1a000 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
1a010 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1a020 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
1a030 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
1a040 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
1a050 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
1a060 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
1a070 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
1a080 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
1a090 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
1a0a0 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
1a0b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1a0c0 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
1a0d0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
1a0e0 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
1a0f0 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
1a100 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1a110 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
1a120 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28    sqlite3OsLock(
1a130 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
1a140 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72  RED_LOCK);.    r
1a150 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
1a160 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
1a170 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
1a180 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
1a190 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  &pPager->jfd, &p
1a1a0 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
1a1b0 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
1a1c0 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
1a1d0 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
1a1e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
1a1f0 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
1a200 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
1a210 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
1a220 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
1a230 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
1a240 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
1a250 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
1a260 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
1a270 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
1a280 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
1a290 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
1a2a0 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
1a2b0 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
1a2c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
1a2d0 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
1a2e0 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  emp, &pPager->st
1a2f0 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
1a300 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
1a310 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
1a320 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
1a330 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
1a340 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
1a350 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
1a360 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
1a370 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
1a380 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
1a390 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
1a3a0 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
1a3b0 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1a3c0 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
1a3d0 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
1a3e0 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
1a3f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1a400 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
1a410 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1a420 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
1a430 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
1a440 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
1a450 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
1a460 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
1a470 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
1a480 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
1a490 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
1a4a0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
1a4b0 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
1a4c0 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
1a4d0 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
1a4e0 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
1a4f0 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
1a500 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
1a510 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
1a520 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
1a530 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
1a540 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
1a550 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
1a560 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
1a570 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
1a580 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
1a590 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
1a5a0 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
1a5b0 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a   pPg->inStmt );.
1a5c0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
1a5d0 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
1a5e0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
1a5f0 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
1a600 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
1a610 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
1a620 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
1a630 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
1a640 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
1a650 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
1a660 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
1a670 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
1a680 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
1a690 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
1a6a0 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
1a6b0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
1a6c0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
1a6d0 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
1a6e0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
1a6f0 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
1a700 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
1a710 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
1a720 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
1a730 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
1a740 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
1a750 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
1a760 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1a770 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
1a780 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
1a790 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
1a7a0 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
1a7b0 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1a7c0 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
1a7d0 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
1a7e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
1a7f0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
1a800 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1a810 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
1a820 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
1a830 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
1a840 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
1a850 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
1a860 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
1a870 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
1a880 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
1a890 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
1a8a0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
1a8b0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
1a8c0 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
1a8d0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
1a8e0 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
1a8f0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
1a900 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
1a910 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
1a920 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
1a930 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
1a940 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
1a950 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1a960 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a970 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
1a980 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
1a990 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
1a9a0 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
1a9b0 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
1a9c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
1a9d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
1a9e0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
1a9f0 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
1aa00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1aa10 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
1aa20 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
1aa30 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa40 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
1aa50 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
1aa60 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
1aa70 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1aa80 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1aa90 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
1aaa0 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
1aab0 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1aac0 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
1aad0 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
1aae0 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72  er_dirname(Pager
1aaf0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
1ab00 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
1ab10 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
1ab20 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
1ab30 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
1ab40 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
1ab50 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
1ab60 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
1ab70 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
1ab80 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1ab90 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
1aba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
1abb0 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
1abc0 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
1abd0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
1abe0 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
1abf0 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
1ac00 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
1ac10 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
1ac20 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
1ac30 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
1ac40 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
1ac50 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
1ac60 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
1ac70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
1ac80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
1ac90 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
1aca0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1acb0 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
1acc0 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
1acd0 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
1ace0 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
1acf0 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
1ad00 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
1ad10 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1ad20 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
1ad30 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
1ad40 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
1ad50 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
1ad60 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
1ad70 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
1ad80 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
1ad90 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1ada0 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
1adb0 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
1adc0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1add0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
1ade0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
1adf0 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
1ae00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1ae10 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
1ae20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
1ae30 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
1ae40 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
1ae50 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
1ae60 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
1ae70 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
1ae80 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
1ae90 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1aea0 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
1aeb0 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
1aec0 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
1aed0 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
1aee0 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
1aef0 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
1af00 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
1af10 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
1af20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
1af30 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
1af40 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
1af50 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
1af60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
1af70 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
1af80 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
1af90 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
1afa0 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
1afb0 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
1afc0 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
1afd0 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
1afe0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
1aff0 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
1b000 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
1b010 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
1b020 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
1b030 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
1b040 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
1b050 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
1b060 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
1b070 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
1b080 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
1b090 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1b0a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1b0b0 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1b0c0 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1b0d0 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1b0e0 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1b0f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1b100 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1b110 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1b120 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1b130 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1b140 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1b150 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1b160 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1b170 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1b180 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1b190 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1b1a0 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1b1b0 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1b1c0 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1b1d0 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1b1e0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1b1f0 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1b200 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1b210 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1b220 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1b230 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1b240 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1b250 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1b260 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1b270 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1b280 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1b290 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1b2a0 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1b2b0 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1b2c0 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1b2d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1b2e0 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1b2f0 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1b300 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1b310 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1b320 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1b330 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1b340 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1b350 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1b360 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1b370 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1b380 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1b390 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1b3a0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1b3b0 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1b3c0 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1b3d0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1b3e0 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1b3f0 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1b400 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1b410 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1b420 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1b430 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1b440 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1b450 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1b460 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1b470 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1b480 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1b490 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1b4a0 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1b4b0 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1b4c0 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1b4d0 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1b4e0 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1b4f0 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1b500 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1b510 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1b520 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1b530 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1b540 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1b550 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1b560 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1b570 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1b580 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1b590 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1b5a0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1b5b0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1b5c0 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1b5d0 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1b5e0 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1b5f0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1b600 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1b610 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1b620 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b630 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1b640 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1b650 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1b660 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1b670 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1b680 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1b690 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1b6a0 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1b6b0 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1b6c0 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1b6d0 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1b6e0 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1b6f0 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1b700 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1b710 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1b720 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1b730 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
1b740 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
1b750 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
1b760 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1b770 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
1b780 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c  urnal[i/8] & (1<
1b790 3c 28 69 26 37 29 29 29 20 29 7b 0a 20 20 20 20  <(i&7))) ){.    
1b7a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1b7b0 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1b7c0 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
1b7d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1b7e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b7f0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1b800 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1b810 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1b820 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1b830 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1b840 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
1b850 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1b860 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b870 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1b880 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
1b890 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1b8a0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1b8b0 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1b8c0 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1b8d0 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1b8e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1b8f0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1b900 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
1b910 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1b920 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1b930 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1b940 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1b950 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1b960 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1b970 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
1b980 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1b990 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1b9a0 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
1b9b0 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1b9c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1b9d0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1b9e0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1b9f0 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1ba00 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1ba10 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1ba20 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1ba30 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
1ba40 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
1ba50 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
1ba60 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1ba70 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
1ba80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ba90 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1baa0 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
1bab0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1bac0 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
1bad0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1bae0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1baf0 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
1bb00 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ->fd);.    }..  
1bb10 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1bb20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
1bb30 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
1bb40 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1bb50 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1bb60 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
1bb70 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
1bb80 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
1bb90 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
1bba0 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
1bbb0 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
1bbc0 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
1bbd0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
1bbe0 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
1bbf0 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
1bc00 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
1bc10 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1bc20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1bc30 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
1bc40 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
1bc50 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1bc60 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
1bc70 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
1bc80 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
1bc90 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
1bca0 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1bcb0 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
1bcc0 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
1bcd0 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
1bce0 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
1bcf0 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
1bd00 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1bd10 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
1bd20 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
1bd30 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
1bd40 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
1bd50 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1bd60 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
1bd70 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1bd80 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
1bd90 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
1bda0 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
1bdb0 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1bdc0 20 69 73 20 63 61 6c 6c 65 64 2e 20 49 74 20 75   is called. It u
1bdd0 73 65 64 20 74 6f 20 62 65 0a 2a 2a 20 72 65 71  sed to be.** req
1bde0 75 69 72 65 64 20 74 68 61 74 20 61 20 73 74 61  uired that a sta
1bdf0 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  tement transacti
1be00 6f 6e 20 77 61 73 20 6e 6f 74 20 61 63 74 69 76  on was not activ
1be10 65 2c 20 62 75 74 20 74 68 69 73 20 72 65 73 74  e, but this rest
1be20 72 69 63 74 69 6f 6e 0a 2a 2a 20 68 61 73 20 62  riction.** has b
1be30 65 65 6e 20 72 65 6d 6f 76 65 64 20 28 43 52 45  een removed (CRE
1be40 41 54 45 20 49 4e 44 45 58 20 6e 65 65 64 73 20  ATE INDEX needs 
1be50 74 6f 20 6d 6f 76 65 20 61 20 70 61 67 65 20 77  to move a page w
1be60 68 65 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 0a  hen a statement.
1be70 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  ** transaction i
1be80 73 20 61 63 74 69 76 65 29 2e 0a 2a 2f 0a 69 6e  s active)..*/.in
1be90 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  t sqlite3pager_m
1bea0 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a 70  ovepage(Pager *p
1beb0 50 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44 61  Pager, void *pDa
1bec0 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  ta, Pgno pgno){.
1bed0 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
1bee0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
1bef0 74 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta);.  PgHdr *pP
1bf00 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b 0a  gOld; .  int h;.
1bf10 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63 50    Pgno needSyncP
1bf20 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  gno = 0;..  asse
1bf30 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
1bf40 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d 4f  );..  TRACE5("MO
1bf50 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28 6e  VE %d page %d (n
1bf60 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76 65  eedSync=%d) move
1bf70 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20 20  s to %d\n", .   
1bf80 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65     PAGERID(pPage
1bf90 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  r), pPg->pgno, p
1bfa0 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70 67  Pg->needSync, pg
1bfb0 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70 50 67 2d  no);..  if( pPg-
1bfc0 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20  >needSync ){.   
1bfd0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d 20   needSyncPgno = 
1bfe0 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 61  pPg->pgno;.    a
1bff0 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a 6f  ssert( pPg->inJo
1c000 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73 73  urnal );.    ass
1c010 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 20  ert( pPg->dirty 
1c020 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  );.    assert( p
1c030 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
1c040 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c  );.  }..  /* Unl
1c050 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27  ink pPg from it'
1c060 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f 0a  s hash-chain */.
1c070 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
1c080 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
1c090 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61 63  .  /* If the cac
1c0a0 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70 61  he contains a pa
1c0b0 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75 6d  ge with page-num
1c0c0 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76 65  ber pgno, remove
1c0d0 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69 74   it.  ** from it
1c0e0 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41  's hash chain. A
1c0f0 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48 64  lso, if the PgHd
1c100 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20 73  r.needSync was s
1c110 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61 67  et for .  ** pag
1c120 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74 68  e pgno before th
1c130 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74 69  e 'move' operati
1c140 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f 20  on, it needs to 
1c150 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20 2a  be retained .  *
1c160 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20 6d  * for the page m
1c170 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a 2f  oved there..  */
1c180 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67 65  .  pPgOld = page
1c190 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
1c1a0 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50   pgno);.  if( pP
1c1b0 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73 65  gOld ){.    asse
1c1c0 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66  rt( pPgOld->nRef
1c1d0 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e  ==0 );.    unlin
1c1e0 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
1c1f0 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20  r, pPgOld);.    
1c200 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20 3d 20  pPgOld->dirty = 
1c210 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f 6c  0;.    if( pPgOl
1c220 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20  d->needSync ){. 
1c230 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
1c240 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29  Old->inJournal )
1c250 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  ;.      pPg->inJ
1c260 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1c270 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
1c280 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72  = 1;.      asser
1c290 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1c2a0 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ync );.    }.  }
1c2b0 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74 68  ..  /* Change th
1c2c0 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f  e page number fo
1c2d0 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72 74  r pPg and insert
1c2e0 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65 77   it into the new
1c2f0 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f 0a   hash-chain. */.
1c300 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
1c310 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67 65 72 5f  no;.  h = pager_
1c320 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 69 66  hash(pgno);.  if
1c330 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1c340 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  h] ){.    assert
1c350 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
1c360 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  h]->pPrevHash==0
1c370 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1c380 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1c390 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20  ash = pPg;.  }. 
1c3a0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
1c3b0 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
1c3c0 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48  h];.  pPager->aH
1c3d0 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
1c3e0 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
1c3f0 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64 69 72 74   0;..  pPg->dirt
1c400 79 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  y = 1;.  pPager-
1c410 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
1c420 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63  ..  if( needSync
1c430 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49  Pgno ){.    /* I
1c440 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69  f needSyncPgno i
1c450 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e  s non-zero, then
1c460 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
1c470 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20  e needs to be . 
1c480 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62     ** sync()ed b
1c490 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69  efore any data i
1c4a0 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74  s written to dat
1c4b0 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20  abase file page 
1c4c0 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20  needSyncPgno..  
1c4d0 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20    ** Currently, 
1c4e0 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69  no such page exi
1c4f0 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d  sts in the page-
1c500 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20  cache and the . 
1c510 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a     ** Pager.aInJ
1c520 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62  ournal bit has b
1c530 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65  een set. This ne
1c540 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69  eds to be remedi
1c550 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20  ed by loading.  
1c560 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e    ** the page in
1c570 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63  to the pager-cac
1c580 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74  he and setting t
1c590 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  he PgHdr.needSyn
1c5a0 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20  c flag..    **. 
1c5b0 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65     ** The sqlite
1c5c0 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61 6c  3pager_get() cal
1c5d0 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65 20  l may cause the 
1c5e0 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e  journal to sync.
1c5f0 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20   So make.    ** 
1c600 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e  sure the Pager.n
1c610 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20  eedSync flag is 
1c620 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a  set too..    */.
1c630 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20      int rc;.    
1c640 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63 3b  void *pNeedSync;
1c650 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1c660 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 3b  ger->needSync );
1c670 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c680 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
1c690 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2c  r, needSyncPgno,
1c6a0 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20 20   &pNeedSync);.  
1c6b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c6c0 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
1c6d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
1c6e0 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44  dSync = 1;.    D
1c6f0 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65  ATA_TO_PGHDR(pNe
1c700 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79 6e  edSync)->needSyn
1c710 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  c = 1;.    DATA_
1c720 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1c730 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  nc)->inJournal =
1c740 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f   1;.    DATA_TO_
1c750 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63 29  PGHDR(pNeedSync)
1c760 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 20  ->dirty = 1;.   
1c770 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1c780 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b 0a  ref(pNeedSync);.
1c790 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
1c7a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
1c7b0 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  f..#if defined(S
1c7c0 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c 20  QLITE_DEBUG) || 
1c7d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
1c7e0 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  EST)./*.** Retur
1c7f0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 74  n the current st
1c800 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ate of the file 
1c810 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69 76  lock for the giv
1c820 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68 65  en pager..** The
1c830 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69 73   return value is
1c840 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b 2c   one of NO_LOCK,
1c850 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52 45   SHARED_LOCK, RE
1c860 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a 20  SERVED_LOCK,.** 
1c870 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f 72  PENDING_LOCK, or
1c880 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 2e   EXCLUSIVE_LOCK.
1c890 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1c8a0 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28 50  ager_lockstate(P
1c8b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 23  ager *pPager){.#
1c8c0 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 20 20  ifdef OS_TEST.  
1c8d0 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66  return pPager->f
1c8e0 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b 0a  d->fd.locktype;.
1c8f0 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20 70  #else.  return p
1c900 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74 79  Pager->fd.lockty
1c910 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65 6e  pe;.#endif.}.#en
1c920 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c 49  dif..#ifdef SQLI
1c930 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20 50  TE_DEBUG./*.** P
1c940 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20 6f  rint a listing o
1c950 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 64  f all referenced
1c960 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69 72   pages and their
1c970 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a 76   ref count..*/.v
1c980 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
1c990 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20 2a  _refdump(Pager *
1c9a0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
1c9b0 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50 67   *pPg;.  for(pPg
1c9c0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
1c9d0 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
1c9e0 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20  xtAll){.    if( 
1c9f0 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20 63  pPg->nRef<=0 ) c
1ca00 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71 6c  ontinue;.    sql
1ca10 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
1ca20 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d 25  "PAGE %3d addr=%
1ca30 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a 20  p nRef=%d\n", . 
1ca40 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 2c        pPg->pgno,
1ca50 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
1ca60 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29 3b  Pg), pPg->nRef);
1ca70 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a        .  }.}.#endif.