/ Hex Artifact Content
Login

Artifact 6319578f176cbc53eb044940ce484fae244ba6c5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 38  : pager.c,v 1.18
0350: 33 20 32 30 30 35 2f 30 31 2f 31 37 20 30 31 3a  3 2005/01/17 01:
0360: 33 33 3a 31 34 20 64 61 6e 69 65 6c 6b 31 39 37  33:14 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35  ).#define TRACE5
04f0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69  (X,Y,Z,W,V) sqli
0500: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0510: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a  ,Y,Z,W,V).#else.
0520: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
0530: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0540: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0550: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0560: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0570: 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,W).#define TRAC
0580: 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65  E5(X,Y,Z,W,V).#e
0590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
05a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
05b0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
05c0: 74 68 69 6e 20 74 68 65 20 54 52 41 43 45 58 28  thin the TRACEX(
05d0: 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a  ) macros above.*
05e0: 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66  * to print out f
05f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e  ile-descriptors.
0600: 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
0610: 65 64 20 73 6f 20 74 68 61 74 20 74 72 61 63 69  ed so that traci
0620: 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20 74 75 72  ng.** can be tur
0630: 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75 73 69 6e  ned on when usin
0640: 67 20 62 6f 74 68 20 74 68 65 20 72 65 67 75 6c  g both the regul
0650: 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6e 64  ar os_unix.c and
0660: 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a 20 62 61   os_test.c.** ba
0670: 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 50 41  ckends..**.** PA
0680: 47 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20  GERID() takes a 
0690: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
06a0: 65 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27  er struct as it'
06b0: 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a  s argument. The.
06c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  ** associated fi
06d0: 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73  le-descriptor is
06e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48   returned. FILEH
06f0: 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20  ANDLEID() takes 
0700: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72  an OsFile.** str
0710: 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75  uct as it's argu
0720: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ment..*/.#ifdef 
0730: 4f 53 5f 54 45 53 54 0a 23 64 65 66 69 6e 65 20  OS_TEST.#define 
0740: 50 41 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66  PAGERID(p) (p->f
0750: 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65  d->fd.h).#define
0760: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0770: 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a 23 65 6c  ) (fd->fd.h).#el
0780: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0790: 49 44 28 70 29 20 28 70 2d 3e 66 64 2e 68 29 0a  ID(p) (p->fd.h).
07a0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
07b0: 4c 45 49 44 28 66 64 29 20 28 66 64 2e 68 29 0a  LEID(fd) (fd.h).
07c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
07e0: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
07f0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0800: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0810: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
0820: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
0830: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0840: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0880: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0890: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
08c0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
08d0: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0900: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0910: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
0920: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0930: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0940: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
0960: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
0970: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0980: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
09a0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
09b0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
09c0: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
09f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0a00: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0a10: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
0a20: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
0a30: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
0a40: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
0a70: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a80: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a90: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0ac0: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0ad0: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0ae0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b00: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0b10: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0b20: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0b50: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0b60: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0ba0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0bb0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0bc0: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0bd0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0c00: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0c10: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0c40: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0c50: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0c60: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c80: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c90: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0ca0: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0cb0: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0cc0: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0cd0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0ce0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cf0: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0d00: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0d10: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0d20: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0d50: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0d60: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d90: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0da0: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0db0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
0dd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74  urnal file and t
0de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
0df0: 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ill be.**       
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0e20: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0e30: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0e40: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0e50: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0e60: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
0e70: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0e80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e90: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0ea0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
0eb0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
0ec0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0ed0: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0ee0: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0ef0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0f00: 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  to PAGER_UNLOCK.
0f10: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0f20: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33  .** that sqlite3
0f30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
0f40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f60: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f70: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f80: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69   sqlite_page_wri
0f90: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0fa0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0fc0: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0fd0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0fe0: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0ff0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
1000: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
1010: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1020: 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ).** The transit
1030: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1040: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 77 68  LUSIVE occurs wh
1050: 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  en before any ch
1060: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
1070: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1080: 65 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61  e file.  After a
1090: 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  n sqlite3pager_r
10a0: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
10b0: 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d  sqlite_pager_com
10c0: 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61 74 65  mit(), the state
10d0: 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41   goes back to PA
10e0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23  GER_SHARED..*/.#
10f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c  define PAGER_UNL
1100: 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69  OCK      0.#defi
1110: 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ne PAGER_SHARED 
1120: 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65       1   /* same
1130: 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   as SHARED_LOCK 
1140: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1150: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20  _RESERVED    2  
1160: 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45   /* same as RESE
1170: 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  RVED_LOCK */.#de
1180: 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55  fine PAGER_EXCLU
1190: 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61  SIVE   4   /* sa
11a0: 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f  me as EXCLUSIVE_
11b0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
11c0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
11d0: 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68    5../*.** If th
11e0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
11f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72  SERVED_LOCK macr
1200: 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  o is set to true
1210: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1220: 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64  ,.** then failed
1230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74   attempts to get
1240: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1250: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
1260: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a   busy callback..
1270: 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62  ** This is off b
1280: 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73  y default.  To s
1290: 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72  ee why, consider
12a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
12b0: 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20  cenario:.** .** 
12c0: 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41  Suppose thread A
12d0: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73   already has a s
12e0: 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  hared lock and w
12f0: 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20  ants a reserved 
1300: 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20  lock..** Thread 
1310: 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  B already has a 
1320: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e  reserved lock an
1330: 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75  d wants an exclu
1340: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a  sive lock.  If.*
1350: 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61  * both threads a
1360: 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62  re using their b
1370: 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69  usy callbacks, i
1380: 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e  t might be a lon
1390: 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72  g time.** be for
13a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65   one of the thre
13b0: 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20  ads give up and 
13c0: 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72  allows the other
13d0: 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20   to proceed..** 
13e0: 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61  But if the threa
13f0: 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20  d trying to get 
1400: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
1410: 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b  k gives up quick
1420: 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76  ly.** (if it nev
1430: 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62  er invokes its b
1440: 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68  usy callback) th
1450: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f  en the contentio
1460: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73  n will be.** res
1470: 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a  olved quickly..*
1480: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1490: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14a0: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
14b0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14c0: 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a  D_LOCK 0.#endif.
14d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
14e0: 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20  o rounds values 
14f0: 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  up so that if th
1500: 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64  e value is an ad
1510: 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67  dress it.** is g
1520: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1530: 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20  an address that 
1540: 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e  is aligned to an
1550: 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
1560: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52  ..*/.#define FOR
1570: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20  CE_ALIGNMENT(X) 
1580: 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a    (((X)+7)&~7)..
1590: 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65  /*.** Each in-me
15a0: 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20  mory image of a 
15b0: 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68  page begins with
15c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
15d0: 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68  eader..** This h
15e0: 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69  eader is only vi
15f0: 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61  sible to this pa
1600: 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65  ger module.  The
1610: 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20   client.** code 
1620: 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72  that calls pager
1630: 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64   sees only the d
1640: 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1650: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1660: 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73  ** Client code s
1670: 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74  hould call sqlit
1680: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1690: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
16a0: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
16b0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
16c0: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
16d0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
16e0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16f0: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
1700: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
1710: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
1720: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1730: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1740: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
1750: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1760: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1770: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1780: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1790: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
17a0: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
17b0: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
17c0: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
17d0: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
17e0: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
17f0: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
1800: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1810: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
1820: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
1830: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
1840: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1850: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1860: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1870: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1880: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1890: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
18a0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67   when sqlite3pag
18b0: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
18c0: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
18d0: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
18e0: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
18f0: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1900: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1910: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1920: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
1930: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
1940: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
1950: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
1960: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1970: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1980: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
1990: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
19a0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
19d0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
1a00: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
1a10: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
1a20: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
1a30: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
1a40: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
1a50: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
1a60: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
1a70: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
1a80: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
1aa0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
1ab0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53  .  PgHdr *pNextS
1ac0: 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b  tmt, *pPrevStmt;
1ad0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
1ae0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
1af0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ent journal */. 
1b00: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
1b30: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
1b40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b50: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b70: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
1b80: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1b90: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1bd0: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1be0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1c10: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1c20: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1c30: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1c40: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1c50: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1c60: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1c70: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68  his page */.  sh
1c80: 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ort int nRef;   
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  Number of users 
1cb0: 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  of this page */.
1cc0: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20   /* Dirty pages 
1cf0: 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72 2e  sorted by PgHdr.
1d00: 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  pgno */.  /* pPa
1d10: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 62  ger->psAligned b
1d20: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
1d30: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
1d40: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1d50: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1d60: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1d70: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1d80: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1d90: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
1da0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
1db0: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
1dc0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
1dd0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
1de0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
1df0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
1e00: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
1e10: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
1e20: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
1e30: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e40: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
1e50: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
1e60: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
1e70: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
1e80: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
1e90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ea0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1eb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
1ec0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
1ed0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1ee0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
1ef0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
1f00: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
1f10: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
1f20: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
1f30: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
1f40: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
1f50: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
1f60: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
1f70: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
1f80: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
1f90: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
1fa0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
1fb0: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
1fc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1fd0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
1fe0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
1ff0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2000: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2010: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2020: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2030: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2040: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2050: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2060: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2070: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2080: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2090: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
20a0: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
20b0: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
20c0: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
20d0: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
20e0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
20f0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2100: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2110: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
2120: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
2130: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
2140: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2150: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
2160: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
2170: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
2180: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
2190: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
21a0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
21b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
21c0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
21d0: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
21e0: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
21f0: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
2200: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
2210: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2220: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
2230: 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  id*)&((char*)(&(
2240: 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73 41  G)[1]))[(P)->psA
2250: 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e 65  ligned]).#define
2260: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
2270: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
2280: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
2290: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
22a0: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73 41  [1]))[(PGR)->psA
22b0: 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e 45  ligned+(PGR)->nE
22c0: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  xtra])../*.** Ho
22d0: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
22e0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
22f0: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
2300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
2310: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
2320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50  ..*/.#define N_P
2330: 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a  G_HASH 2048../*.
2340: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
2350: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
2360: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
2370: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2380: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2390: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
23a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
23b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23c0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
23d0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68  uct Pager {.  ch
23e0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
23f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
2420: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2440: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2450: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2460: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
2470: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
2480: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
2490: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
24a0: 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64  s */.  OsFile fd
24b0: 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20  , jfd;          
24c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
24d0: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
24e0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
24f0: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64  */.  OsFile stfd
2500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2510: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2520: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
2530: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
2540: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2570: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2580: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2590: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
25a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
25b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
25c0: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
25d0: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
25e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
25f0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2600: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2610: 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73 74  in() */.  i64 st
2620: 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mtJSize;        
2630: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2640: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
2650: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
2660: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
2670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2680: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
2690: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
26a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
26b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
26c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
26d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
26e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
26f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
2700: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
2710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2720: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
2730: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2740: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
2770: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
2780: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2790: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
27a0: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
27b0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
27c0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
27d0: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
27e0: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
27f0: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
2800: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2810: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
2820: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2830: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2840: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2850: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2860: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 73  page */.  int ps
2870: 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20 20  Aligned;        
2880: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69 7a        /* pageSiz
2890: 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  e rounded up to 
28a0: 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 20  a multiple of 8 
28b0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
28e0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
28f0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
2900: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2910: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2920: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2930: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2940: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2950: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2960: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2970: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2980: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
29a0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
29b0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
29c0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
29d0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
29e0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
29f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2a00: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2a10: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ead/written */. 
2a20: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
2a30: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2a40: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2a50: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2a60: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2a70: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a90: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2aa0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
2ab0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2ac0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ad0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2ae0: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2af0: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2b00: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b20: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2b30: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2b40: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b60: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
2b70: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
2b80: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
2b90: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2ba0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2bc0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2bd0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2be0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2bf0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2c00: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2c10: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2c20: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2c30: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2c40: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2c50: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2c60: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2c70: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2ca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2cb0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2cc0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2cd0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2ce0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2cf0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2d00: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2d10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2d20: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2d30: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2d40: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2d50: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2d80: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2d90: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
2da0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2db0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2dc0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2dd0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2de0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2df0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2e00: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2e10: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2e20: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e40: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2e50: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2e60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2e70: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2e80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e90: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2ea0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2eb0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2ec0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2ed0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2ee0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2ef0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2f00: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f20: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2f30: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2f40: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f60: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f70: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
2f90: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
2fb0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2fc0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fd0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2fe0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2ff0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3000: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3010: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3020: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
3030: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3040: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3050: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
3060: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
3070: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
3080: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3090: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
30a0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
30b0: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
30c0: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
30d0: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
30e0: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
30f0: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3100: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3110: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3120: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3140: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
3150: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3160: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
3170: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3190: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
31a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
31b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
31c0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
31d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
31e0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
31f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3200: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3210: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3220: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3230: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3240: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3250: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3260: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3270: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
3280: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
3290: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e   started */.  in
32a0: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
32c0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
32d0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
32e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
32f0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3300: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3310: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3320: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d  er to PgHdr */.}
3330: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
3340: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
3350: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
3360: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
3370: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
3380: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
3390: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
33a0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
33b0: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
33c0: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
33d0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
33e0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
33f0: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
3400: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
3410: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
3420: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3430: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
3440: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
3450: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
3460: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
3470: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
3480: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
3490: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
34a0: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
34b0: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ve? */../*.** Jo
34c0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
34d0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
34e0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
34f0: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3500: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3510: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3520: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3530: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3540: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3550: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3560: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3570: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3580: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3590: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
35a0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
35b0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
35c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
35d0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
35e0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
35f0: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3600: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3610: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3620: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3630: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3640: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3650: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3660: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3670: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3680: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3690: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
36a0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
36b0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
36c0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
36d0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
36e0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
36f0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3700: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3710: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3720: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3730: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3740: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3750: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3760: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3770: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3780: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3790: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
37a0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
37b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
37c0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
37d0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
37e0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
37f0: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3800: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3810: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3820: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3830: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3840: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3850: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3860: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3870: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
3880: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
3890: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
38a0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
38b0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
38c0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
38d0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
38e0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
38f0: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3900: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3910: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3920: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3930: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3940: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3950: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3960: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3970: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
3980: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
3990: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
39a0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
39b0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
39c0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
39d0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
39e0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
39f0: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3a00: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3a10: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3a20: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3a40: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3a50: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3a60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
3a80: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
3a90: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
3aa0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
3ab0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
3ac0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
3ad0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3af0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3b00: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3b10: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3b20: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3b30: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3b40: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3b50: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3b60: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3b70: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
3b80: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3b90: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3ba0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3bb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3bc0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3bd0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3be0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3bf0: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3c00: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3c10: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3c20: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3c30: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3c40: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3c50: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3c60: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3c70: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3c80: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3c90: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3ca0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3cb0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3cc0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3cd0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3ce0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3cf0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3d00: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3d10: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3d20: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3d30: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3d40: 54 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65  The default size
3d50: 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f   of a disk secto
3d60: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  r.*/.#define PAG
3d70: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35  ER_SECTOR_SIZE 5
3d80: 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  12../*.** Page n
3d90: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
3da0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3db0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3dc0: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3dd0: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3de0: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3df0: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3e00: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3e10: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3e30: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3e40: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
3e50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
3e60: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
3e70: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
3e80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
3e90: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3ea0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3eb0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3ec0: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3ed0: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3ee0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3ef0: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3f00: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3f10: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3f20: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3f30: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3f40: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3f50: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
3f60: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
3f70: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
3f80: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
3f90: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
3fa0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
3fb0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
3fc0: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
3fd0: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
3fe0: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
3ff0: 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e  ng (for debuggin
4000: 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64  g) here:.*/.#ifd
4010: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4020: 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66    int pager3_ref
4030: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b  info_enable = 0;
4040: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
4050: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48  ager_refinfo(PgH
4060: 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74  dr *p){.    stat
4070: 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  ic int cnt = 0;.
4080: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f      if( !pager3_
4090: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29  refinfo_enable )
40a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
40b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
40c0: 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a  .       "REFCNT:
40d0: 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %4d addr=%p nRe
40e0: 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f=%d\n",.       
40f0: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4100: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4110: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
4120: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
4130: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
4140: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
4150: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
4160: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
4170: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
4180: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4190: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
41a0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
41b0: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
41c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
41d0: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
41e0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
41f0: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
4200: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
4210: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
4220: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
4230: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
4240: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4250: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
4260: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
4270: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
4280: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
4290: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
42a0: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
42b0: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33  u32 *pRes){.  u3
42c0: 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b  2 res;.  int rc;
42d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
42e0: 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  sRead(fd, &res, 
42f0: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
4300: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4310: 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  K ){.    unsigne
4320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4330: 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65    memcpy(ac, &re
4340: 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d  s, 4);.    res =
4350: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4360: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4370: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4380: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72  .  }.  *pRes = r
4390: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
43a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
43b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
43c0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
43d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
43e0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
43f0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4400: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4410: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4420: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4430: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4440: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4450: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
4460: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
4470: 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  ;.  ac[0] = (val
4480: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4490: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
44a0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
44b0: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
44c0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
44d0: 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74  al & 0xff;.  ret
44e0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
44f0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
4500: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
4510: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
4520: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
4530: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4540: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4550: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4560: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4570: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4580: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4590: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
45a0: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
45b0: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
45c0: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
45d0: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
45e0: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
45f0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4600: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4610: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4620: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4630: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4640: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4650: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4660: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
4670: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
4680: 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68  'offset' from th
4690: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
46a0: 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61  d by.** page hea
46b0: 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74  der 'p'..*/.stat
46c0: 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33  ic u32 retrieve3
46d0: 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20  2bits(PgHdr *p, 
46e0: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
46f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
4700: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
4710: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
4720: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
4730: 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  set];.  return (
4740: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
4750: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
4760: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d  ]<<8) | ac[3];.}
4770: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
4780: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
4790: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
47a0: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
47b0: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
47c0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
47d0: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
47e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
47f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4800: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
4810: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4820: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
4830: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
4840: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
4850: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4860: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29  PAGER_ERR_DISK )
4870: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4880: 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61  IOERR;.  if( pPa
4890: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
48a0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20  AGER_ERR_FULL ) 
48b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
48c0: 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ULL;.  if( pPage
48d0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
48e0: 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20  ER_ERR_MEM )    
48f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4900: 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  EM;.  if( pPager
4910: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4920: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20  R_ERR_CORRUPT ) 
4930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
4940: 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  UPT;.  return rc
4950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
4960: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
4970: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4980: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
4990: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
49a0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
49b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
49c0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
49d0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
49e0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
49f0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4a00: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4a10: 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73  Malloc(). *pzMas
4a20: 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ter is.** set to
4a30: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65   point at the me
4a40: 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
4a50: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
4a60: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
4a70: 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a  sqliteFree() *pz
4a80: 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  Master..**.** If
4a90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4aa0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4ab0: 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65  present *pzMaste
4ac0: 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  r is set to 0 an
4ad0: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
4ae0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
4af0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
4b00: 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20  rJournal(OsFile 
4b10: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70  *pJrnl, char **p
4b20: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
4b30: 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20  rc;.  u32 len;. 
4b40: 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20   i64 szJ;.  u32 
4b50: 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  cksum;.  int i;.
4b60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4b70: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
4b80: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
4b90: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
4ba0: 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  */..  *pzMaster 
4bb0: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
4bc0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
4bd0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  Jrnl, &szJ);.  i
4be0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4bf0: 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74   || szJ<16 ) ret
4c00: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
4c10: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
4c20: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20  rnl, szJ-16);.  
4c30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4c40: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
4c50: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
4c60: 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b  ts(pJrnl, &len);
4c70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4c80: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
4c90: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
4ca0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73  bits(pJrnl, &cks
4cb0: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
4cc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4cd0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
4ce0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
4cf0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20  l, aMagic, 8);. 
4d00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4d10: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
4d20: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
4d30: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
4d40: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
4d50: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
4d60: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
4d70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4d80: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4d90: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63    *pzMaster = (c
4da0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
4db0: 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28  oc(len+1);.  if(
4dc0: 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20   !*pzMaster ){. 
4dd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4de0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
4df0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4e00: 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65  (pJrnl, *pzMaste
4e10: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
4e20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4e30: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
4e40: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
4e50: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
4e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4e70: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
4e80: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
4e90: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
4ea0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
4eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
4ec0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
4ed0: 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69  -= (*pzMaster)[i
4ee0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
4ef0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
4f00: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
4f10: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
4f20: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
4f30: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
4f40: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
4f50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
4f60: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
4f70: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
4f80: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
4f90: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
4fa0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
4fb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
4fc0: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
4fd0: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
4fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
4ff0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5000: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5010: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5020: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 0;.  }else{.
5030: 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b      (*pzMaster)[
5040: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  len] = '\0';.  }
5050: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
5060: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5070: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
5080: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
5090: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
50a0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
50b0: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
50c0: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
50d0: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
50e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
50f0: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5100: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5110: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5120: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5130: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5140: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
5160: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5220: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
5230: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5240: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
5250: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
5260: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
5270: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
5280: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
5290: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
52a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
52b0: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
52c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
52d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
52e0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
52f0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
5300: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
5310: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
5320: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
5330: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5340: 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72  ger) );.  pPager
5350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f  ->journalOff = o
5360: 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20  ffset;.  return 
5370: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
5380: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5390: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
53a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
53b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
53c0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
53d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
53e0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
53f0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5400: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5410: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5430: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5440: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5450: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5460: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5470: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5480: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5490: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
54a0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
54b0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
54c0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
54d0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
54e0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
54f0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5500: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5510: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5520: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5530: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5540: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5550: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5560: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5570: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5580: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5590: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
55a0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
55b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
55c0: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
55d0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
55e0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
55f0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5600: 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74  *pPager){..  int
5610: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
5620: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
5630: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5640: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
5650: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
5660: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
5670: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
5680: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
5690: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
56a0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
56b0: 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a  journalHdr;.  }.
56c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
56d0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
56e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
56f0: 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20  .  /* FIX ME: . 
5700: 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c   **.  ** Possibl
5710: 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f  y for a pager no
5720: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
5730: 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  e, the journal m
5740: 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  agic should not.
5750: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
5760: 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69  until nRec is fi
5770: 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20  lled in as part 
5780: 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72  of next syncJour
5790: 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a  nal(). .  **.  *
57a0: 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65  * Actually maybe
57b0: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
57c0: 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64  al header should
57d0: 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69   be delayed unti
57e0: 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e  l that.  ** poin
57f0: 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  t. Think about t
5800: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  his..  */.  rc =
5810: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5820: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
5830: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
5840: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
5850: 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  c));..  if( rc==
5860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5870: 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65   /* The nRec Fie
5880: 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66  ld. 0xFFFFFFFF f
5890: 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e  or no-sync journ
58a0: 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  als. */.    rc =
58b0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
58c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
58d0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
58e0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d  ffffff : 0);.  }
58f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
5910: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
5920: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
5930: 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33   */ .    sqlite3
5940: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
5950: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
5960: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
5970: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
5980: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
5990: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
59a0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
59b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
59c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
59d0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
59e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
59f0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5a00: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5a10: 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
5a20: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ze);.  }.  if( r
5a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5a40: 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d      /* The assum
5a50: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
5a60: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
5a70: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
5a80: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5a90: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65  >jfd, pPager->se
5aa0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ctorSize);.  }..
5ab0: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
5ac0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
5ad0: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
5ae0: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
5af0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
5b00: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5b10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5b20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
5b30: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
5b40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5b50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
5b60: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
5b70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
5b80: 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20  lOff-1);.    rc 
5b90: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
5ba0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  (&pPager->jfd, "
5bb0: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20  \000", 1);.  }. 
5bc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5bd0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5be0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5bf0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
5c00: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5c10: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
5c20: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5c30: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
5c40: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
5c50: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5c60: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
5c70: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
5c80: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
5c90: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
5ca0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5cb0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
5cc0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
5cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
5ce0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
5cf0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
5d00: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
5d10: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
5d20: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
5d30: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
5d40: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
5d50: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
5d60: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
5d70: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
5d80: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
5d90: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
5da0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
5db0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
5dc0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
5dd0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5de0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
5df0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
5e00: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
5e10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
5e20: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
5e30: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
5e40: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
5e50: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
5e60: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
5e70: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
5e80: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
5e90: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
5ea0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
5eb0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
5ec0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
5ed0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5ef0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
5f00: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5f10: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
5f20: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
5f30: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
5f40: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
5f50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5f60: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5f70: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5f80: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5f90: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
5fa0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5fb0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
5fc0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
5fd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5fe0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
5ff0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
6000: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
6010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6020: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6030: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
6040: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
6050: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6060: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
6070: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6080: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6090: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
60a0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
60b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
60c0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
60d0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
60e0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
60f0: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
6100: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6110: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6120: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
6130: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6140: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
6150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6160: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6170: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  &pPager->jfd, pD
6180: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
61a0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
61b0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
61c0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
61d0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
61e0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
61f0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
6200: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
6210: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
6220: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
6230: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
6240: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
6250: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
6260: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
6270: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
6280: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6290: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
62a0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
62b0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
62c0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
62d0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
62e0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
62f0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
6300: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
6310: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
6320: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
6330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
6340: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6350: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6360: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6370: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6380: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
6390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
63a0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
63b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
63c0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
63d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
63e0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
63f0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6400: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6410: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6420: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6430: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6440: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6450: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6460: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6470: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6480: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
6490: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
64a0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
64b0: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
64c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
64d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
64e0: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
64f0: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
6500: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
6510: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
6520: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
6530: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
6540: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6550: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
6560: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
6570: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
6580: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
6590: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
65a0: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
65b0: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
65c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
65d0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
65e0: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
65f0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
6600: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
6610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
6620: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
6630: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
6640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
6650: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
6660: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
6670: 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73  nt i; .  u32 cks
6680: 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20  um = 0; ..  if( 
6690: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
66a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
66b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
66c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
66d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
66e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
66f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
6700: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
6710: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
6720: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
6730: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
6740: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
6750: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
6760: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
6770: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
6780: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6790: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
67a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
67b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
67c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
67d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
67e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
67f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
6800: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
6810: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6820: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
6830: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6850: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
6860: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
6870: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6880: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6890: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
68a0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
68b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
68c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
68d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
68e0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
68f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  , zMaster, len);
6900: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6910: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6920: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6930: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6940: 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  fd, len);.  if( 
6950: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6960: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6970: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6980: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
6990: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
69a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
69b0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
69c0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
69d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
69e0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
69f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
6a10: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65 74 75  Sync = 1;.  retu
6a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6a30: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
6a40: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
6a50: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
6a60: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
6a70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
6a80: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
6a90: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
6aa0: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
6ab0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
6ac0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
6ad0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
6ae0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
6af0: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
6b00: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
6b10: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
6b20: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
6b30: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
6b40: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
6b50: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
6b60: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
6b70: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
6b80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6b90: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
6ba0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
6bb0: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
6bc0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
6bd0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
6be0: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
6bf0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
6c00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
6c10: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
6c20: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
6c30: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
6c40: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
6c50: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
6c60: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
6c70: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
6c80: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
6c90: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
6ca0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
6cb0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
6cc0: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
6cd0: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
6ce0: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
6cf0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
6d00: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
6d10: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
6d20: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
6d30: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
6d40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
6d50: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
6d60: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
6d70: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
6d80: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
6d90: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6db0: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
6dc0: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
6dd0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6de0: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
6df0: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
6e00: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
6e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6e20: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
6e30: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
6e40: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
6e50: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
6e60: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
6e70: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
6e80: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
6e90: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
6ea0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
6eb0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
6ec0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
6ed0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
6ee0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
6ef0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
6f00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
6f10: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
6f20: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
6f30: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
6f40: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
6f50: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
6f60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
6f70: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
6f80: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
6f90: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
6fa0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
6fb0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
6fc0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
6fd0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
6fe0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
6ff0: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
7000: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
7010: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
7020: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
7030: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
7040: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
7050: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
7060: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
7070: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
7080: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
7090: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
70a0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
70b0: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
70c0: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
70d0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
70e0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
70f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
7100: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
7110: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
7120: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
7130: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
7140: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
7150: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
7160: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
7170: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
7180: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
7190: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
71a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
71b0: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
71c0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
71d0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
71e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
71f0: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
7200: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
7210: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
7220: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
7230: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7240: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
7260: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
7270: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
7280: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
7290: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
72a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
72b0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
72c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
72d0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
72e0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
72f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
7300: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
7310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
7320: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7330: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7340: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7350: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7360: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7370: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7380: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7390: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
73a0: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
73b0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
73c0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
73d0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
73e0: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
73f0: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7400: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7410: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7420: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7440: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
7450: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
7460: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
7470: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
7480: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
7490: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
74a0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
74b0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
74c0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
74d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
74e0: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
74f0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7500: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
7510: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
7520: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7530: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
7540: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
7550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7560: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
7570: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
7580: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7590: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
75a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
75b0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
75c0: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
75d0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
75e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
75f0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
7600: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7610: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
7620: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7630: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7640: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7650: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7660: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
7670: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
7680: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
7690: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
76a0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
76b0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
76c0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
76d0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
76e0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
76f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7700: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7710: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7720: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
7730: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7740: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7750: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7760: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7770: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
7780: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
7790: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
77a0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
77b0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
77c0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
77d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
77e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
77f0: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
7800: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
7810: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
7820: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
7830: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7840: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
7850: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
7860: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
7870: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
7880: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
7890: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
78a0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
78b0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
78c0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
78d0: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
78e0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
78f0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
7900: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
7910: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
7920: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
7930: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
7940: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
7950: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
7960: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
7970: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
7980: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
7990: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
79a0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
79b0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
79c0: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
79d0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
79e0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
79f0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
7a00: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
7a10: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
7a20: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
7a30: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
7a40: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
7a50: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
7a60: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
7a70: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
7a80: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
7a90: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
7aa0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
7ab0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
7ac0: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
7ad0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
7ae0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
7af0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
7b00: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
7b10: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
7b20: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
7b30: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
7b40: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
7b50: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
7b60: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
7b70: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
7b80: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
7b90: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
7ba0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
7bb0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
7bc0: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
7bd0: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
7be0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
7bf0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
7c00: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
7c10: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
7c20: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
7c30: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
7c40: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
7c50: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
7c60: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
7c70: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
7c80: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61  onst char *aData
7c90: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
7ca0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7cb0: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
7cc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
7cd0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
7ce0: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
7cf0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
7d00: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
7d10: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
7d20: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
7d30: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
7d40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7d50: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
7d60: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
7d70: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
7d80: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
7d90: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
7da0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
7db0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
7dc0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
7dd0: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
7de0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
7df0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
7e00: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
7e10: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
7e20: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
7e30: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
7e40: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7e50: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
7e60: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
7e70: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
7e80: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
7e90: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
7ea0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ec0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
7ed0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
7ee0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
7f10: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
7f20: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
7f30: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f50: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
7f60: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
7f70: 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b  g */.  u8 aData[
7f80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
7f90: 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20  SIZE];  /* Temp 
7fa0: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
7fb0: 67 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65  ge */..  rc = re
7fc0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70  ad32bits(jfd, &p
7fd0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
7fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7ff0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
8000: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
8010: 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d   &aData, pPager-
8020: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
8030: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8040: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
8050: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8060: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
8070: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
8080: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
8090: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
80a0: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
80b0: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
80c0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
80d0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
80e0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
80f0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8100: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
8110: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
8120: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
8130: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
8140: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
8150: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
8160: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
8170: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
8180: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
8190: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
81a0: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
81b0: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
81c0: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
81d0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
81e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
81f0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
8200: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
8210: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
8220: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8230: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
8240: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
8250: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8260: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
8270: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8280: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
8290: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
82a0: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
82b0: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67  cksum(pPager, pg
82c0: 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  no, aData)!=cksu
82d0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
82e0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
82f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
8300: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
8310: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
8320: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
8330: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
8340: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
8350: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
8360: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
8370: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
8380: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
8390: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
83a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
83b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
83c0: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
83d0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
83e0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
83f0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
8400: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
8410: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
8420: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
8430: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
8440: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
8450: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
8460: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
8470: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
8480: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
8490: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
84a0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  ot dirty..  */. 
84b0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
84c0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
84d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
84e0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
84f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
8500: 50 67 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22  Pg );.  TRACE3("
8510: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
8520: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
8530: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
8540: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8550: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
8560: 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  SIVE ){.    sqli
8570: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
8580: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
8590: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
85a0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
85b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
85c0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  &pPager->fd, aDa
85d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
85e0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Size);.  }.  if(
85f0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
8600: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
8610: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
8620: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
8630: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
8640: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
8650: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
8660: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
8670: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
8680: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
8690: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
86a0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
86b0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
86c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
86d0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
86e0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
86f0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
8700: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
8710: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
8720: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
8730: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
8740: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
8750: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
8760: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
8770: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
8780: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
8790: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
87a0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
87b0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
87c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
87d0: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
87e0: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
87f0: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
8800: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
8810: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
8820: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
8830: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
8840: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
8850: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8860: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8870: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
8880: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
8890: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
88a0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
88b0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
88c0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
88d0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
88e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
88f0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
8900: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
8910: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
8920: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
8930: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
8940: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
8950: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
8960: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
8970: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
8980: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
8990: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
89a0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
89b0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
89c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
89d0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
89e0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
89f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8a00: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
8a10: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
8a20: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
8a30: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
8a40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
8a50: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
8a60: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
8a70: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
8a80: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
8a90: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
8aa0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
8ab0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
8ac0: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
8ad0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
8ae0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
8af0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
8b00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8b10: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
8b20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
8b30: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8b40: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
8b50: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
8b60: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
8b70: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
8b80: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
8b90: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
8ba0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
8bb0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
8bc0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8bd0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
8be0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
8bf0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
8c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
8c10: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
8c20: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8c30: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
8c40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8c50: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
8c60: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
8c70: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
8c80: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74  /.  memset(&mast
8c90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61  er, 0, sizeof(ma
8ca0: 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73  ster));.  rc = s
8cb0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
8cc0: 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d  Only(zMaster, &m
8cd0: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
8ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8cf0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8d00: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
8d10: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
8d20: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d  te3OsFileSize(&m
8d30: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
8d40: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
8d50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
8d60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8d70: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
8d80: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
8d90: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8da0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
8db0: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
8dc0: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
8dd0: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
8de0: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
8df0: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
8e00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
8e10: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
8e20: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
8e30: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
8e40: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
8e50: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
8e60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
8e70: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
8e80: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
8e90: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
8ea0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8eb0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
8ec0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
8ed0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8ee0: 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20  OsRead(&master, 
8ef0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
8f00: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
8f10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8f20: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
8f30: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
8f40: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
8f50: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
8f60: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
8f70: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
8f80: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
8f90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
8fa0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
8fb0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
8fc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
8fd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
8fe0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
8ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
9000: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
9010: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
9020: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
9030: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
9040: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
9050: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
9060: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
9070: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
9080: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
9090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
90a0: 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20  File journal;.  
90b0: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
90c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f        memset(&jo
90d0: 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  urnal, 0, sizeof
90e0: 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20  (journal));.    
90f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9100: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
9110: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
9120: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
9130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9140: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9150: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9160: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
9170: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
9180: 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61  rJournal(&journa
9190: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
91a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
91b0: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
91c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
91d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
91e0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
91f0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9200: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
9210: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21   c = zMasterPtr!
9220: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
9230: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
9240: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71  )==0;.        sq
9250: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
9260: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Ptr);.        if
9270: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
9280: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
9290: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
92a0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
92b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
92c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
92d0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92f0: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
9300: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
9310: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
9320: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  .  .  sqlite3OsD
9330: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
9340: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
9350: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
9360: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
9370: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
9380: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
9390: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
93a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
93b0: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
93c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
93d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  .}../*.** Make e
93e0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
93f0: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
9400: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
9410: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
9420: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
9430: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
9440: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
9450: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
9460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9470: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
9480: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
9490: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
94a0: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
94b0: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
94c0: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
94d0: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
94e0: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
94f0: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
9500: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
9510: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
9520: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
9530: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
9540: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
9550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9560: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
9570: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
9580: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
9590: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
95a0: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
95b0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
95c0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
95d0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
95e0: 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58   zBuf[SQLITE_MAX
95f0: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20  _PAGE_SIZE];.   
9600: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
9610: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9620: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
9630: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
9640: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
9650: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
9660: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
9670: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
9680: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
9690: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
96a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
96b0: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
96c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
96d0: 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
96e0: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
96f0: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
9700: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
9710: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
9720: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
9730: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a   CODEC(pPager, z
9740: 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Buf, pPg->pgno, 
9750: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
9760: 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66       memset(zBuf
9770: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
9780: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9790: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
97a0: 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75  =0 || memcmp(zBu
97b0: 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  f, PGHDR_TO_DATA
97c0: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
97d0: 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
97e0: 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
97f0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75  O_DATA(pPg), zBu
9800: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
9810: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
9820: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
9830: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
9840: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
9850: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9860: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
9870: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
9880: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
9890: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
98a0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
98b0: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
98c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
98d0: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
98e0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
98f0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
9900: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9910: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
9920: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
9930: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
9940: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9950: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
9960: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
9970: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
9980: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
9990: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 72   int nPage){.  r
99a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54  eturn sqlite3OsT
99b0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
99c0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
99d0: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
99e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
99f0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
9a00: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
9a10: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
9a20: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
9a30: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
9a40: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
9a50: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
9a60: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
9a70: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
9a80: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
9a90: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
9aa0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
9ab0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
9ac0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
9ad0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
9ae0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
9af0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9b00: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9b10: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
9b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
9b30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
9b40: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
9b50: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
9b60: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
9b70: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
9b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
9b90: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
9ba0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
9bb0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
9bc0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
9bd0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
9be0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
9bf0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
9c00: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
9c10: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
9c20: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
9c30: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
9c40: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
9c50: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
9c60: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
9c70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9c80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9c90: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
9ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
9cb0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
9cc0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
9cd0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
9ce0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
9cf0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
9d00: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
9d10: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
9d20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9d30: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
9d40: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
9d50: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
9d60: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
9d70: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
9d80: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
9d90: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
9da0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
9db0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
9dc0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
9dd0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
9de0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
9df0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
9e00: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
9e10: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
9e20: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
9e30: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
9e40: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
9e50: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
9e60: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
9e70: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
9e80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
9e90: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
9ea0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
9eb0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
9ec0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
9ee0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
9ef0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
9f00: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
9f10: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
9f20: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
9f30: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
9f40: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
9f50: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
9f60: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
9f70: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
9f80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
9f90: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
9fa0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
9fb0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
9fc0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
9fd0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
9fe0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
9ff0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
a000: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
a010: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
a020: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
a030: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a040: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
a050: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
a060: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
a070: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
a080: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a090: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
a0a0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
a0b0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
a0c0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
a0d0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
a0e0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
a0f0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
a100: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
a110: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a120: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
a130: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
a140: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
a150: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
a160: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
a170: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
a180: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
a190: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
a1a0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
a1b0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
a1c0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
a1d0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
a1e0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
a1f0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
a200: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
a210: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
a220: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
a230: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
a240: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
a250: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
a260: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
a270: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
a280: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
a290: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
a2a0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
a2b0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
a2c0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
a2d0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
a2e0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
a2f0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
a300: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
a310: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
a320: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
a330: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
a340: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
a350: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
a360: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
a370: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
a380: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a390: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
a3a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
a3b0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
a3c0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
a3d0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
a3e0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
a3f0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
a400: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
a410: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
a420: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
a430: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
a440: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
a450: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
a460: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a470: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
a480: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
a490: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
a4a0: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
a4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
a4e0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
a4f0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
a500: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a510: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
a520: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
a530: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a540: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a550: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
a560: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
a570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
a580: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
a590: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
a5a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a5b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
a5c0: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
a5d0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
a5e0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
a5f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a600: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a610: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
a620: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
a630: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
a640: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
a650: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
a660: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
a670: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
a680: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
a690: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
a6a0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
a6b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
a6c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
a6d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
a6f0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a700: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
a710: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a720: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
a730: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
a740: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
a750: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
a760: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
a770: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
a780: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
a790: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
a7a0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
a7b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
a7c0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
a7d0: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
a7e0: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
a7f0: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
a800: 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67  terJournal(&pPag
a810: 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65  er->jfd, &zMaste
a820: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  r);.  assert( rc
a830: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
a840: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a850: 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72  E_OK || (zMaster
a860: 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69   && !sqlite3OsFi
a870: 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72  leExists(zMaster
a880: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
a890: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
a8a0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
a8b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a8c0: 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
a8d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
a8e0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a8f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
a900: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
a910: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
a920: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
a930: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
a940: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
a950: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
a960: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
a970: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
a980: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
a990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
a9a0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
a9b0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
a9c0: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
a9d0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
a9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
a9f0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
aa00: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
aa10: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
aa20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
aa30: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
aa40: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
aa50: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
aa60: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
aa70: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
aa80: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
aa90: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
aaa0: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
aab0: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
aac0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
aad0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
aae0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
aaf0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
ab00: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
ab10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
ab20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
ab30: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
ab40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ab50: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
ab60: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
ab70: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
ab80: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
ab90: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
aba0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
abb0: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
abc0: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
abd0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
abe0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
abf0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
ac00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
ac10: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
ac20: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
ac30: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
ac40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
ac50: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
ac60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ac70: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
ac80: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
ac90: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
aca0: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
acb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
acc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
acd0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
ace0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
acf0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
ad00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ad10: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
ad20: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
ad30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
ad40: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
ad50: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
ad60: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
ad70: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
ad80: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ad90: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
ada0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
adb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
adc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
add0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ade0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
adf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ae00: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
ae10: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
ae20: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
ae30: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
ae40: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
ae50: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
ae60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ae70: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
ae80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ae90: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
aea0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
aeb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72  .    }..    /* r
aec0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
aed0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
aee0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
aef0: 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20  Pager)); */.    
af00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
af10: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  K ) goto end_pla
af20: 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a  yback;.  .    /*
af30: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
af40: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
af50: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
af60: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
af70: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
af80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
af90: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
afa0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
afb0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
afc0: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
afd0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
afe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aff0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
b000: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b010: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b030: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
b040: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
b050: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b060: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b070: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
b080: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
b090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b0a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
b0b0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
b0c0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
b0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
b0e0: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
b0f0: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
b100: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
b110: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
b120: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
b130: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
b140: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
b150: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
b160: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
b170: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
b180: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
b190: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
b1a0: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
b1b0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
b1c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b1d0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b1e0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
b1f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
b200: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
b210: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
b220: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
b230: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
b240: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
b250: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
b260: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
b270: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
b280: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  ter journal. If 
b290: 65 72 72 6f 72 73 20 0a 20 20 20 20 2a 2a 20 6f  errors .    ** o
b2a0: 63 63 75 72 20 64 75 72 69 6e 67 20 74 68 69 73  ccur during this
b2b0: 20 70 72 6f 63 65 73 73 2c 20 69 67 6e 6f 72 65   process, ignore
b2c0: 20 74 68 65 6d 2e 0a 20 20 20 20 2a 2f 0a 20 20   them..    */.  
b2d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b2e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 61 67  _OK ){.      pag
b2f0: 65 72 5f 64 65 6c 6d 61 73 74 65 72 28 7a 4d 61  er_delmaster(zMa
b300: 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ster);.    }.   
b310: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
b320: 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ter);.  }..  /* 
b330: 54 68 65 20 50 61 67 65 72 2e 73 65 63 74 6f 72  The Pager.sector
b340: 53 69 7a 65 20 76 61 72 69 61 62 6c 65 20 6d 61  Size variable ma
b350: 79 20 68 61 76 65 20 62 65 65 6e 20 75 70 64 61  y have been upda
b360: 74 65 64 20 77 68 69 6c 65 20 72 6f 6c 6c 69 6e  ted while rollin
b370: 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61 20 6a 6f  g.  ** back a jo
b380: 75 72 6e 61 6c 20 63 72 65 61 74 65 64 20 62 79  urnal created by
b390: 20 61 20 70 72 6f 63 65 73 73 20 77 69 74 68 20   a process with 
b3a0: 61 20 64 69 66 66 65 72 65 6e 74 20 50 41 47 45  a different PAGE
b3b0: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 0a 20 20  R_SECTOR_SIZE.  
b3c0: 2a 2a 20 76 61 6c 75 65 2e 20 52 65 73 65 74 20  ** value. Reset 
b3d0: 69 74 20 74 6f 20 74 68 65 20 63 6f 72 72 65 63  it to the correc
b3e0: 74 20 76 61 6c 75 65 20 66 6f 72 20 74 68 69 73  t value for this
b3f0: 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20   process..  */. 
b400: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
b410: 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54  ize = PAGER_SECT
b420: 4f 52 5f 53 49 5a 45 3b 0a 20 20 72 65 74 75 72  OR_SIZE;.  retur
b430: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  n rc;.}../*.** P
b440: 6c 61 79 62 61 63 6b 20 74 68 65 20 73 74 61 74  layback the stat
b450: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
b460: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 73 69 6d  *.** This is sim
b470: 69 6c 61 72 20 74 6f 20 70 6c 61 79 69 6e 67 20  ilar to playing 
b480: 62 61 63 6b 20 74 68 65 20 74 72 61 6e 73 61 63  back the transac
b490: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 75 74  tion journal but
b4a0: 20 77 69 74 68 0a 2a 2a 20 61 20 66 65 77 20 65   with.** a few e
b4b0: 78 74 72 61 20 74 77 69 73 74 73 2e 0a 2a 2a 0a  xtra twists..**.
b4c0: 2a 2a 20 20 20 20 28 31 29 20 20 54 68 65 20 6e  **    (1)  The n
b4d0: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69  umber of pages i
b4e0: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
b4f0: 69 6c 65 20 61 74 20 74 68 65 20 73 74 61 72 74  ile at the start
b500: 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 74   of.**         t
b510: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  he statement is 
b520: 73 74 6f 72 65 64 20 69 6e 20 70 50 61 67 65 72  stored in pPager
b530: 2d 3e 73 74 6d 74 53 69 7a 65 2c 20 6e 6f 74 20  ->stmtSize, not 
b540: 69 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  in the.**       
b550: 20 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69    journal file i
b560: 74 73 65 6c 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  tself..**.**    
b570: 28 32 29 20 20 49 6e 20 61 64 64 69 74 69 6f 6e  (2)  In addition
b580: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
b590: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b5a0: 6f 75 72 6e 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20  ournal, also.** 
b5b0: 20 20 20 20 20 20 20 20 70 6c 61 79 62 61 63 6b          playback
b5c0: 20 61 6c 6c 20 70 61 67 65 73 20 6f 66 20 74 68   all pages of th
b5d0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
b5e0: 75 72 6e 61 6c 20 62 65 67 69 6e 6e 69 6e 67 0a  urnal beginning.
b5f0: 2a 2a 20 20 20 20 20 20 20 20 20 61 74 20 6f 66  **         at of
b600: 66 73 65 74 20 70 50 61 67 65 72 2d 3e 73 74 6d  fset pPager->stm
b610: 74 4a 53 69 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69  tJSize..*/.stati
b620: 63 20 69 6e 74 20 70 61 67 65 72 5f 73 74 6d 74  c int pager_stmt
b630: 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65 72 20  _playback(Pager 
b640: 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20  *pPager){.  i64 
b650: 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20 20 20  szJ;            
b660: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
b670: 74 68 65 20 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c  the full journal
b680: 20 2a 2f 0a 20 20 69 36 34 20 68 64 72 4f 66 66   */.  i64 hdrOff
b690: 3b 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  ;.  int nRec;   
b6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b6b0: 4e 75 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64  Number of Record
b6c0: 73 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20  s */.  int i;   
b6d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6e0: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20  /* Loop counter 
b6f0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  */.  int rc;..  
b700: 73 7a 4a 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  szJ = pPager->jo
b710: 75 72 6e 61 6c 4f 66 66 3b 0a 23 69 66 6e 64 65  urnalOff;.#ifnde
b720: 66 20 4e 44 45 42 55 47 20 0a 20 20 7b 0a 20 20  f NDEBUG .  {.  
b730: 20 20 69 36 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20    i64 os_szJ;.  
b740: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
b750: 46 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72  FileSize(&pPager
b760: 2d 3e 6a 66 64 2c 20 26 6f 73 5f 73 7a 4a 29 3b  ->jfd, &os_szJ);
b770: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
b780: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
b790: 72 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  rc;.    assert( 
b7a0: 73 7a 4a 3d 3d 6f 73 5f 73 7a 4a 20 29 3b 0a 20  szJ==os_szJ );. 
b7b0: 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20   }.#endif..  /* 
b7c0: 53 65 74 20 68 64 72 4f 66 66 20 74 6f 20 62 65  Set hdrOff to be
b7d0: 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74   the offset to t
b7e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
b7f0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 0a   header written.
b800: 20 20 2a 2a 20 74 68 69 73 20 73 74 61 74 65 6d    ** this statem
b810: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  ent transaction,
b820: 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
b830: 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
b840: 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
b850: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
b860: 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
b870: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
b880: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
b890: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
b8a0: 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
b8b0: 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
b8c0: 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
b8d0: 20 7d 0a 20 20 0a 0a 20 20 2f 2a 20 54 72 75 6e   }.  ..  /* Trun
b8e0: 63 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73  cate the databas
b8f0: 65 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72  e back to its or
b900: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a  iginal size..  *
b910: 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74  /.  rc = pager_t
b920: 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
b930: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
b940: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
b950: 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  ize = pPager->st
b960: 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a 20 46 69  mtSize;..  /* Fi
b970: 67 75 72 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e  gure out how man
b980: 79 20 72 65 63 6f 72 64 73 20 61 72 65 20 69 6e  y records are in
b990: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b9a0: 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 61  ournal..  */.  a
b9b0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
b9c0: 74 6d 74 49 6e 55 73 65 20 26 26 20 70 50 61 67  tmtInUse && pPag
b9d0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
b9e0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 53 65  );.  sqlite3OsSe
b9f0: 65 6b 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  ek(&pPager->stfd
ba00: 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d 20 70  , 0);.  nRec = p
ba10: 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63 3b  Pager->stmtNRec;
ba20: 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20 6f 72  .  .  /* Copy or
ba30: 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74  iginal pages out
ba40: 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   of the statemen
ba50: 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61  t journal and ba
ba60: 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  ck into the.  **
ba70: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
ba80: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 73   Note that the s
ba90: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
baa0: 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75 6d 73   omits checksums
bab0: 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63 68 20   from.  ** each 
bac0: 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70 6f 77  record since pow
bad0: 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63 6f 76  er-failure recov
bae0: 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70 6f 72  ery is not impor
baf0: 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d 65 6e  tant to statemen
bb00: 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 73 2e  t.  ** journals.
bb10: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 6e 52  .  */.  for(i=nR
bb20: 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d 2d 29  ec-1; i>=0; i--)
bb30: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
bb40: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
bb50: 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
bb60: 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
bb70: 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51    assert( rc!=SQ
bb80: 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20  LITE_DONE );.   
bb90: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bba0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
bbb0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d  mt_playback;.  }
bbc0: 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c 20  ..  /* Now roll 
bbd0: 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b 20  some pages back 
bbe0: 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61 63  from the transac
bbf0: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50 61  tion journal. Pa
bc00: 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20 20  ger.stmtJSize.  
bc10: 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65 20  ** was the size 
bc20: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
bc30: 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73 74  ile when this st
bc40: 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61 72  atement was star
bc50: 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76 65  ted, so.  ** eve
bc60: 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74 68  rything after th
bc70: 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  at needs to be r
bc80: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
bc90: 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a 2a  er into the.  **
bca0: 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20 6d   database, the m
bcb0: 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72 20  emory cache, or 
bcc0: 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  both..  **.  ** 
bcd0: 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65 72  If it is not zer
bce0: 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73 74  o, then Pager.st
bcf0: 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65 20  mtHdrOff is the 
bd00: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73 74  offset to the st
bd10: 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20  art.  ** of the 
bd20: 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65  first journal he
bd30: 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75 72  ader written dur
bd40: 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d 65  ing this stateme
bd50: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
bd60: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
bd70: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
bd80: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
bd90: 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
bda0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
bdb0: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
bdc0: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
bdd0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
bde0: 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
bdf0: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
be00: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
be10: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
be20: 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72 74 28 20  ksum;.  assert( 
be30: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
be40: 50 61 67 65 72 29 3c 28 70 50 61 67 65 72 2d 3e  Pager)<(pPager->
be50: 70 61 67 65 53 69 7a 65 2b 38 29 20 29 3b 0a 20  pageSize+8) );. 
be60: 20 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e   while( pPager->
be70: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d 20 28 68  journalOff <= (h
be80: 64 72 4f 66 66 2d 28 70 50 61 67 65 72 2d 3e 70  drOff-(pPager->p
be90: 61 67 65 53 69 7a 65 2b 38 29 29 20 29 7b 0a 20  ageSize+8)) ){. 
bea0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
beb0: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
bec0: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
bed0: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73  >jfd, 1);.    as
bee0: 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45  sert( rc!=SQLITE
bef0: 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28  _DONE );.    if(
bf00: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
bf10: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
bf20: 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20  layback;.  }..  
bf30: 77 68 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a  while( pPager->j
bf40: 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20  ournalOff < szJ 
bf50: 29 7b 0a 20 20 20 20 75 33 32 20 6e 52 65 63 3b  ){.    u32 nRec;
bf60: 0a 20 20 20 20 75 33 32 20 64 75 6d 6d 79 3b 0a  .    u32 dummy;.
bf70: 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f 75      rc = readJou
bf80: 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c 20  rnalHdr(pPager, 
bf90: 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 64 75 6d  szJ, &nRec, &dum
bfa0: 6d 79 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  my);.    if( rc!
bfb0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bfc0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
bfd0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
bfe0: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74       goto end_st
bff0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
c000: 20 7d 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d   }.    if( nRec=
c010: 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 52 65 63  =0 ){.      nRec
c020: 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61 67 65 72   = (szJ - pPager
c030: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20  ->journalOff) / 
c040: 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  (pPager->pageSiz
c050: 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  e+8);.    }.    
c060: 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e  for(i=nRec-1; i>
c070: 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f  =0 && pPager->jo
c080: 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 3b 20  urnalOff < szJ; 
c090: 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i--){.      rc =
c0a0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
c0b0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
c0c0: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
c0d0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c0e0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
c0f0: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63   );.      if( rc
c100: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
c110: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
c120: 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  back;.    }.  }.
c130: 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
c140: 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 0a  alOff = szJ;.  .
c150: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
c160: 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  k:.  if( rc!=SQL
c170: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
c180: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d  ager->errMask |=
c190: 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55   PAGER_ERR_CORRU
c1a0: 50 54 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c  PT;.    rc = SQL
c1b0: 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a  ITE_CORRUPT;  /*
c1c0: 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f   bkpt-CORRUPT */
c1d0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50  .  }else{.    pP
c1e0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c1f0: 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f 2a 20 70   = szJ;.    /* p
c200: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
c210: 65 28 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20  e(pPager); */.  
c220: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c230: 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74  ../*.** Change t
c240: 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65  he maximum numbe
c250: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
c260: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61 6c  ages that are al
c270: 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  lowed..**.** The
c280: 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20   maximum number 
c290: 69 73 20 74 68 65 20 61 62 73 6f 6c 75 74 65 20  is the absolute 
c2a0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 6d 78 50  value of the mxP
c2b0: 61 67 65 20 70 61 72 61 6d 65 74 65 72 2e 0a 2a  age parameter..*
c2c0: 2a 20 49 66 20 6d 78 50 61 67 65 20 69 73 20 6e  * If mxPage is n
c2d0: 65 67 61 74 69 76 65 2c 20 74 68 65 20 6e 6f 53  egative, the noS
c2e0: 79 6e 63 20 66 6c 61 67 20 69 73 20 61 6c 73 6f  ync flag is also
c2f0: 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63 20 62 79   set.  noSync by
c300: 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c 6c 73 20  passes.** calls 
c310: 74 6f 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63  to sqlite3OsSync
c320: 28 29 2e 20 20 54 68 65 20 70 61 67 65 72 20 72  ().  The pager r
c330: 75 6e 73 20 6d 75 63 68 20 66 61 73 74 65 72 20  uns much faster 
c340: 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f 6e 2c 0a  with noSync on,.
c350: 2a 2a 20 62 75 74 20 69 66 20 74 68 65 20 6f 70  ** but if the op
c360: 65 72 61 74 69 6e 67 20 73 79 73 74 65 6d 20 63  erating system c
c370: 72 61 73 68 65 73 20 6f 72 20 74 68 65 72 65 20  rashes or there 
c380: 69 73 20 61 6e 20 61 62 72 75 70 74 20 70 6f 77  is an abrupt pow
c390: 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72 65 2c 20  er .** failure, 
c3a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
c3b0: 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  e might be left 
c3c0: 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69 73 74 65  in an inconsiste
c3d0: 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72 65 70 61  nt and.** unrepa
c3e0: 69 72 61 62 6c 65 20 73 74 61 74 65 2e 20 20 0a  irable state.  .
c3f0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
c400: 61 67 65 72 5f 73 65 74 5f 63 61 63 68 65 73 69  ager_set_cachesi
c410: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
c420: 2c 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20  , int mxPage){. 
c430: 20 69 66 28 20 6d 78 50 61 67 65 3e 3d 30 20 29   if( mxPage>=0 )
c440: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
c450: 53 79 6e 63 20 3d 20 70 50 61 67 65 72 2d 3e 74  Sync = pPager->t
c460: 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20 69 66 28  empFile;.    if(
c470: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c480: 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ) pPager->needSy
c490: 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65 6c 73 65  nc = 0; .  }else
c4a0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 6f  {.    pPager->no
c4b0: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 6d 78  Sync = 1;.    mx
c4c0: 50 61 67 65 20 3d 20 2d 6d 78 50 61 67 65 3b 0a  Page = -mxPage;.
c4d0: 20 20 7d 0a 20 20 69 66 28 20 6d 78 50 61 67 65    }.  if( mxPage
c4e0: 3e 31 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65  >10 ){.    pPage
c4f0: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d 78 50 61  r->mxPage = mxPa
c500: 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ge;.  }else{.   
c510: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
c520: 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  = 10;.  }.}../*.
c530: 2a 2a 20 41 64 6a 75 73 74 20 74 68 65 20 72 6f  ** Adjust the ro
c540: 62 75 73 74 6e 65 73 73 20 6f 66 20 74 68 65 20  bustness of the 
c550: 64 61 74 61 62 61 73 65 20 74 6f 20 64 61 6d 61  database to dama
c560: 67 65 20 64 75 65 20 74 6f 20 4f 53 20 63 72 61  ge due to OS cra
c570: 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f 77 65 72  shes.** or power
c580: 20 66 61 69 6c 75 72 65 73 20 62 79 20 63 68 61   failures by cha
c590: 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d 62 65 72  nging the number
c5a0: 20 6f 66 20 73 79 6e 63 73 28 29 73 20 77 68 65   of syncs()s whe
c5b0: 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20 74 68 65  n writing.** the
c5c0: 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
c5d0: 6c 2e 20 20 54 68 65 72 65 20 61 72 65 20 74 68  l.  There are th
c5e0: 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a 2a 0a 2a  ree levels:.**.*
c5f0: 2a 20 20 20 20 4f 46 46 20 20 20 20 20 20 20 73  *    OFF       s
c600: 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 69  qlite3OsSync() i
c610: 73 20 6e 65 76 65 72 20 63 61 6c 6c 65 64 2e 20  s never called. 
c620: 20 54 68 69 73 20 69 73 20 74 68 65 20 64 65 66   This is the def
c630: 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20 20 20 20  ault.**         
c640: 20 20 20 20 20 66 6f 72 20 74 65 6d 70 6f 72 61       for tempora
c650: 72 79 20 61 6e 64 20 74 72 61 6e 73 69 65 6e 74  ry and transient
c660: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20   files..**.**   
c670: 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68 65 20 6a   NORMAL    The j
c680: 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64  ournal is synced
c690: 20 6f 6e 63 65 20 62 65 66 6f 72 65 20 77 72 69   once before wri
c6a0: 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65  tes begin on the
c6b0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c6c0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
c6d0: 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 61 64 65   is normally ade
c6e0: 71 75 61 74 65 20 70 72 6f 74 65 63 74 69 6f 6e  quate protection
c6f0: 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20 20 20 20  , but.**        
c700: 20 20 20 20 20 20 69 74 20 69 73 20 74 68 65 6f        it is theo
c710: 72 65 74 69 63 61 6c 6c 79 20 70 6f 73 73 69 62  retically possib
c720: 6c 65 2c 20 74 68 6f 75 67 68 20 76 65 72 79 20  le, though very 
c730: 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20 20 20 20  unlikely,.**    
c740: 20 20 20 20 20 20 20 20 20 20 74 68 61 74 20 61            that a
c750: 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20 70 6f 77  n inopertune pow
c760: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
c770: 20 6c 65 61 76 65 20 74 68 65 20 6a 6f 75 72 6e   leave the journ
c780: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
c790: 20 20 20 69 6e 20 61 20 73 74 61 74 65 20 77 68     in a state wh
c7a0: 69 63 68 20 77 6f 75 6c 64 20 63 61 75 73 65 20  ich would cause 
c7b0: 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20 64 61  damage to the da
c7c0: 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 20 20  tabase.**       
c7d0: 20 20 20 20 20 20 20 77 68 65 6e 20 69 74 20 69         when it i
c7e0: 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  s rolled back..*
c7f0: 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20 20 20 20  *.**    FULL    
c800: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
c810: 20 73 79 6e 63 65 64 20 74 77 69 63 65 20 62 65   synced twice be
c820: 66 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69  fore writes begi
c830: 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20  n on the.**     
c840: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
c850: 65 20 28 77 69 74 68 20 73 6f 6d 65 20 61 64 64  e (with some add
c860: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
c870: 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65 63 20 66  ion - the nRec f
c880: 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ield.**         
c890: 20 20 20 20 20 6f 66 20 74 68 65 20 6a 6f 75 72       of the jour
c8a0: 6e 61 6c 20 68 65 61 64 65 72 20 2d 20 62 65 69  nal header - bei
c8b0: 6e 67 20 77 72 69 74 74 65 6e 20 69 6e 20 62 65  ng written in be
c8c0: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 0a 2a 2a  tween the two.**
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 79                sy
c8e0: 6e 63 73 29 2e 20 20 49 66 20 77 65 20 61 73 73  ncs).  If we ass
c8f0: 75 6d 65 20 74 68 61 74 20 77 72 69 74 69 6e 67  ume that writing
c900: 20 61 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20   a.**           
c910: 20 20 20 73 69 6e 67 6c 65 20 64 69 73 6b 20 73     single disk s
c920: 65 63 74 6f 72 20 69 73 20 61 74 6f 6d 69 63 2c  ector is atomic,
c930: 20 74 68 65 6e 20 74 68 69 73 20 6d 6f 64 65 20   then this mode 
c940: 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20 20 20 20  provides.**     
c950: 20 20 20 20 20 20 20 20 20 61 73 73 75 72 61 6e           assuran
c960: 63 65 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72  ce that the jour
c970: 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20 62 65 20  nal will not be 
c980: 63 6f 72 72 75 70 74 65 64 20 74 6f 20 74 68 65  corrupted to the
c990: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c9a0: 20 70 6f 69 6e 74 20 6f 66 20 63 61 75 73 69 6e   point of causin
c9b0: 67 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65 20  g damage to the 
c9c0: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
c9d0: 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  rollback..**.** 
c9e0: 4e 75 6d 65 72 69 63 20 76 61 6c 75 65 73 20 61  Numeric values a
c9f0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
ca00: 68 65 73 65 20 73 74 61 74 65 73 20 61 72 65 20  hese states are 
ca10: 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41 4c 3d 32  OFF==1, NORMAL=2
ca20: 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c 3d 33 2e  ,.** and FULL=3.
ca30: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ca40: 70 61 67 65 72 5f 73 65 74 5f 73 61 66 65 74 79  pager_set_safety
ca50: 5f 6c 65 76 65 6c 28 50 61 67 65 72 20 2a 70 50  _level(Pager *pP
ca60: 61 67 65 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29  ager, int level)
ca70: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  {.  pPager->noSy
ca80: 6e 63 20 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c  nc =  level==1 |
ca90: 7c 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  | pPager->tempFi
caa0: 6c 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  le;.  pPager->fu
cab0: 6c 6c 53 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d  llSync = level==
cac0: 33 20 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65  3 && !pPager->te
cad0: 6d 70 46 69 6c 65 3b 0a 20 20 69 66 28 20 70 50  mpFile;.  if( pP
cae0: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70  ager->noSync ) p
caf0: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
cb00: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  = 0;.}../*.** Op
cb10: 65 6e 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66  en a temporary f
cb20: 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65 20  ile.  Write the 
cb30: 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69 6c 65  name of the file
cb40: 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28   into zName.** (
cb50: 7a 4e 61 6d 65 20 6d 75 73 74 20 62 65 20 61 74  zName must be at
cb60: 20 6c 65 61 73 74 20 53 51 4c 49 54 45 5f 54 45   least SQLITE_TE
cb70: 4d 50 4e 41 4d 45 5f 53 49 5a 45 20 62 79 74 65  MPNAME_SIZE byte
cb80: 73 20 6c 6f 6e 67 2e 29 20 20 57 72 69 74 65 0a  s long.)  Write.
cb90: 2a 2a 20 74 68 65 20 66 69 6c 65 20 64 65 73 63  ** the file desc
cba0: 72 69 70 74 6f 72 20 69 6e 74 6f 20 2a 66 64 2e  riptor into *fd.
cbb0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
cbc0: 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 6f 72  OK on success or
cbd0: 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68 65 72 20 65   some.** other e
cbe0: 72 72 6f 72 20 63 6f 64 65 20 69 66 20 77 65 20  rror code if we 
cbf0: 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  fail..**.** The 
cc00: 4f 53 20 77 69 6c 6c 20 61 75 74 6f 6d 61 74 69  OS will automati
cc10: 63 61 6c 6c 79 20 64 65 6c 65 74 65 20 74 68 65  cally delete the
cc20: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
cc30: 77 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 63 6c  when it is.** cl
cc40: 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  osed..*/.static 
cc50: 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
cc60: 5f 6f 70 65 6e 74 65 6d 70 28 63 68 61 72 20 2a  _opentemp(char *
cc70: 7a 46 69 6c 65 2c 20 4f 73 46 69 6c 65 20 2a 66  zFile, OsFile *f
cc80: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
cc90: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 64  8;.  int rc;.  d
cca0: 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d 3b 0a 20 20  o{.    cnt--;.  
ccb0: 20 20 73 71 6c 69 74 65 33 4f 73 54 65 6d 70 46    sqlite3OsTempF
ccc0: 69 6c 65 4e 61 6d 65 28 7a 46 69 6c 65 29 3b 0a  ileName(zFile);.
ccd0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
cce0: 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28  OsOpenExclusive(
ccf0: 7a 46 69 6c 65 2c 20 66 64 2c 20 31 29 3b 0a 20  zFile, fd, 1);. 
cd00: 20 7d 77 68 69 6c 65 28 20 63 6e 74 3e 30 20 26   }while( cnt>0 &
cd10: 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  & rc!=SQLITE_OK 
cd20: 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f  && rc!=SQLITE_NO
cd30: 4d 45 4d 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  MEM );.  return 
cd40: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  rc;.}../*.** Cre
cd50: 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 63  ate a new page c
cd60: 61 63 68 65 20 61 6e 64 20 70 75 74 20 61 20 70  ache and put a p
cd70: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
cd80: 67 65 20 63 61 63 68 65 20 69 6e 20 2a 70 70 50  ge cache in *ppP
cd90: 61 67 65 72 2e 0a 2a 2a 20 54 68 65 20 66 69 6c  ager..** The fil
cda0: 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 20 6e  e to be cached n
cdb0: 65 65 64 20 6e 6f 74 20 65 78 69 73 74 2e 20 20  eed not exist.  
cdc0: 54 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74 20  The file is not 
cdd0: 6c 6f 63 6b 65 64 20 75 6e 74 69 6c 0a 2a 2a 20  locked until.** 
cde0: 74 68 65 20 66 69 72 73 74 20 63 61 6c 6c 20 74  the first call t
cdf0: 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  o sqlite3pager_g
ce00: 65 74 28 29 20 61 6e 64 20 69 73 20 6f 6e 6c 79  et() and is only
ce10: 20 68 65 6c 64 20 6f 70 65 6e 20 75 6e 74 69 6c   held open until
ce20: 20 74 68 65 0a 2a 2a 20 6c 61 73 74 20 70 61 67   the.** last pag
ce30: 65 20 69 73 20 72 65 6c 65 61 73 65 64 20 75 73  e is released us
ce40: 69 6e 67 20 73 71 6c 69 74 65 33 70 61 67 65 72  ing sqlite3pager
ce50: 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20  _unref()..**.** 
ce60: 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20  If zFilename is 
ce70: 4e 55 4c 4c 20 74 68 65 6e 20 61 20 72 61 6e 64  NULL then a rand
ce80: 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74 65 6d 70 6f  omly-named tempo
ce90: 72 61 72 79 20 66 69 6c 65 20 69 73 20 63 72 65  rary file is cre
cea0: 61 74 65 64 0a 2a 2a 20 61 6e 64 20 75 73 65 64  ated.** and used
ceb0: 20 61 73 20 74 68 65 20 66 69 6c 65 20 74 6f 20   as the file to 
cec0: 62 65 20 63 61 63 68 65 64 2e 20 20 54 68 65 20  be cached.  The 
ced0: 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 64 65 6c  file will be del
cee0: 65 74 65 64 0a 2a 2a 20 61 75 74 6f 6d 61 74 69  eted.** automati
cef0: 63 61 6c 6c 79 20 77 68 65 6e 20 69 74 20 69 73  cally when it is
cf00: 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49   closed..**.** I
cf10: 66 20 7a 46 69 6c 65 6e 61 6d 65 20 69 73 20 22  f zFilename is "
cf20: 3a 6d 65 6d 6f 72 79 3a 22 20 74 68 65 6e 20 61  :memory:" then a
cf30: 6c 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ll information i
cf40: 73 20 68 65 6c 64 20 69 6e 20 63 61 63 68 65 2e  s held in cache.
cf50: 0a 2a 2a 20 49 74 20 69 73 20 6e 65 76 65 72 20  .** It is never 
cf60: 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e  written to disk.
cf70: 20 20 54 68 69 73 20 63 61 6e 20 62 65 20 75 73    This can be us
cf80: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20  ed to implement 
cf90: 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20  an.** in-memory 
cfa0: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74  database..*/.int
cfb0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
cfc0: 65 6e 28 0a 20 20 50 61 67 65 72 20 2a 2a 70 70  en(.  Pager **pp
cfd0: 50 61 67 65 72 2c 20 20 20 20 20 20 20 20 20 2f  Pager,         /
cfe0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 61 67  * Return the Pag
cff0: 65 72 20 73 74 72 75 63 74 75 72 65 20 68 65 72  er structure her
d000: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
d010: 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 2c 20 20 20  r *zFilename,   
d020: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
d030: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
d040: 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  open */.  int nE
d050: 78 74 72 61 2c 20 20 20 20 20 20 20 20 20 20 20  xtra,           
d060: 20 20 20 2f 2a 20 45 78 74 72 61 20 62 79 74 65     /* Extra byte
d070: 73 20 61 70 70 65 6e 64 20 74 6f 20 65 61 63 68  s append to each
d080: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 20   in-memory page 
d090: 2a 2f 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75 72  */.  int useJour
d0a0: 6e 61 6c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nal           /*
d0b0: 20 54 52 55 45 20 74 6f 20 75 73 65 20 61 20 72   TRUE to use a r
d0c0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 20  ollback journal 
d0d0: 6f 6e 20 74 68 69 73 20 66 69 6c 65 20 2a 2f 0a  on this file */.
d0e0: 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
d0f0: 65 72 3b 0a 20 20 63 68 61 72 20 2a 7a 46 75 6c  er;.  char *zFul
d100: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 30 3b 0a 20  lPathname = 0;. 
d110: 20 69 6e 74 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20   int nameLen;.  
d120: 4f 73 46 69 6c 65 20 66 64 3b 0a 20 20 69 6e 74  OsFile fd;.  int
d130: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
d140: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
d150: 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  tempFile = 0;.  
d160: 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a 20  int memDb = 0;. 
d170: 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d 20   int readOnly = 
d180: 30 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  0;.  char zTemp[
d190: 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
d1a0: 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70 50 61 67  SIZE];..  *ppPag
d1b0: 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  er = 0;.  memset
d1c0: 28 26 66 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&fd, 0, sizeof(
d1d0: 66 64 29 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  fd));.  if( sqli
d1e0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
d1f0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
d200: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d210: 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65 6e 61 6d  }.  if( zFilenam
d220: 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d 65 5b 30  e && zFilename[0
d230: 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  ] ){.#ifndef SQL
d240: 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44  ITE_OMIT_MEMORYD
d250: 42 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  B.    if( strcmp
d260: 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a 6d 65 6d  (zFilename,":mem
d270: 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ory:")==0 ){.   
d280: 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b 0a 20 20     memDb = 1;.  
d290: 20 20 20 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d      zFullPathnam
d2a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
d2b0: 28 22 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  ("");.      rc =
d2c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
d2d0: 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20  }else.#endif.   
d2e0: 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61   {.      zFullPa
d2f0: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  thname = sqlite3
d300: 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a  OsFullPathname(z
d310: 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
d320: 20 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61   if( zFullPathna
d330: 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  me ){.        rc
d340: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
d350: 52 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50  ReadWrite(zFullP
d360: 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72  athname, &fd, &r
d370: 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20  eadOnly);.      
d380: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
d390: 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
d3a0: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
d3b0: 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a 20 20 20  zTemp, &fd);.   
d3c0: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65   zFilename = zTe
d3d0: 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74  mp;.    zFullPat
d3e0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
d3f0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
d400: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
d410: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
d420: 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  ){.      tempFil
d430: 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
d440: 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c 50 61 74  .  if( !zFullPat
d450: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 73 71 6c  hname ){.    sql
d460: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
d470: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d480: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d490: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d4a0: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
d4b0: 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20  3OsClose(&fd);. 
d4c0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46     sqliteFree(zF
d4d0: 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
d4e0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
d4f0: 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20 73 74 72  .  nameLen = str
d500: 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  len(zFullPathnam
d510: 65 29 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 73  e);.  pPager = s
d520: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
d530: 65 6f 66 28 2a 70 50 61 67 65 72 29 20 2b 20 6e  eof(*pPager) + n
d540: 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30 20 29 3b  ameLen*3 + 30 );
d550: 0a 20 20 69 66 28 20 70 50 61 67 65 72 3d 3d 30  .  if( pPager==0
d560: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
d570: 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20  sClose(&fd);.   
d580: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c   sqliteFree(zFul
d590: 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  lPathname);.    
d5a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d5b0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45  MEM;.  }.  TRACE
d5c0: 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e 22  3("OPEN %d %s\n"
d5d0: 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66  , FILEHANDLEID(f
d5e0: 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  d), zFullPathnam
d5f0: 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 46  e);.  pPager->zF
d600: 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68 61 72 2a  ilename = (char*
d610: 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a 20 20 70  )&pPager[1];.  p
d620: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
d630: 79 20 3d 20 26 70 50 61 67 65 72 2d 3e 7a 46 69  y = &pPager->zFi
d640: 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65 6e 2b 31  lename[nameLen+1
d650: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 4a 6f  ];.  pPager->zJo
d660: 75 72 6e 61 6c 20 3d 20 26 70 50 61 67 65 72 2d  urnal = &pPager-
d670: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e 61 6d 65  >zDirectory[name
d680: 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72 63 70 79  Len+1];.  strcpy
d690: 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61  (pPager->zFilena
d6a0: 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  me, zFullPathnam
d6b0: 65 29 3b 0a 20 20 73 74 72 63 70 79 28 70 50 61  e);.  strcpy(pPa
d6c0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c  ger->zDirectory,
d6d0: 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b   zFullPathname);
d6e0: 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65 4c 65 6e  .  for(i=nameLen
d6f0: 3b 20 69 3e 30 20 26 26 20 70 50 61 67 65 72 2d  ; i>0 && pPager-
d700: 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31 5d  >zDirectory[i-1]
d710: 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d 0a 20 20  !='/'; i--){}.  
d720: 69 66 28 20 69 3e 30 20 29 20 70 50 61 67 65 72  if( i>0 ) pPager
d730: 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69 2d 31  ->zDirectory[i-1
d740: 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63 70 79 28  ] = 0;.  strcpy(
d750: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
d760: 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  , zFullPathname)
d770: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
d780: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
d790: 20 73 74 72 63 70 79 28 26 70 50 61 67 65 72 2d   strcpy(&pPager-
d7a0: 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d 65 4c 65  >zJournal[nameLe
d7b0: 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c 22 29 3b  n], "-journal");
d7c0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 20 3d 20  .  pPager->fd = 
d7d0: 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e 49 58 0a  fd;.#if OS_UNIX.
d7e0: 20 20 70 50 61 67 65 72 2d 3e 66 64 2e 70 50 61    pPager->fd.pPa
d7f0: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 23 65  ger = pPager;.#e
d800: 6e 64 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ndif.  pPager->j
d810: 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a  ournalOpen = 0;.
d820: 20 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75    pPager->useJou
d830: 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75 72 6e 61  rnal = useJourna
d840: 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a 20 20 70  l && !memDb;.  p
d850: 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
d860: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
d870: 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20  tmtInUse = 0;.  
d880: 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30  pPager->nRef = 0
d890: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
d8a0: 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a 20 20  ze = memDb-1;.  
d8b0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
d8c0: 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41 55 4c   = SQLITE_DEFAUL
d8d0: 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20 20 70  T_PAGE_SIZE;.  p
d8e0: 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64  Pager->psAligned
d8f0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
d900: 4e 54 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  NT(pPager->pageS
d910: 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ize);.  pPager->
d920: 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a 20 20  stmtSize = 0;.  
d930: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
d940: 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  e = 0;.  pPager-
d950: 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 70 50  >nPage = 0;.  pP
d960: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31  ager->mxPage = 1
d970: 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  00;.  pPager->st
d980: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
d990: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 72  CK;.  pPager->er
d9a0: 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70 50 61  rMask = 0;.  pPa
d9b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 3d 20  ger->tempFile = 
d9c0: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
d9d0: 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44  er->memDb = memD
d9e0: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72 65 61  b;.  pPager->rea
d9f0: 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79  dOnly = readOnly
da00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
da10: 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67  Sync = 0;.  pPag
da20: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
da30: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 7c 7c  ger->tempFile ||
da40: 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a 20 20   !useJournal;.  
da50: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
da60: 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f 53 79   = (pPager->noSy
da70: 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61 67 65  nc?0:1);.  pPage
da80: 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20  r->pFirst = 0;. 
da90: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
daa0: 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61  ynced = 0;.  pPa
dab0: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a  ger->pLast = 0;.
dac0: 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61    pPager->nExtra
dad0: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
dae0: 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20 70 50  NT(nExtra);.  pP
daf0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
db00: 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f   = PAGER_SECTOR_
db10: 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e  SIZE;.  pPager->
db20: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 30  pBusyHandler = 0
db30: 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67 65  ;.  memset(pPage
db40: 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69 7a  r->aHash, 0, siz
db50: 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61 73  eof(pPager->aHas
db60: 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65 72 20  h));.  *ppPager 
db70: 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65 74 75  = pPager;.  retu
db80: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
db90: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 62  ./*.** Set the b
dba0: 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75 6e 63  usy handler func
dbb0: 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tion..*/.void sq
dbc0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 62  lite3pager_set_b
dbd0: 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
dbe0: 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
dbf0: 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
dc00: 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
dc10: 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
dc20: 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
dc30: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
dc40: 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
dc50: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
dc60: 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
dc70: 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
dc80: 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
dc90: 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
dca0: 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
dcb0: 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
dcc0: 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
dcd0: 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
dce0: 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
dcf0: 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
dd00: 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
dd10: 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
dd20: 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
dd30: 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
dd40: 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
dd50: 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e 20 20  pager_close().  
dd60: 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20  .** Destructors 
dd70: 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20  are only called 
dd80: 62 79 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  by sqlite3pager_
dd90: 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64  unref()..*/.void
dda0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
ddb0: 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50 61 67  t_destructor(Pag
ddc0: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
ddd0: 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64 2a 2c   (*xDesc)(void*,
dde0: 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d  int)){.  pPager-
ddf0: 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78  >xDestructor = x
de00: 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Desc;.}../*.** S
de10: 65 74 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  et the reinitial
de20: 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20 70 61  izer for this pa
de30: 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c  ger.  If not NUL
de40: 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c  L, the reinitial
de50: 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65  izer.** is calle
de60: 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65  d when the conte
de70: 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  nt of a page in 
de80: 63 61 63 68 65 20 69 73 20 72 65 73 74 6f 72 65  cache is restore
de90: 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  d to its origina
dea0: 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20  l.** value as a 
deb0: 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c  result of a roll
dec0: 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62  back.  The callb
ded0: 61 63 6b 20 67 69 76 65 73 20 68 69 67 68 65 72  ack gives higher
dee0: 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61  -level code.** a
def0: 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f  n opportunity to
df00: 20 72 65 73 74 6f 72 65 20 74 68 65 20 45 58 54   restore the EXT
df10: 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67  RA section to ag
df20: 72 65 65 20 77 69 74 68 20 74 68 65 20 72 65 73  ree with the res
df30: 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61  tored.** page da
df40: 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ta..*/.void sqli
df50: 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72 65 69  te3pager_set_rei
df60: 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70 50 61  niter(Pager *pPa
df70: 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52 65 69  ger, void (*xRei
df80: 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74 29 29  nit)(void*,int))
df90: 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69  {.  pPager->xRei
dfa0: 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b  niter = xReinit;
dfb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
dfc0: 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a 2a 0a  e page size..**.
dfd0: 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69 7a 65  ** The page size
dfe0: 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20 63 68   must only be ch
dff0: 61 6e 67 65 64 20 77 68 65 6e 20 74 68 65 20 63  anged when the c
e000: 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e 0a 2a  ache is empty..*
e010: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
e020: 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69 7a 65  ger_set_pagesize
e030: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e040: 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b 0a 20  int pageSize){. 
e050: 20 61 73 73 65 72 74 28 20 70 61 67 65 53 69 7a   assert( pageSiz
e060: 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65 53 69  e>=512 && pageSi
e070: 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50  ze<=SQLITE_MAX_P
e080: 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20 70 50  AGE_SIZE );.  pP
e090: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d  ager->pageSize =
e0a0: 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 70 50 61   pageSize;.  pPa
e0b0: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 3d  ger->psAligned =
e0c0: 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45 4e 54   FORCE_ALIGNMENT
e0d0: 28 70 61 67 65 53 69 7a 65 29 3b 0a 7d 0a 0a 2f  (pageSize);.}../
e0e0: 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20 66 69  *.** Read the fi
e0f0: 72 73 74 20 4e 20 62 79 74 65 73 20 66 72 6f 6d  rst N bytes from
e100: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
e110: 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74 6f 20  f the file into 
e120: 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70  memory.** that p
e130: 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20  Dest points to. 
e140: 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63 6b 69   No error checki
e150: 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f 0a 76  ng is done..*/.v
e160: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
e170: 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64 65 72  _read_fileheader
e180: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e190: 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65 64 20  int N, unsigned 
e1a0: 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a 20 20  char *pDest){.  
e1b0: 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20 30 2c  memset(pDest, 0,
e1c0: 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42   N);.  if( MEMDB
e1d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
e1e0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
e1f0: 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 73 71  ->fd, 0);.    sq
e200: 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50 61  lite3OsRead(&pPa
e210: 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c 20  ger->fd, pDest, 
e220: 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  N);.  }.}../*.**
e230: 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74 61   Return the tota
e240: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65  l number of page
e250: 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66 69  s in the disk fi
e260: 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  le associated wi
e270: 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a 2a 2f  th.** pPager..*/
e280: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
e290: 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61 67 65  r_pagecount(Page
e2a0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
e2b0: 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70  4 n;.  assert( p
e2c0: 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 69 66  Pager!=0 );.  if
e2d0: 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
e2e0: 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  >=0 ){.    retur
e2f0: 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  n pPager->dbSize
e300: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
e310: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
e320: 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 21 3d  Pager->fd, &n)!=
e330: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
e340: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
e350: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 44 49   |= PAGER_ERR_DI
e360: 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  SK;.    return 0
e370: 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 70 50 61  ;.  }.  n /= pPa
e380: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20  ger->pageSize;. 
e390: 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26 20 6e   if( !MEMDB && n
e3a0: 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 70  ==PENDING_BYTE/p
e3b0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
e3c0: 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20 7d 0a  ){.    n++;.  }.
e3d0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
e3e0: 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
e3f0: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
e400: 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20 20 7d  >dbSize = n;.  }
e410: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
e420: 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65  /*.** Forward de
e430: 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61  claration.*/.sta
e440: 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72  tic int syncJour
e450: 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 0a 2f  nal(Pager*);.../
e460: 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20  *.** Unlink pPg 
e470: 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63  from it's hash c
e480: 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74  hain. Also set t
e490: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74  he page number t
e4a0: 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  o 0 to indicate.
e4b0: 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ** that the page
e4c0: 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20   is not part of 
e4d0: 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20  any hash chain. 
e4e0: 54 68 69 73 20 69 73 20 72 65 71 75 69 72 65 64  This is required
e4f0: 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20   because the.** 
e500: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d 6f 76  sqlite3pager_mov
e510: 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e 65 20  epage() routine 
e520: 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61 67 65  can leave a page
e530: 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78   in the .** pNex
e540: 74 46 72 65 65 2f 70 50 72 65 76 46 72 65 65 20  tFree/pPrevFree 
e550: 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e 6f 74  list that is not
e560: 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79 20 68   a part of any h
e570: 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74  ash-chain..*/.st
e580: 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b  atic void unlink
e590: 48 61 73 68 43 68 61 69 6e 28 50 61 67 65 72 20  HashChain(Pager 
e5a0: 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
e5b0: 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
e5c0: 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20  >pgno==0 ){.    
e5d0: 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 6e  /* If the page n
e5e0: 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c 20 74  umber is zero, t
e5f0: 68 65 6e 20 74 68 69 73 20 70 61 67 65 20 69 73  hen this page is
e600: 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61 73 68   not in any hash
e610: 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20 20 72   chain. */.    r
e620: 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69 66 28  eturn;.  }.  if(
e630: 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20   pPg->pNextHash 
e640: 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  ){.    pPg->pNex
e650: 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68  tHash->pPrevHash
e660: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73   = pPg->pPrevHas
e670: 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  h;.  }.  if( pPg
e680: 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b 0a 20  ->pPrevHash ){. 
e690: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
e6a0: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
e6b0: 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29 5d 21  ash(pPg->pgno)]!
e6c0: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d  =pPg );.    pPg-
e6d0: 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e 65 78  >pPrevHash->pNex
e6e0: 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 4e 65  tHash = pPg->pNe
e6f0: 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73 65 7b  xtHash;.  }else{
e700: 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70 61 67  .    int h = pag
e710: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
e720: 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  o);.    assert( 
e730: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
e740: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
e750: 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20  ger->aHash[h] = 
e760: 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a  pPg->pNextHash;.
e770: 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67 6e 6f    }..  pPg->pgno
e780: 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65   = 0;.  pPg->pNe
e790: 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  xtHash = pPg->pP
e7a0: 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a  revHash = 0;.}..
e7b0: 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70  /*.** Unlink a p
e7c0: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
e7d0: 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74  e list (the list
e7e0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68   of all pages wh
e7f0: 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20  ere nRef==0).** 
e800: 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73  and from its has
e810: 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69  h collision chai
e820: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  n..*/.static voi
e830: 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48  d unlinkPage(PgH
e840: 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65  dr *pPg){.  Page
e850: 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
e860: 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b  >pPager;..  /* K
e870: 65 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79  eep the pFirstSy
e880: 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69  nced pointer poi
e890: 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72  nting at the fir
e8a0: 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20  st synchronized 
e8b0: 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50  page */.  if( pP
e8c0: 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g==pPager->pFirs
e8d0: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50  tSynced ){.    P
e8e0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
e8f0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68  NextFree;.    wh
e900: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65  ile( p && p->nee
e910: 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e  dSync ){ p = p->
e920: 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20  pNextFree; }.   
e930: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
e940: 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a  ynced = p;.  }..
e950: 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
e960: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f   the freelist */
e970: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65  .  if( pPg->pPre
e980: 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67  vFree ){.    pPg
e990: 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65  ->pPrevFree->pNe
e9a0: 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e  xtFree = pPg->pN
e9b0: 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65  extFree;.  }else
e9c0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  {.    assert( pP
e9d0: 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50  ager->pFirst==pP
e9e0: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
e9f0: 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70  >pFirst = pPg->p
ea00: 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20  NextFree;.  }.  
ea10: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
ea20: 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70  ee ){.    pPg->p
ea30: 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46  NextFree->pPrevF
ea40: 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76  ree = pPg->pPrev
ea50: 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Free;.  }else{. 
ea60: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
ea70: 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b  r->pLast==pPg );
ea80: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61  .    pPager->pLa
ea90: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
eaa0: 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e  ree;.  }.  pPg->
eab0: 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d  pNextFree = pPg-
eac0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a  >pPrevFree = 0;.
ead0: 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f  .  /* Unlink fro
eae0: 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20  m the pgno hash 
eaf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e  table */.  unlin
eb00: 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65  kHashChain(pPage
eb10: 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  r, pPg);.}../*.*
eb20: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
eb30: 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61  s used to trunca
eb40: 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20  te an in-memory 
eb50: 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74  database.  Delet
eb60: 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77  e.** all pages w
eb70: 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72  hose pgno is lar
eb80: 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
eb90: 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
eba0: 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20  nreferenced..** 
ebb0: 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73  Referenced pages
ebc0: 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61   larger than pPa
ebd0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20  ger->dbSize are 
ebe0: 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  zeroed..*/.stati
ebf0: 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75  c void memoryTru
ec00: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
ec10: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
ec20: 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70  Pg;.  PgHdr **pp
ec30: 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  Pg;.  int dbSize
ec40: 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
ec50: 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50  e;..  ppPg = &pP
ec60: 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68  ager->pAll;.  wh
ec70: 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50  ile( (pPg = *ppP
ec80: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  g)!=0 ){.    if(
ec90: 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69   pPg->pgno<=dbSi
eca0: 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67  ze ){.      ppPg
ecb0: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
ecc0: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  l;.    }else if(
ecd0: 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a   pPg->nRef>0 ){.
ece0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
ecf0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
ed00: 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
ed10: 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50  Size);.      ppP
ed20: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
ed30: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ll;.    }else{. 
ed40: 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67       *ppPg = pPg
ed50: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
ed60: 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
ed70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  );.      sqliteF
ed80: 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ree(pPg);.      
ed90: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b  pPager->nPage--;
eda0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
edb0: 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65  .** Truncate the
edc0: 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d   file to the num
edd0: 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70 65  ber of pages spe
ede0: 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  cified..*/.int s
edf0: 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
ee00: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
ee10: 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b  er, Pgno nPage){
ee20: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
ee30: 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f  ite3pager_pageco
ee40: 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69  unt(pPager);.  i
ee50: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
ee60: 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  sk!=0 ){.    rc 
ee70: 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  = pager_errcode(
ee80: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74  pPager);.    ret
ee90: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69 66  urn rc;.  }.  if
eea0: 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67 6e  ( nPage>=(unsign
eeb0: 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  ed)pPager->dbSiz
eec0: 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  e ){.    return 
eed0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
eee0: 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
eef0: 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
ef00: 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d 65   = nPage;.    me
ef10: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50 61  moryTruncate(pPa
ef20: 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ger);.    return
ef30: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
ef40: 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e    rc = syncJourn
ef50: 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66  al(pPager);.  if
ef60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
ef70: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
ef80: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 70 61 67  ;.  }.  rc = pag
ef90: 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
efa0: 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69 66  er, nPage);.  if
efb0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
efc0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
efd0: 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
efe0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
eff0: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f 77  }../*.** Shutdow
f000: 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65  n the page cache
f010: 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d 6f  .  Free all memo
f020: 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c 6c  ry and close all
f030: 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
f040: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77   a transaction w
f050: 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20 77  as in progress w
f060: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
f070: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61 74   is called, that
f080: 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  .** transaction 
f090: 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20  is rolled back. 
f0a0: 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e 67   All outstanding
f0b0: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
f0c0: 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74 68  idated.** and th
f0d0: 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66 72  eir memory is fr
f0e0: 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d 70  eed.  Any attemp
f0f0: 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65 20  t to use a page 
f100: 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77 69  associated.** wi
f110: 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61 63  th this page cac
f120: 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66 75  he after this fu
f130: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 77  nction returns w
f140: 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72 65  ill likely.** re
f150: 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64 75  sult in a coredu
f160: 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  mp..*/.int sqlit
f170: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50 61  e3pager_close(Pa
f180: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
f190: 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
f1a0: 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70 50  xt;.  switch( pP
f1b0: 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a 20  ager->state ){. 
f1c0: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52 45     case PAGER_RE
f1d0: 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73 65  SERVED:.    case
f1e0: 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20 0a   PAGER_SYNCED: .
f1f0: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 45      case PAGER_E
f200: 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20 20  XCLUSIVE: {.    
f210: 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
f220: 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
f230: 0a 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44  .      if( !MEMD
f240: 42 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  B ){.        sql
f250: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
f260: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
f270: 4b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  K);.      }.    
f280: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
f290: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
f2a0: 20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   );.      break;
f2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
f2c0: 50 41 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a  PAGER_SHARED: {.
f2d0: 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42        if( !MEMDB
f2e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
f2f0: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
f300: 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
f310: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f320: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f330: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
f340: 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67     /* Do nothing
f350: 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   */.      break;
f360: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
f370: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
f380: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
f390: 74 29 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  t){.#ifndef NDEB
f3a0: 55 47 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  UG.    if( MEMDB
f3b0: 20 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74   ){.      PgHist
f3c0: 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48  ory *pHist = PGH
f3d0: 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20  DR_TO_HIST(pPg, 
f3e0: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61  pPager);.      a
f3f0: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77  ssert( !pPg->alw
f400: 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20  aysRollback );. 
f410: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48       assert( !pH
f420: 69 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20  ist->pOrig );.  
f430: 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
f440: 73 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  st->pStmt );.   
f450: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e   }.#endif.    pN
f460: 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ext = pPg->pNext
f470: 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  All;.    sqliteF
f480: 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20  ree(pPg);.  }.  
f490: 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64  TRACE2("CLOSE %d
f4a0: 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
f4b0: 67 65 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33  ger));.  sqlite3
f4c0: 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d  OsClose(&pPager-
f4d0: 3e 66 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20  >fd);.  assert( 
f4e0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f4f0: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54  pen==0 );.  /* T
f500: 65 6d 70 20 66 69 6c 65 73 20 61 72 65 20 61 75  emp files are au
f510: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
f520: 74 65 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20  ted by the OS.  
f530: 2a 2a 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74  ** if( pPager->t
f540: 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20  empFile ){.  ** 
f550: 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
f560: 65 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e  e(pPager->zFilen
f570: 61 6d 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a  ame);.  ** }.  *
f580: 2f 0a 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  /..  sqliteFree(
f590: 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72  pPager);.  retur
f5a0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
f5b0: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
f5c0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72   page number for
f5d0: 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 20   the given page 
f5e0: 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71  data..*/.Pgno sq
f5f0: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e  lite3pager_pagen
f600: 75 6d 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74  umber(void *pDat
f610: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d  a){.  PgHdr *p =
f620: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
f630: 44 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20  Data);.  return 
f640: 70 2d 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a  p->pgno;.}../*.*
f650: 2a 20 54 68 65 20 70 61 67 65 5f 72 65 66 28 29  * The page_ref()
f660: 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d   function increm
f670: 65 6e 74 73 20 74 68 65 20 72 65 66 65 72 65 6e  ents the referen
f680: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
f690: 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70  age..** If the p
f6a0: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
f6b0: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
f6c0: 20 28 74 68 65 20 72 65 66 65 72 65 6e 63 65 20   (the reference 
f6d0: 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74  count is zero) t
f6e0: 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74  hen.** remove it
f6f0: 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69   from the freeli
f700: 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f  st..**.** For no
f710: 6e 2d 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  n-test systems, 
f720: 70 61 67 65 5f 72 65 66 28 29 20 69 73 20 61 20  page_ref() is a 
f730: 6d 61 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73  macro that calls
f740: 20 5f 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20   _page_ref().** 
f750: 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65  online of the re
f760: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73  ference count is
f770: 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74   zero.  For test
f780: 20 73 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72   systems, page_r
f790: 65 66 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61  ef().** is a rea
f7a0: 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68  l function so th
f7b0: 61 74 20 77 65 20 63 61 6e 20 73 65 74 20 62 72  at we can set br
f7c0: 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72  eakpoints and tr
f7d0: 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69  ace it..*/.stati
f7e0: 63 20 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66  c void _page_ref
f7f0: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
f800: 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
f810: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70   ){.    /* The p
f820: 61 67 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79  age is currently
f830: 20 6f 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74   on the freelist
f840: 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f  .  Remove it. */
f850: 0a 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50  .    if( pPg==pP
f860: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
f870: 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20  tSynced ){.     
f880: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
f890: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
f8a0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
f8b0: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
f8c0: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
f8d0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
f8e0: 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
f8f0: 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = p;.    }.    
f900: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72  if( pPg->pPrevFr
f910: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
f920: 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
f930: 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
f940: 78 74 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  xtFree;.    }els
f950: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
f960: 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70  ager->pFirst = p
f970: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
f980: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
f990: 2d 3e 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20  ->pNextFree ){. 
f9a0: 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46       pPg->pNextF
f9b0: 72 65 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  ree->pPrevFree =
f9c0: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b   pPg->pPrevFree;
f9d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f9e0: 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70    pPg->pPager->p
f9f0: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
fa00: 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20  vFree;.    }.   
fa10: 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52   pPg->pPager->nR
fa20: 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d  ef++;.  }.  pPg-
fa30: 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e  >nRef++;.  REFIN
fa40: 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65  FO(pPg);.}.#ifde
fa50: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
fa60: 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67   static void pag
fa70: 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50 67  e_ref(PgHdr *pPg
fa80: 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  ){.    if( pPg->
fa90: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nRef==0 ){.     
faa0: 20 5f 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b   _page_ref(pPg);
fab0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
fac0: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
fad0: 20 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67       REFINFO(pPg
fae0: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c  );.    }.  }.#el
faf0: 73 65 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65  se.# define page
fb00: 5f 72 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e  _ref(P)   ((P)->
fb10: 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65  nRef==0?_page_re
fb20: 66 28 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e  f(P):(void)(P)->
fb30: 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a  nRef++).#endif..
fb40: 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20  /*.** Increment 
fb50: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
fb60: 75 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  unt for a page. 
fb70: 20 54 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74   The input point
fb80: 65 72 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72  er is.** a refer
fb90: 65 6e 63 65 20 74 6f 20 74 68 65 20 70 61 67 65  ence to the page
fba0: 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71   data..*/.int sq
fbb0: 6c 69 74 65 33 70 61 67 65 72 5f 72 65 66 28 76  lite3pager_ref(v
fbc0: 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50  oid *pData){.  P
fbd0: 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41  gHdr *pPg = DATA
fbe0: 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29  _TO_PGHDR(pData)
fbf0: 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
fc00: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
fc10: 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
fc20: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
fc30: 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  .  In other word
fc40: 73 2c 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c  s, make sure all
fc50: 20 74 68 65 20 70 61 67 65 73 20 74 68 61 74 20   the pages that 
fc60: 68 61 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69  have.** been wri
fc70: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
fc80: 6e 61 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c  nal have actuall
fc90: 79 20 72 65 61 63 68 65 64 20 74 68 65 20 73 75  y reached the su
fca0: 72 66 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20  rface of the.** 
fcb0: 64 69 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74  disk.  It is not
fcc0: 20 73 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20   safe to modify 
fcd0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
fce0: 61 62 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c  abase file until
fcf0: 20 61 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f   after.** the jo
fd00: 75 72 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73  urnal has been s
fd10: 79 6e 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f  ynced.  If the o
fd20: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
fd30: 20 69 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66   is modified bef
fd40: 6f 72 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ore.** the journ
fd50: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64  al is synced and
fd60: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
fd70: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73   occurs, the uns
fd80: 79 6e 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  ynced journal.**
fd90: 20 64 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c   data would be l
fda0: 6f 73 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64  ost and we would
fdb0: 20 62 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f   be unable to co
fdc0: 6d 70 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63  mpletely rollbac
fdd0: 6b 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73  k the.** databas
fde0: 65 20 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61  e changes.  Data
fdf0: 62 61 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20  base corruption 
fe00: 77 6f 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20  would occur..** 
fe10: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
fe20: 20 61 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68   also updates th
fe30: 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20  e nRec field in 
fe40: 74 68 65 20 68 65 61 64 65 72 20 6f 66 20 74 68  the header of th
fe50: 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53  e journal..** (S
fe60: 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74  ee comments on t
fe70: 68 65 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  he pager_playbac
fe80: 6b 28 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20  k() routine for 
fe90: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
fea0: 6d 61 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74  mation.).** If t
feb0: 68 65 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20  he sync mode is 
fec0: 46 55 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20  FULL, two syncs 
fed0: 77 69 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72  will occur.  Fir
fee0: 73 74 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  st the whole jou
fef0: 72 6e 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65  rnal.** is synce
ff00: 64 2c 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63  d, then the nRec
ff10: 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74 65   field is update
ff20: 64 2c 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64  d, then a second
ff30: 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
ff40: 0a 2a 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72  .** For temporar
ff50: 79 20 64 61 74 61 62 61 73 65 73 2c 20 77 65 20  y databases, we 
ff60: 64 6f 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77  do not care if w
ff70: 65 20 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f  e are able to ro
ff80: 6c 6c 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20  llback.** after 
ff90: 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c  a power failure,
ffa0: 20 73 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e   so sync occurs.
ffb0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
ffc0: 69 6e 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e  ine clears the n
ffd0: 65 65 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66  eedSync field of
ffe0: 20 65 76 65 72 79 20 70 61 67 65 20 63 75 72 72   every page curr
fff0: 65 6e 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d  ent held in.** m
10000 65 6d 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63  emory..*/.static
10010 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c   int syncJournal
10020 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
10030 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20  .  PgHdr *pPg;. 
10040 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
10050 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20  _OK;..  /* Sync 
10060 74 68 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f  the journal befo
10070 72 65 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65  re modifying the
10080 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20   main database. 
10090 20 2a 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68   ** (assuming th
100a0 65 72 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c  ere is a journal
100b0 20 61 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f   and it needs to
100c0 20 62 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a   be synced.).  *
100d0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
100e0 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
100f0 69 66 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d  if( !pPager->tem
10100 70 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61  pFile ){.      a
10110 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10120 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
10130 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21      /* assert( !
10140 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29  pPager->noSync )
10150 3b 20 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68  ; // noSync migh
10160 74 20 62 65 20 73 65 74 20 69 66 20 73 79 6e 63  t be set if sync
10170 68 72 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a  hronous.      **
10180 20 77 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20   was turned off 
10190 61 66 74 65 72 20 74 68 65 20 74 72 61 6e 73 61  after the transa
101a0 63 74 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65  ction was starte
101b0 64 2e 20 20 54 69 63 6b 65 74 20 23 36 31 35 20  d.  Ticket #615 
101c0 2a 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  */.#ifndef NDEBU
101d0 47 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20  G.      {.      
101e0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74    /* Make sure t
101f0 68 65 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20  he pPager->nRec 
10200 63 6f 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b  counter we are k
10210 65 65 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20  eeping agrees.  
10220 20 20 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68        ** with th
10230 65 20 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20  e nRec computed 
10240 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
10250 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
10260 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
10270 20 20 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20        i64 jSz;. 
10280 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
10290 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
102a0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a  Pager->jfd, &jSz
102b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
102c0 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63  c!=0 ) return rc
102d0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
102e0 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
102f0 6c 4f 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20  lOff==jSz );.   
10300 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
10310 20 20 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57    {.        /* W
10320 72 69 74 65 20 74 68 65 20 6e 52 65 63 20 76 61  rite the nRec va
10330 6c 75 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  lue into the jou
10340 72 6e 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72  rnal file header
10350 2e 20 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20  . If in.        
10360 2a 2a 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e  ** full-synchron
10370 6f 75 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74  ous mode, sync t
10380 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74  he journal first
10390 2e 20 54 68 69 73 20 65 6e 73 75 72 65 73 20 74  . This ensures t
103a0 68 61 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hat.        ** a
103b0 6c 6c 20 64 61 74 61 20 68 61 73 20 72 65 61 6c  ll data has real
103c0 6c 79 20 68 69 74 20 74 68 65 20 64 69 73 6b 20  ly hit the disk 
103d0 62 65 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75  before nRec is u
103e0 70 64 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20  pdated to mark. 
103f0 20 20 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20         ** it as 
10400 61 20 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20  a candidate for 
10410 72 6f 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20  rollback. .     
10420 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66     */.        if
10430 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79  ( pPager->fullSy
10440 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nc ){.          
10450 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75  TRACE2("SYNC jou
10460 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50  rnal of %d\n", P
10470 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
10480 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
10490 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70  sqlite3OsSync(&p
104a0 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
104b0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
104c0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
104d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
104e0 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
104f0 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
10500 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b  er->journalHdr +
10510 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
10520 4d 61 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20  Magic));.       
10530 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
10540 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
10550 70 50 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20  pPager->nRec);. 
10560 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 20         if( rc ) 
10570 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20  return rc;..    
10580 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65      sqlite3OsSee
10590 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
105a0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
105b0 66 66 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ff);.      }.   
105c0 20 20 20 54 52 41 43 45 32 28 22 53 59 4e 43 20     TRACE2("SYNC 
105d0 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22  journal of %d\n"
105e0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
105f0 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
10600 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50  qlite3OsSync(&pP
10610 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20  ager->jfd);.    
10620 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
10630 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70  turn rc;.      p
10640 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
10650 61 72 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  arted = 1;.    }
10660 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65  .    pPager->nee
10670 64 53 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20  dSync = 0;..    
10680 2f 2a 20 45 72 61 73 65 20 74 68 65 20 6e 65 65  /* Erase the nee
10690 64 53 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20  dSync flag from 
106a0 65 76 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20  every page..    
106b0 2a 2f 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  */.    for(pPg=p
106c0 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
106d0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
106e0 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
106f0 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
10700 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
10710 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
10720 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
10730 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45    }..#ifndef NDE
10740 42 55 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  BUG.  /* If the 
10750 50 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66  Pager.needSync f
10760 6c 61 67 20 69 73 20 63 6c 65 61 72 20 74 68 65  lag is clear the
10770 6e 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  n the PgHdr.need
10780 53 79 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d  Sync.  ** flag m
10790 75 73 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61  ust also be clea
107a0 72 20 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e  r for all pages.
107b0 20 20 56 65 72 69 66 79 20 74 68 61 74 20 74 68    Verify that th
107c0 69 73 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e  is.  ** invarian
107d0 74 20 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a  t is true..  */.
107e0 20 20 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28    else{.    for(
107f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
10800 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
10810 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
10820 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65   assert( pPg->ne
10830 65 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20  edSync==0 );.   
10840 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
10850 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
10860 63 65 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  ced==pPager->pFi
10870 72 73 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  rst );.  }.#endi
10880 66 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  f..  return rc;.
10890 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
108a0 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e  obtain a lock on
108b0 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65   a file.  Invoke
108c0 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61   the busy callba
108d0 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a  ck if the lock.*
108e0 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e  * is currently n
108f0 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52  ot available.  R
10900 65 70 65 61 74 65 20 75 6e 74 69 6c 20 74 68 65  epeate until the
10910 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
10920 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
10930 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
10940 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
10950 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
10960 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
10970 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
10980 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
10990 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
109a0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
109b0 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
109c0 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
109d0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
109e0 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65    int rc;.  asse
109f0 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45 44  rt( PAGER_SHARED
10a00 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b  ==SHARED_LOCK );
10a10 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10a20 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52  _RESERVED==RESER
10a30 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73  VED_LOCK );.  as
10a40 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c  sert( PAGER_EXCL
10a50 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45  USIVE==EXCLUSIVE
10a60 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70  _LOCK );.  if( p
10a70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f  Pager->state>=lo
10a80 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63  cktype ){.    rc
10a90 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
10aa0 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62  }else{.    int b
10ab0 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20  usy = 1;.    do 
10ac0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
10ad0 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67  ite3OsLock(&pPag
10ae0 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65  er->fd, locktype
10af0 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72  );.    }while( r
10b00 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26  c==SQLITE_BUSY &
10b10 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
10b20 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20  r->pBusyHandler 
10b30 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
10b40 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
10b50 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20  ->xFunc && .    
10b60 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73      pPager->pBus
10b70 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28  yHandler->xFunc(
10b80 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10b90 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79  dler->pArg, busy
10ba0 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ++).    );.    i
10bb0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
10bc0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
10bd0 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79  ->state = lockty
10be0 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  pe;.    }.  }.  
10bf0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
10c00 0a 2a 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74  .** Given a list
10c10 20 6f 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65   of pages (conne
10c20 63 74 65 64 20 62 79 20 74 68 65 20 50 67 48 64  cted by the PgHd
10c30 72 2e 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72  r.pDirty pointer
10c40 29 20 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79  ) write.** every
10c50 20 6f 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61   one of those pa
10c60 67 65 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64  ges out to the d
10c70 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
10c80 20 6d 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a   mark them all.*
10c90 2a 20 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73  * as clean..*/.s
10ca0 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
10cb0 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50  write_pagelist(P
10cc0 67 48 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20  gHdr *pList){.  
10cd0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
10ce0 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20   int rc;..  if( 
10cf0 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
10d00 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
10d10 50 61 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70  Pager = pList->p
10d20 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20  Pager;..  /* At 
10d30 74 68 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65  this point there
10d40 20 6d 61 79 20 62 65 20 65 69 74 68 65 72 20 61   may be either a
10d50 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58 43   RESERVED or EXC
10d60 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
10d70 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
10d80 20 66 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20   file. If there 
10d90 69 73 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58  is already an EX
10da0 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68  CLUSIVE lock, th
10db0 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a  e following.  **
10dc0 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
10dd0 33 4f 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f  3OsLock() are no
10de0 2d 6f 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  -ops..  **.  ** 
10df0 4d 6f 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20  Moving the lock 
10e00 66 72 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f  from RESERVED to
10e10 20 45 58 43 4c 55 53 49 56 45 20 61 63 74 75 61   EXCLUSIVE actua
10e20 6c 6c 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69  lly involves goi
10e30 6e 67 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20  ng.  ** through 
10e40 61 6e 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  an intermediate 
10e50 73 74 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20  state PENDING.  
10e60 20 41 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20   A PENDING lock 
10e70 70 72 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a  prevents new.  *
10e80 2a 20 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61  * readers from a
10e90 74 74 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20  ttaching to the 
10ea0 64 61 74 61 62 61 73 65 20 62 75 74 20 69 73 20  database but is 
10eb0 75 6e 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72  unsufficient for
10ec0 20 75 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74   us to.  ** writ
10ed0 65 2e 20 20 54 68 65 20 69 64 65 61 20 6f 66 20  e.  The idea of 
10ee0 61 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69  a PENDING lock i
10ef0 73 20 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77  s to prevent new
10f00 20 72 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20   readers from.  
10f10 2a 2a 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69  ** coming in whi
10f20 6c 65 20 77 65 20 77 61 69 74 20 66 6f 72 20 65  le we wait for e
10f30 78 69 73 74 69 6e 67 20 72 65 61 64 65 72 73 20  xisting readers 
10f40 74 6f 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20  to clear..  **. 
10f50 20 2a 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61   ** While the pa
10f60 67 65 72 20 69 73 20 69 6e 20 74 68 65 20 52 45  ger is in the RE
10f70 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
10f80 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
10f90 61 73 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73  ase file.  ** is
10fa0 20 75 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77   unchanged and w
10fb0 65 20 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77  e can rollback w
10fc0 69 74 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f  ithout having to
10fd0 20 70 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20   playback the.  
10fe0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20  ** journal into 
10ff0 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
11000 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63  abase file.  Onc
11010 65 20 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20  e we transition 
11020 74 6f 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56  to.  ** EXCLUSIV
11030 45 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20  E, it means the 
11040 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 61  database file ha
11050 73 20 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61  s been changed a
11060 6e 64 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a  nd any rollback.
11070 20 20 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72    ** will requir
11080 65 20 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79  e a journal play
11090 62 61 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  back..  */.  rc 
110a0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
110b0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43  lock(pPager, EXC
110c0 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
110d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
110e0 4b 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  K ){.    return 
110f0 72 63 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  rc;.  }..  while
11100 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61  ( pList ){.    a
11110 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69  ssert( pList->di
11120 72 74 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74  rty );.    sqlit
11130 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
11140 2d 3e 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67  ->fd, (pList->pg
11150 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65  no-1)*(i64)pPage
11160 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
11170 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72    /* If there ar
11180 65 20 64 69 72 74 79 20 70 61 67 65 73 20 69 6e  e dirty pages in
11190 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
111a0 77 69 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72  with page number
111b0 73 20 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a  s greater.    **
111c0 20 74 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69   than Pager.dbSi
111d0 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73  ze, this means s
111e0 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e  qlite3pager_trun
111f0 63 61 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65  cate() was calle
11200 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65  d to.    ** make
11210 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65   the file smalle
11220 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79  r (presumably by
11230 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64   auto-vacuum cod
11240 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65  e). Do not write
11250 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68  .    ** any such
11260 20 70 61 67 65 73 20 74 6f 20 74 68 65 20 66 69   pages to the fi
11270 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  le..    */.    i
11280 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d  f( pList->pgno<=
11290 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29  pPager->dbSize )
112a0 7b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  {.      CODEC(pP
112b0 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
112c0 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73  ATA(pList), pLis
112d0 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20  t->pgno, 6);.   
112e0 20 20 20 54 52 41 43 45 33 28 22 53 54 4f 52 45     TRACE3("STORE
112f0 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
11300 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
11310 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20   pList->pgno);. 
11320 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
11330 33 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72  3OsWrite(&pPager
11340 2d 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ->fd, PGHDR_TO_D
11350 41 54 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67  ATA(pList), pPag
11360 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
11370 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65       CODEC(pPage
11380 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r, PGHDR_TO_DATA
11390 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e  (pList), pList->
113a0 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20  pgno, 0);.      
113b0 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 2b 2b  pPager->nWrite++
113c0 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
113d0 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b  NDEBUG.    else{
113e0 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 4e  .      TRACE3("N
113f0 4f 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  OSTORE %d page %
11400 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
11410 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67  ager), pList->pg
11420 6e 6f 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  no);.    }.#endi
11430 66 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72  f.    if( rc ) r
11440 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c  eturn rc;.    pL
11450 69 73 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  ist->dirty = 0;.
11460 20 20 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73      pList = pLis
11470 74 2d 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20  t->pDirty;.  }. 
11480 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
11490 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c  K;.}../*.** Coll
114a0 65 63 74 20 65 76 65 72 79 20 64 69 72 74 79 20  ect every dirty 
114b0 70 61 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74  page into a dirt
114c0 79 20 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65  y list and.** re
114d0 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
114e0 6f 20 74 68 65 20 68 65 61 64 20 6f 66 20 74 68  o the head of th
114f0 61 74 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61  at list.  All pa
11500 67 65 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65  ges are.** colle
11510 63 74 65 64 20 65 76 65 6e 20 69 66 20 74 68 65  cted even if the
11520 79 20 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75  y are still in u
11530 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67  se..*/.static Pg
11540 48 64 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61  Hdr *pager_get_a
11550 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50  ll_dirty_pages(P
11560 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
11570 20 50 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73   PgHdr *p, *pLis
11580 74 3b 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a  t;.  pList = 0;.
11590 20 20 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e    for(p=pPager->
115a0 70 41 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  pAll; p; p=p->pN
115b0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
115c0 20 70 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20   p->dirty ){.   
115d0 20 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70     p->pDirty = p
115e0 4c 69 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73  List;.      pLis
115f0 74 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d  t = p;.    }.  }
11600 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b  .  return pList;
11610 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72  .}../*.** Acquir
11620 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  e a page..**.** 
11630 41 20 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74  A read lock on t
11640 68 65 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20  he disk file is 
11650 6f 62 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68  obtained when th
11660 65 20 66 69 72 73 74 20 70 61 67 65 20 69 73 20  e first page is 
11670 61 63 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68  acquired. .** Th
11680 69 73 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20  is read lock is 
11690 64 72 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65  dropped when the
116a0 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72 65   last page is re
116b0 6c 65 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20  leased..**.** A 
116c0 5f 67 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61  _get works for a
116d0 6e 79 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67  ny page number g
116e0 72 65 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20  reater than 0.  
116f0 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 0a  If the database.
11700 2a 2a 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c  ** file is small
11710 65 72 20 74 68 61 6e 20 74 68 65 20 72 65 71 75  er than the requ
11720 65 73 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e  ested page, then
11730 20 6e 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a   no actual disk.
11740 2a 2a 20 72 65 61 64 20 6f 63 63 75 72 73 20 61  ** read occurs a
11750 6e 64 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d  nd the memory im
11760 61 67 65 20 6f 66 20 74 68 65 20 70 61 67 65 20  age of the page 
11770 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
11780 6f 0a 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20  o.** all zeros. 
11790 20 54 68 65 20 65 78 74 72 61 20 64 61 74 61 20   The extra data 
117a0 61 70 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61  appended to a pa
117b0 67 65 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69  ge is always ini
117c0 74 69 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a  tialized.** to z
117d0 65 72 6f 73 20 74 68 65 20 66 69 72 73 74 20 74  eros the first t
117e0 69 6d 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f  ime a page is lo
117f0 61 64 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  aded into memory
11800 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75  ..**.** The acqu
11810 69 73 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61  isition might fa
11820 69 6c 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72  il for several r
11830 65 61 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20  easons.  In all 
11840 63 61 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70  cases,.** an app
11850 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20 63  ropriate error c
11860 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 20  ode is returned 
11870 61 6e 64 20 2a 70 70 50 61 67 65 20 69 73 20 73  and *ppPage is s
11880 65 74 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a  et to NULL..**.*
11890 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
118a0 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29  e3pager_lookup()
118b0 2e 20 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75  .  Both this rou
118c0 74 69 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70  tine and _lookup
118d0 28 29 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  () attempt.** to
118e0 20 66 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20   find a page in 
118f0 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
11900 63 68 65 20 66 69 72 73 74 2e 20 20 49 66 20 74  che first.  If t
11910 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61  he page is not a
11920 6c 72 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d  lready.** in mem
11930 6f 72 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  ory, this routin
11940 65 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74  e goes to disk t
11950 6f 20 72 65 61 64 20 69 74 20 69 6e 20 77 68 65  o read it in whe
11960 72 65 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a  reas _lookup().*
11970 2a 20 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30  * just returns 0
11980 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
11990 61 63 71 75 69 72 65 73 20 61 20 72 65 61 64 2d  acquires a read-
119a0 6c 6f 63 6b 20 74 68 65 20 66 69 72 73 74 20 74  lock the first t
119b0 69 6d 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f  ime it.** has to
119c0 20 67 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64   go to disk, and
119d0 20 63 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79   could also play
119e0 62 61 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72  back an old jour
119f0 6e 61 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79  nal if necessary
11a00 2e 0a 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b  ..** Since _look
11a10 75 70 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20  up() never goes 
11a20 74 6f 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65  to disk, it neve
11a30 72 20 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69  r has to deal wi
11a40 74 68 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a  th locks.** or j
11a50 6f 75 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f  ournal files..*/
11a60 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
11a70 72 5f 67 65 74 28 50 61 67 65 72 20 2a 70 50 61  r_get(Pager *pPa
11a80 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
11a90 76 6f 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a  void **ppPage){.
11aa0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
11ab0 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68  int rc;..  /* Th
11ac0 65 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e  e maximum page n
11ad0 75 6d 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52  umber is 2^31. R
11ae0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52  eturn SQLITE_COR
11af0 52 55 50 54 20 69 66 20 61 20 70 61 67 65 0a 20  RUPT if a page. 
11b00 20 2a 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74   ** number great
11b10 65 72 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72  er than this, or
11b20 20 7a 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73   zero, is reques
11b30 74 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ted..  */.  if( 
11b40 70 67 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50  pgno>PAGER_MAX_P
11b50 47 4e 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29  GNO || pgno==0 )
11b60 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  {.    return SQL
11b70 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ITE_CORRUPT;.  }
11b80 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65  ..  /* Make sure
11b90 20 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74   we have not hit
11ba0 20 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72   any critical er
11bb0 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73  rors..  */ .  as
11bc0 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
11bd0 29 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30  );.  *ppPage = 0
11be0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
11bf0 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45  errMask & ~(PAGE
11c00 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20  R_ERR_FULL) ){. 
11c10 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
11c20 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
11c30 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68  .  }..  /* If th
11c40 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74 20  is is the first 
11c50 70 61 67 65 20 61 63 63 65 73 73 65 64 2c 20 74  page accessed, t
11c60 68 65 6e 20 67 65 74 20 61 20 53 48 41 52 45 44  hen get a SHARED
11c70 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68   lock.  ** on th
11c80 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11c90 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67  .  */.  if( pPag
11ca0 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21  er->nRef==0 && !
11cb0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20  MEMDB ){.    rc 
11cc0 3d 20 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f  = pager_wait_on_
11cd0 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41  lock(pPager, SHA
11ce0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69  RED_LOCK);.    i
11cf0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
11d00 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
11d10 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   rc;.    }..    
11d20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20  /* If a journal 
11d30 66 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64  file exists, and
11d40 20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53   there is no RES
11d50 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68  ERVED lock on th
11d60 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
11d70 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20  e file, then it 
11d80 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20  either needs to 
11d90 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f  be played back o
11da0 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a  r deleted..    *
11db0 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  /.    if( pPager
11dc0 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
11dd0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11de0 4f 73 46 69 6c 65 45 78 69 73 74 73 28 70 50 61  OsFileExists(pPa
11df0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26  ger->zJournal) &
11e00 26 0a 20 20 20 20 20 20 20 20 21 73 71 6c 69 74  &.        !sqlit
11e10 65 33 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65  e3OsCheckReserve
11e20 64 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  dLock(&pPager->f
11e30 64 29 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  d) .    ){.     
11e40 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20    int rc;..     
11e50 20 20 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c    /* Get an EXCL
11e60 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
11e70 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
11e80 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69   At this point i
11e90 74 20 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69  t is.       ** i
11ea0 6d 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20  mportant that a 
11eb0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
11ec0 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e   not obtained on
11ed0 20 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a   the way to the.
11ee0 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
11ef0 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
11f00 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
11f10 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
11f20 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64   the.       ** d
11f30 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65  atabase file, de
11f40 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56 45  tect the RESERVE
11f50 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63  D lock, and conc
11f60 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20 20  lude that the.  
11f70 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
11f80 20 69 73 20 73 61 66 65 20 74 6f 20 72 65 61 64   is safe to read
11f90 20 77 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63   while this proc
11fa0 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c  ess is still rol
11fb0 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20  ling it .       
11fc0 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20  ** back..       
11fd0 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65  ** .       ** Be
11fe0 63 61 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d  cause the interm
11ff0 65 64 69 61 74 65 20 52 45 53 45 52 56 45 44 20  ediate RESERVED 
12000 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75  lock is not requ
12010 65 73 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20  ested, the.     
12020 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63    ** second proc
12030 65 73 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20  ess will get to 
12040 74 68 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68  this point in th
12050 65 20 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20  e code and fail 
12060 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74  to.       ** obt
12070 61 69 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43  ain it's own EXC
12080 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
12090 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
120a0 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
120b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
120c0 73 4c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  sLock(&pPager->f
120d0 64 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43  d, EXCLUSIVE_LOC
120e0 4b 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72  K);.       if( r
120f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
12100 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12110 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
12120 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a  ->fd, NO_LOCK);.
12130 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
12140 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55  >state = PAGER_U
12150 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20  NLOCK;.         
12160 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
12170 20 20 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65    }.       pPage
12180 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
12190 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20  _EXCLUSIVE;..   
121a0 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20      /* Open the 
121b0 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64  journal for read
121c0 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72  ing only.  Retur
121d0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66  n SQLITE_BUSY if
121e0 0a 20 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72  .       ** we ar
121f0 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  e unable to open
12200 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
12210 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20  e. .       **.  
12220 20 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72       ** The jour
12230 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  nal file does no
12240 74 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63  t need to be loc
12250 6b 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65  ked itself.  The
12260 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e  .       ** journ
12270 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
12280 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
12290 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
122a0 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
122b0 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b   ** a write lock
122c0 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65  , so there is ne
122d0 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f  ver any chance o
122e0 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20  f two or more.  
122f0 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65       ** processe
12300 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f  s opening the jo
12310 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d  urnal at the sam
12320 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a  e time..       *
12330 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  /.       rc = sq
12340 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
12350 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  nly(pPager->zJou
12360 72 6e 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a  rnal, &pPager->j
12370 66 64 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  fd);.       if( 
12380 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
12390 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
123a0 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
123b0 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
123c0 0a 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72  .         pPager
123d0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
123e0 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20  UNLOCK;.        
123f0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42   return SQLITE_B
12400 55 53 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20  USY;.       }.  
12410 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12420 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
12430 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
12440 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
12450 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12460 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a  journalOff = 0;.
12470 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
12480 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  etMaster = 0;.  
12490 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
124a0 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20  rnalHdr = 0;..  
124b0 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b       /* Playback
124c0 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20   and delete the 
124d0 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74  journal.  Drop t
124e0 68 65 20 64 61 74 61 62 61 73 65 20 77 72 69 74  he database writ
124f0 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b  e.       ** lock
12500 20 61 6e 64 20 72 65 61 63 71 75 69 72 65 20 74   and reacquire t
12510 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20  he read lock..  
12520 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72       */.       r
12530 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
12540 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
12550 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
12560 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
12570 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
12580 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
12590 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  Pg = 0;.  }else{
125a0 0a 20 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66  .    /* Search f
125b0 6f 72 20 70 61 67 65 20 69 6e 20 63 61 63 68 65  or page in cache
125c0 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61   */.    pPg = pa
125d0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
125e0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66  r, pgno);.    if
125f0 28 20 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65  ( MEMDB && pPage
12600 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
12610 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
12620 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
12630 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
12640 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50    }.  }.  if( pP
12650 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54  g==0 ){.    /* T
12660 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
12670 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20  e is not in the 
12680 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
12690 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50     int h;.    pP
126a0 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20  ager->nMiss++;. 
126b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
126c0 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50  Page<pPager->mxP
126d0 61 67 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70  age || pPager->p
126e0 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44  First==0 || MEMD
126f0 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72  B ){.      /* Cr
12700 65 61 74 65 20 61 20 6e 65 77 20 70 61 67 65 20  eate a new page 
12710 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73  */.      pPg = s
12720 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
12730 73 69 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70  sizeof(*pPg) + p
12740 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64  Pager->psAligned
12750 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
12770 20 73 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70   sizeof(u32) + p
12780 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20  Pager->nExtra.  
12790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
127a0 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45              + ME
127b0 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73  MDB*sizeof(PgHis
127c0 74 6f 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69  tory) );.      i
127d0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
127e0 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
127f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67  ){.          pag
12800 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
12810 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
12820 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
12830 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
12840 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20  ER_ERR_MEM;.    
12850 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12860 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d  E_NOMEM;.      }
12870 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50  .      memset(pP
12880 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50  g, 0, sizeof(*pP
12890 67 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  g));.      if( M
128a0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
128b0 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f  memset(PGHDR_TO_
128c0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
128d0 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48  ), 0, sizeof(PgH
128e0 69 73 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20  istory));.      
128f0 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  }.      pPg->pPa
12900 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
12910 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c      pPg->pNextAl
12920 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  l = pPager->pAll
12930 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
12940 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
12950 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b    pPager->nPage+
12960 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  +;.    }else{.  
12970 20 20 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61      /* Find a pa
12980 67 65 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20  ge to recycle.  
12990 54 72 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20  Try to locate a 
129a0 70 61 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e  page that does n
129b0 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75  ot.      ** requ
129c0 69 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20  ire us to do an 
129d0 66 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a  fsync() on the j
129e0 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f  ournal..      */
129f0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 61  .      pPg = pPa
12a00 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
12a10 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20  d;..      /* If 
12a20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e  we could not fin
12a30 64 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f  d a page that do
12a40 65 73 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61  es not require a
12a50 6e 20 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20  n fsync().      
12a60 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61  ** on the journa
12a70 6c 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e  l file then fsyn
12a80 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  c the journal fi
12a90 6c 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20  le.  This is a. 
12aa0 20 20 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f       ** very slo
12ab0 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20  w operation, so 
12ac0 77 65 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20  we work hard to 
12ad0 61 76 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73  avoid it.  But s
12ae0 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a  ometimes.      *
12af0 2a 20 69 74 20 63 61 6e 27 74 20 62 65 20 68 65  * it can't be he
12b00 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lped..      */. 
12b10 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20       if( pPg==0 
12b20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72  ){.        int r
12b30 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
12b40 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12b50 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
12b60 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
12b70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
12b80 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
12b90 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
12ba0 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OERR;.        }.
12bb0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
12bc0 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a  er->fullSync ){.
12bd0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20            /* If 
12be0 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64  in full-sync mod
12bf0 65 2c 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a  e, write a new j
12c00 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e  ournal header in
12c10 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75  to the..  ** jou
12c20 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20  rnal file. This 
12c30 69 73 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64  is done to avoid
12c40 20 65 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20   ever modifying 
12c50 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20  a journal..  ** 
12c60 68 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69  header that is i
12c70 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72  nvolved in the r
12c80 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73  ollback of pages
12c90 20 74 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a   that have..  **
12ca0 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
12cb0 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74  itten to the dat
12cc0 61 62 61 73 65 20 28 69 6e 20 63 61 73 65 20 74  abase (in case t
12cd0 68 65 20 68 65 61 64 65 72 20 69 73 0a 09 20 20  he header is..  
12ce0 2a 2a 20 74 72 61 73 68 65 64 20 77 68 65 6e 20  ** trashed when 
12cf0 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69  the nRec field i
12d00 73 20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20  s updated)..    
12d10 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
12d20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20     pPager->nRec 
12d30 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61  = 0;.          a
12d40 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
12d50 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b  ournalOff > 0 );
12d60 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
12d70 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
12d80 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12d90 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a     if( rc!=0 ){.
12da0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
12db0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
12dc0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
12dd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12de0 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20  LITE_IOERR;.    
12df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
12e00 7d 0a 20 20 20 20 20 20 20 20 70 50 67 20 3d 20  }.        pPg = 
12e10 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a  pPager->pFirst;.
12e20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73        }.      as
12e30 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d  sert( pPg->nRef=
12e40 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  =0 );..      /* 
12e50 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20 74  Write the page t
12e60 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
12e70 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69 72  ile if it is dir
12e80 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ty..      */.   
12e90 20 20 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74     if( pPg->dirt
12ea0 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
12eb0 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79  ert( pPg->needSy
12ec0 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  nc==0 );.       
12ed0 20 70 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30   pPg->pDirty = 0
12ee0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70  ;.        rc = p
12ef0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
12f00 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20  ist( pPg );.    
12f10 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
12f20 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
12f30 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
12f40 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29  rollback(pPager)
12f50 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
12f60 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b  rn SQLITE_IOERR;
12f70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12f80 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
12f90 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29   pPg->dirty==0 )
12fa0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74  ;..      /* If t
12fb0 68 65 20 70 61 67 65 20 77 65 20 61 72 65 20 72  he page we are r
12fc0 65 63 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b  ecycling is mark
12fd0 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
12fe0 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20  back, then.     
12ff0 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62   ** set the glob
13000 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  al alwaysRollbac
13010 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73  k flag, thus dis
13020 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20  abling the.     
13030 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f   ** sqlite_dont_
13040 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d  rollback() optim
13050 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  ization for the 
13060 72 65 73 74 20 6f 66 20 74 68 69 73 20 74 72 61  rest of this tra
13070 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20  nsaction..      
13080 2a 2a 20 49 74 20 69 73 20 6e 65 63 65 73 73 61  ** It is necessa
13090 72 79 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65  ry to do this be
130a0 63 61 75 73 65 20 74 68 65 20 70 61 67 65 20 6d  cause the page m
130b0 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
130c0 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69  back.      ** mi
130d0 67 68 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20  ght be reloaded 
130e0 61 74 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20  at a later time 
130f0 62 75 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e  but at that poin
13100 74 20 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d  t we won't remem
13110 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61  ber.      ** tha
13120 74 20 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20  t is was marked 
13130 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20  alwaysRollback. 
13140 20 54 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74   This means that
13150 20 61 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a   all pages must.
13160 20 20 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b        ** be mark
13170 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c  ed as alwaysRoll
13180 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f  back from here o
13190 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a  n out..      */.
131a0 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61        if( pPg->a
131b0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b  lwaysRollback ){
131c0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
131d0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
131e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
131f0 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68      /* Unlink th
13200 65 20 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20  e old page from 
13210 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e  the free list an
13220 64 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65  d the hash table
13230 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13240 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b  unlinkPage(pPg);
13250 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
13260 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  Ovfl++;.    }.  
13270 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67    pPg->pgno = pg
13280 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  no;.    if( pPag
13290 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26  er->aInJournal &
132a0 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61  & (int)pgno<=pPa
132b0 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
132c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
132d0 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67  CheckMemory(pPag
132e0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20  er->aInJournal, 
132f0 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61  pgno/8);.      a
13300 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
13310 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
13320 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e      pPg->inJourn
13330 61 6c 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49  al = (pPager->aI
13340 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d  nJournal[pgno/8]
13350 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
13360 29 21 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d  )!=0;.      pPg-
13370 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
13380 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13390 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d  pPg->inJournal =
133a0 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e   0;.      pPg->n
133b0 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
133c0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
133d0 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69  r->aInStmt && (i
133e0 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d  nt)pgno<=pPager-
133f0 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20  >stmtSize.      
13400 20 20 20 20 20 20 20 26 26 20 28 70 50 61 67 65         && (pPage
13410 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f  r->aInStmt[pgno/
13420 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37  8] & (1<<(pgno&7
13430 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
13440 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74  page_add_to_stmt
13450 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
13460 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67  }else{.      pag
13470 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74  e_remove_from_st
13480 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
13490 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72    }.    pPg->dir
134a0 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  ty = 0;.    pPg-
134b0 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52  >nRef = 1;.    R
134c0 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20  EFINFO(pPg);.   
134d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b   pPager->nRef++;
134e0 0a 20 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68  .    h = pager_h
134f0 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70  ash(pgno);.    p
13500 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
13510 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
13520 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48  ;.    pPager->aH
13530 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20  ash[h] = pPg;.  
13540 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
13550 48 61 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73  Hash ){.      as
13560 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74  sert( pPg->pNext
13570 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d  Hash->pPrevHash=
13580 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d  =0 );.      pPg-
13590 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65  >pNextHash->pPre
135a0 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20  vHash = pPg;.   
135b0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
135c0 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20  r->nExtra>0 ){. 
135d0 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
135e0 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
135f0 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
13600 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
13610 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61   }.    sqlite3pa
13620 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
13630 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70  ager);.    if( p
13640 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d  Pager->errMask!=
13650 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
13660 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47  e3pager_unref(PG
13670 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
13680 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
13690 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67  ger_errcode(pPag
136a0 65 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  er);.      retur
136b0 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n rc;.    }.    
136c0 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
136d0 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a  ze<(int)pgno ){.
136e0 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
136f0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
13700 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
13710 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
13720 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a  {.      int rc;.
13730 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d 45        assert( ME
13740 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  MDB==0 );.      
13750 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
13760 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f  Pager->fd, (pgno
13770 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
13780 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
13790 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
137a0 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64  Read(&pPager->fd
137b0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
137c0 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61  pPg), pPager->pa
137d0 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54  geSize);.      T
137e0 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64 20  RACE3("FETCH %d 
137f0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
13800 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67  RID(pPager), pPg
13810 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43  ->pgno);.      C
13820 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
13830 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
13840 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
13850 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
13860 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
13870 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b     i64 fileSize;
13880 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
13890 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
138a0 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65  pPager->fd,&file
138b0 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  Size)!=SQLITE_OK
138c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
138d0 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e  || fileSize>=pgn
138e0 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  o*pPager->pageSi
138f0 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ze ){.          
13900 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
13910 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  ef(PGHDR_TO_DATA
13920 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20  (pPg));.        
13930 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
13940 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13950 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48        memset(PGH
13960 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
13970 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65   0, pPager->page
13980 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  Size);.        }
13990 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
139a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
139b0 65 61 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20  ead++;.      }. 
139c0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
139d0 20 20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74    /* The request
139e0 65 64 20 70 61 67 65 20 69 73 20 69 6e 20 74 68  ed page is in th
139f0 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
13a00 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69  .    pPager->nHi
13a10 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65  t++;.    page_re
13a20 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  f(pPg);.  }.  *p
13a30 70 50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f  pPage = PGHDR_TO
13a40 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65  _DATA(pPg);.  re
13a50 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
13a60 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65  }../*.** Acquire
13a70 20 61 20 70 61 67 65 20 69 66 20 69 74 20 69 73   a page if it is
13a80 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
13a90 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e  in-memory cache.
13aa0 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64    Do.** not read
13ab0 20 74 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64   the page from d
13ac0 69 73 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70  isk.  Return a p
13ad0 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61  ointer to the pa
13ae0 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74  ge,.** or 0 if t
13af0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
13b00 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53  n cache..**.** S
13b10 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
13b20 61 67 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65  ager_get().  The
13b30 20 64 69 66 66 65 72 65 6e 63 65 20 62 65 74 77   difference betw
13b40 65 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  een this routine
13b50 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70  .** and sqlite3p
13b60 61 67 65 72 5f 67 65 74 28 29 20 69 73 20 74 68  ager_get() is th
13b70 61 74 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67  at _get() will g
13b80 6f 20 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e  o to the disk an
13b90 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65  d read.** in the
13ba0 20 70 61 67 65 20 69 66 20 74 68 65 20 70 61 67   page if the pag
13bb0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
13bc0 20 69 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73   in cache.  This
13bd0 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75   routine.** retu
13be0 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  rns NULL if the 
13bf0 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63  page is not in c
13c00 61 63 68 65 20 6f 72 20 69 66 20 61 20 64 69 73  ache or if a dis
13c10 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20  k I/O error .** 
13c20 68 61 73 20 65 76 65 72 20 68 61 70 70 65 6e 65  has ever happene
13c30 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69  d..*/.void *sqli
13c40 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28  te3pager_lookup(
13c50 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
13c60 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48  gno pgno){.  PgH
13c70 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65  dr *pPg;..  asse
13c80 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
13c90 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
13ca0 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
13cb0 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28  er->errMask & ~(
13cc0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20  PAGER_ERR_FULL) 
13cd0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
13ce0 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67  .  }.  pPg = pag
13cf0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
13d00 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
13d10 50 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  Pg==0 ) return 0
13d20 3b 0a 20 20 70 61 67 65 5f 72 65 66 28 70 50 67  ;.  page_ref(pPg
13d30 29 3b 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44  );.  return PGHD
13d40 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a  R_TO_DATA(pPg);.
13d50 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65  }../*.** Release
13d60 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49   a page..**.** I
13d70 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
13d80 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68  references to th
13d90 65 20 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a  e page drop to z
13da0 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a  ero, then the.**
13db0 20 70 61 67 65 20 69 73 20 61 64 64 65 64 20 74   page is added t
13dc0 6f 20 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20  o the LRU list. 
13dd0 20 57 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65   When all refere
13de0 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65  nces to all page
13df0 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65  s.** are release
13e00 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63  d, a rollback oc
13e10 63 75 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63  curs and the loc
13e20 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
13e30 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e  e is.** removed.
13e40 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
13e50 61 67 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20  ager_unref(void 
13e60 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
13e70 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63   *pPg;..  /* Dec
13e80 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
13e90 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74  ence count for t
13ea0 68 69 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20  his page.  */.  
13eb0 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
13ec0 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73  HDR(pData);.  as
13ed0 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e  sert( pPg->nRef>
13ee0 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66  0 );.  pPg->nRef
13ef0 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50  --;.  REFINFO(pP
13f00 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74  g);..  /* When t
13f10 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  he number of ref
13f20 65 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67  erences to a pag
13f30 65 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20  e reach 0, call 
13f40 74 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63  the.  ** destruc
13f50 74 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20  tor and add the 
13f60 70 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65  page to the free
13f70 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  list..  */.  if(
13f80 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b   pPg->nRef==0 ){
13f90 0a 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67  .    Pager *pPag
13fa0 65 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d  er;.    pPager =
13fb0 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
13fc0 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
13fd0 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70   = 0;.    pPg->p
13fe0 50 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65  PrevFree = pPage
13ff0 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50  r->pLast;.    pP
14000 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
14010 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
14020 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
14030 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
14040 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
14050 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  Pg;.    }else{. 
14060 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69       pPager->pFi
14070 72 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  rst = pPg;.    }
14080 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65  .    if( pPg->ne
14090 65 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61  edSync==0 && pPa
140a0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
140b0 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50  d==0 ){.      pP
140c0 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
140d0 65 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  ed = pPg;.    }.
140e0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
140f0 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20  xDestructor ){. 
14100 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
14110 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
14120 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
14130 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  );.    }.  .    
14140 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65  /* When all page
14150 73 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65  s reach the free
14160 6c 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72  list, drop the r
14170 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20  ead lock from.  
14180 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73    ** the databas
14190 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20  e file..    */. 
141a0 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d     pPager->nRef-
141b0 2d 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  -;.    assert( p
141c0 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29  Pager->nRef>=0 )
141d0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
141e0 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
141f0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67  MDB ){.      pag
14200 65 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29  er_reset(pPager)
14210 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
14220 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
14230 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
14240 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  a journal file f
14250 6f 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72  or pPager.  Ther
14260 65 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79  e should already
14270 20 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a   be a RESERVED.*
14280 2a 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c  * or EXCLUSIVE l
14290 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
142a0 61 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68  ase file when th
142b0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
142c0 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  lled..**.** Retu
142d0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20  rn SQLITE_OK if 
142e0 65 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74  everything.  Ret
142f0 75 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  urn an error cod
14300 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
14310 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20  e.** write lock 
14320 69 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73  if anything goes
14330 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69   wrong..*/.stati
14340 63 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e  c int pager_open
14350 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  _journal(Pager *
14360 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
14370 63 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45  c;.  assert( !ME
14380 4d 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28  MDB );.  assert(
14390 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
143a0 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
143b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
143c0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
143d0 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
143e0 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
143f0 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70  al );.  sqlite3p
14400 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70  ager_pagecount(p
14410 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
14420 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
14430 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
14440 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
14450 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
14460 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
14470 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
14480 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
14490 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
144a0 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
144b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
144c0 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
144d0 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
144e0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61  &pPager->jfd,pPa
144f0 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a  ger->tempFile);.
14500 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
14510 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67  lOff = 0;.  pPag
14520 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
14530 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  0;.  pPager->jou
14540 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69  rnalHdr = 0;.  i
14550 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14560 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69   ){.    goto fai
14570 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72  led_to_open_jour
14580 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  nal;.  }.  sqlit
14590 65 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72  e3OsOpenDirector
145a0 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  y(pPager->zDirec
145b0 74 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a  tory, &pPager->j
145c0 66 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  fd);.  pPager->j
145d0 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a  ournalOpen = 1;.
145e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
145f0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
14600 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
14610 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14620 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d  alwaysRollback =
14630 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
14640 65 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50  ec = 0;.  if( pP
14650 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30  ager->errMask!=0
14660 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
14670 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
14680 72 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  r);.    return r
14690 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
146a0 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
146b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
146c0 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
146d0 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
146e0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
146f0 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
14700 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
14710 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
14720 61 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28  ager_stmt_begin(
14730 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
14740 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
14750 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   ){.    rc = pag
14760 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
14770 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
14780 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14790 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
147a0 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20  TE_FULL;.    }. 
147b0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
147c0 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f  .failed_to_open_
147d0 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74  journal:.  sqlit
147e0 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49  eFree(pPager->aI
147f0 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61  nJournal);.  pPa
14800 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
14810 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  = 0;.  sqlite3Os
14820 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
14830 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
14840 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
14850 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20  PAGER_UNLOCK;.  
14860 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14870 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72  .** Acquire a wr
14880 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ite-lock on the 
14890 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c  database.  The l
148a0 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77  ock is removed w
148b0 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f  hen.** the any o
148c0 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
148d0 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20  happen:.**.**   
148e0 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  *  sqlite3pager_
148f0 63 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c  commit() is call
14900 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69  ed..**   *  sqli
14910 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
14920 6b 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a  k() is called..*
14930 2a 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61  *   *  sqlite3pa
14940 67 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63  ger_close() is c
14950 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
14960 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65  qlite3pager_unre
14970 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  f() is called to
14980 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61   on every outsta
14990 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a  nding page..**.*
149a0 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61  * The first para
149b0 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f  meter to this ro
149c0 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74  utine is a point
149d0 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70  er to any open p
149e0 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61  age of the.** da
149f0 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f  tabase file.  No
14a00 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62  thing changes ab
14a10 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69  out the page - i
14a20 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79  t is used merely
14a30 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61   to.** acquire a
14a40 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
14a50 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20  Pager structure 
14a60 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61  and as proof tha
14a70 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c  t there is.** al
14a80 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63  ready a read-loc
14a90 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
14aa0 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63  e..**.** The sec
14ab0 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e  ond parameter in
14ac0 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68  dicates how much
14ad0 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20   space in bytes 
14ae0 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61  to reserve for a
14af0 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
14b00 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20  al file-name at 
14b10 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65  the start of the
14b20 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74   journal when it
14b30 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a   is created..**.
14b40 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ** A journal fil
14b50 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74  e is opened if t
14b60 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d  his is not a tem
14b70 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f  porary file.  Fo
14b80 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66  r temporary.** f
14b90 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e  iles, the openin
14ba0 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  g of the journal
14bb0 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65   file is deferre
14bc0 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73  d until there is
14bd0 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65   an.** actual ne
14be0 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74  ed to write to t
14bf0 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a  he journal..**.*
14c00 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73  * If the databas
14c10 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73  e is already res
14c20 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e  erved for writin
14c30 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  g, this routine 
14c40 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a  is a no-op..**.*
14c50 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74  * If exFlag is t
14c60 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e  rue, go ahead an
14c70 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49  d get an EXCLUSI
14c80 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66  VE lock on the f
14c90 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65  ile.** immediate
14ca0 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61  ly instead of wa
14cb0 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74  iting until we t
14cc0 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20  ry to flush the 
14cd0 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65  cache.  The.** e
14ce0 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64  xFlag is ignored
14cf0 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f   if a transactio
14d00 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74  n is already act
14d10 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ive..*/.int sqli
14d20 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76  te3pager_begin(v
14d30 6f 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20  oid *pData, int 
14d40 65 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72  exFlag){.  PgHdr
14d50 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
14d60 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
14d70 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
14d80 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
14d90 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
14da0 4b 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  K;.  assert( pPg
14db0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73  ->nRef>0 );.  as
14dc0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
14dd0 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
14de0 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  K );.  if( pPage
14df0 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
14e00 53 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73  SHARED ){.    as
14e10 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
14e20 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20  nJournal==0 );. 
14e30 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
14e40 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
14e50 61 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c  ate = PAGER_EXCL
14e60 55 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61  USIVE;.      pPa
14e70 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
14e80 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
14e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14ea0 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f 42 55     if( SQLITE_BU
14eb0 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  SY_RESERVED_LOCK
14ec0 20 7c 7c 20 65 78 46 6c 61 67 20 29 7b 0a 20 20   || exFlag ){.  
14ed0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14ee0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
14ef0 61 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c  ager, RESERVED_L
14f00 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  OCK);.      }els
14f10 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
14f20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
14f30 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52  Pager->fd, RESER
14f40 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20  VED_LOCK);.     
14f50 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d   }.      if( rc=
14f60 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
14f70 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
14f80 61 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45  ate = PAGER_RESE
14f90 52 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66  RVED;.        if
14fa0 28 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  ( exFlag ){.    
14fb0 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
14fc0 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
14fd0 61 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f  ager, EXCLUSIVE_
14fe0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d  LOCK);.        }
14ff0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
15000 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
15010 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
15020 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
15030 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72       pPager->dir
15040 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
15050 20 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53     TRACE2("TRANS
15060 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41  ACTION %d\n", PA
15070 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
15080 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
15090 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  ->useJournal && 
150a0 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c  !pPager->tempFil
150b0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
150c0 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75  = pager_open_jou
150d0 72 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20  rnal(pPager);.  
150e0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
150f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15100 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74  /*.** Mark a dat
15110 61 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61  a page as writea
15120 62 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69  ble.  The page i
15130 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74  s written into t
15140 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69  he journal .** i
15150 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72  f it is not ther
15160 65 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73  e already.  This
15170 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65   routine must be
15180 20 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d   called before m
15190 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73  aking.** changes
151a0 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a   to a page..**.*
151b0 2a 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65  * The first time
151c0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
151d0 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
151e0 65 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77  er creates a new
151f0 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  .** journal and 
15200 61 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52  acquires a RESER
15210 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  VED lock on the 
15220 64 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68  database.  If th
15230 65 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f  e RESERVED.** lo
15240 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  ck could not be 
15250 61 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72  acquired, this r
15260 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
15270 51 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65  QLITE_BUSY.  The
15280 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74  .** calling rout
15290 69 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66  ine must check f
152a0 6f 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76  or that return v
152b0 61 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65  alue and be care
152c0 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68  ful not to.** ch
152d0 61 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61  ange any page da
152e0 74 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f  ta until this ro
152f0 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
15300 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49  LITE_OK..**.** I
15310 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
15320 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  le could not be 
15330 77 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20  written because 
15340 74 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c  the disk is full
15350 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72  ,.** then this r
15360 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53  outine returns S
15370 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64  QLITE_FULL and d
15380 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65  oes an immediate
15390 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c   rollback..** Al
153a0 6c 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69  l subsequent wri
153b0 74 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f  te attempts also
153c0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46   return SQLITE_F
153d0 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a  ULL until there.
153e0 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20  ** is a call to 
153f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d  sqlite3pager_com
15400 6d 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33  mit() or sqlite3
15410 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29  pager_rollback()
15420 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f   to.** reset..*/
15430 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
15440 72 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44  r_write(void *pD
15450 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ata){.  PgHdr *p
15460 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
15470 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67  DR(pData);.  Pag
15480 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
15490 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20  ->pPager;.  int 
154a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
154b0 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20  .  /* Check for 
154c0 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66  errors.  */.  if
154d0 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
154e0 6b 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e  k ){ .    return
154f0 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
15500 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
15510 28 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e  ( pPager->readOn
15520 6c 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ly ){.    return
15530 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20   SQLITE_PERM;.  
15540 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50  }..  assert( !pP
15550 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
15560 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68  );..  /* Mark th
15570 65 20 70 61 67 65 20 61 73 20 64 69 72 74 79 2e  e page as dirty.
15580 20 20 49 66 20 74 68 65 20 70 61 67 65 20 68 61    If the page ha
15590 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77  s already been w
155a0 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74  ritten.  ** to t
155b0 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20  he journal then 
155c0 77 65 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69  we can return ri
155d0 67 68 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20  ght away..  */. 
155e0 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b   pPg->dirty = 1;
155f0 0a 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f  .  if( pPg->inJo
15600 75 72 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69  urnal && (pPg->i
15610 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d  nStmt || pPager-
15620 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29  >stmtInUse==0) )
15630 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69  {.    pPager->di
15640 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20  rtyCache = 1;.  
15650 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49  }else{..    /* I
15660 66 20 77 65 20 67 65 74 20 74 68 69 73 20 66 61  f we get this fa
15670 72 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  r, it means that
15680 20 74 68 65 20 70 61 67 65 20 6e 65 65 64 73 20   the page needs 
15690 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69  to be.    ** wri
156a0 74 74 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e  tten to the tran
156b0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
156c0 6f 72 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e  or the ckeckpoin
156d0 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a  t journal.    **
156e0 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a   or both..    **
156f0 0a 20 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68  .    ** First ch
15700 65 63 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20  eck to see that 
15710 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
15720 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61  journal exists a
15730 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65  nd.    ** create
15740 20 69 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e   it if it does n
15750 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  ot..    */.    a
15760 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15770 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate!=PAGER_UNLO
15780 43 4b 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  CK );.    rc = s
15790 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
157a0 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20  n(pData, 0);.   
157b0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
157c0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
157d0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20  rn rc;.    }.   
157e0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
157f0 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45  >state>=PAGER_RE
15800 53 45 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66  SERVED );.    if
15810 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  ( !pPager->journ
15820 61 6c 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72  alOpen && pPager
15830 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a  ->useJournal ){.
15840 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
15850 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50  _open_journal(pP
15860 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
15870 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15880 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
15890 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  }.    assert( pP
158a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
158b0 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73  n || !pPager->us
158c0 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  eJournal );.    
158d0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
158e0 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f  he = 1;.  .    /
158f0 2a 20 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f  * The transactio
15900 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78  n journal now ex
15910 69 73 74 73 20 61 6e 64 20 77 65 20 68 61 76 65  ists and we have
15920 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 61   a RESERVED or a
15930 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49  n.    ** EXCLUSI
15940 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d  VE lock on the m
15950 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
15960 65 2e 20 20 57 72 69 74 65 20 74 68 65 20 63 75  e.  Write the cu
15970 72 72 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20  rrent page to.  
15980 20 20 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63    ** the transac
15990 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20  tion journal if 
159a0 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
159b0 61 6c 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a  already..    */.
159c0 20 20 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e      if( !pPg->in
159d0 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67  Journal && (pPag
159e0 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c  er->useJournal |
159f0 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20  | MEMDB) ){.    
15a00 20 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e    if( (int)pPg->
15a10 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e  pgno <= pPager->
15a20 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20  origDbSize ){.  
15a30 20 20 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a        int szPg;.
15a40 20 20 20 20 20 20 20 20 75 33 32 20 73 61 76 65          u32 save
15a50 64 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d  d;.        if( M
15a60 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
15a70 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
15a80 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
15a90 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
15aa0 0a 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45  .          TRACE
15ab0 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  3("JOURNAL %d pa
15ac0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
15ad0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
15ae0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20  pgno);.         
15af0 20 61 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e   assert( pHist->
15b00 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20  pOrig==0 );.    
15b10 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72        pHist->pOr
15b20 69 67 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ig = sqliteMallo
15b30 63 52 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61  cRaw( pPager->pa
15b40 67 65 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  geSize );.      
15b50 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
15b60 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
15b70 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
15b80 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54  ->pOrig, PGHDR_T
15b90 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
15ba0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15bb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
15bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
15bd0 20 20 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a       u32 cksum;.
15be0 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43 28            CODEC(
15bf0 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
15c00 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20  Pg->pgno, 7);.  
15c10 20 20 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20          cksum = 
15c20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67  pager_cksum(pPag
15c30 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  er, pPg->pgno, p
15c40 44 61 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20  Data);.         
15c50 20 73 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29   saved = *(u32*)
15c60 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
15c70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
15c80 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62 69         store32bi
15c90 74 73 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 70  ts(cksum, pPg, p
15ca0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
15cb0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 7a 50 67  ;.          szPg
15cc0 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53   = pPager->pageS
15cd0 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20  ize+8;.         
15ce0 20 73 74 6f 72 65 33 32 62 69 74 73 28 70 50 67   store32bits(pPg
15cf0 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29  ->pgno, pPg, -4)
15d00 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
15d10 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
15d20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28  &pPager->jfd, &(
15d30 28 63 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34  (char*)pData)[-4
15d40 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20  ], szPg);.      
15d50 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
15d60 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a  nalOff += szPg;.
15d70 20 20 20 20 20 20 20 20 20 20 54 52 41 43 45 34            TRACE4
15d80 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67  ("JOURNAL %d pag
15d90 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64  e %d needSync=%d
15da0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
15db0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
15dc0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
15dd0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
15de0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44  );.          COD
15df0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
15e00 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b  , pPg->pgno, 0);
15e10 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
15e20 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  *)PGHDR_TO_EXTRA
15e30 28 70 50 67 2c 20 70 50 61 67 65 72 29 20 3d 20  (pPg, pPager) = 
15e40 73 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20  saved;.         
15e50 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15e60 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
15e70 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
15e80 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
15e90 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
15ea0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
15eb0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
15ec0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
15ed0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20  rn rc;.         
15ee0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 50 61   }.          pPa
15ef0 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20  ger->nRec++;.   
15f00 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
15f10 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
15f20 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  l!=0 );.        
15f30 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
15f40 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38  rnal[pPg->pgno/8
15f50 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67  ] |= 1<<(pPg->pg
15f60 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20  no&7);.         
15f70 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
15f80 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
15f90 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
15fa0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
15fb0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e ){.           
15fc0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
15fd0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
15fe0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
15ff0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  );.            p
16000 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f  age_add_to_stmt_
16010 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20  list(pPg);.     
16020 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
16030 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
16040 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
16050 79 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a  ync = !pPager->j
16060 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26  ournalStarted &&
16070 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63   !pPager->noSync
16080 3b 0a 20 20 20 20 20 20 20 20 54 52 41 43 45 34  ;.        TRACE4
16090 28 22 41 50 50 45 4e 44 20 25 64 20 70 61 67 65  ("APPEND %d page
160a0 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c   %d needSync=%d\
160b0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
160c0 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
160d0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
160e0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a  pPg->needSync);.
160f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
16100 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
16110 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
16120 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
16130 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
16140 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
16150 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
16160 2f 2a 20 49 66 20 74 68 65 20 73 74 61 74 65 6d  /* If the statem
16170 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ent journal is o
16180 70 65 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65  pen and the page
16190 20 69 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20   is not in it,. 
161a0 20 20 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65     ** then write
161b0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 61 67   the current pag
161c0 65 20 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65  e to the stateme
161d0 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74  nt journal.  Not
161e0 65 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68  e that.    ** th
161f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
16200 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65  nal format diffe
16210 72 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e  rs from the stan
16220 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  dard journal for
16230 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68  mat.    ** in th
16240 61 74 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20  at it omits the 
16250 63 68 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68  checksums and th
16260 65 20 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f  e header..    */
16270 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16280 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70  >stmtInUse && !p
16290 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69  Pg->inStmt && (i
162a0 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50  nt)pPg->pgno<=pP
162b0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29  ager->stmtSize )
162c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
162d0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
162e0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
162f0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
16300 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ize );.      if(
16310 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
16320 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
16330 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
16340 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
16350 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
16360 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30   pHist->pStmt==0
16370 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73   );.        pHis
16380 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74  t->pStmt = sqlit
16390 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
163a0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
163b0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
163c0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
163d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69        memcpy(pHi
163e0 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52  st->pStmt, PGHDR
163f0 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
16400 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
16410 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
16420 20 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54      TRACE3("STMT
16430 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  -JOURNAL %d page
16440 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
16450 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
16460 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  no);.      }else
16470 7b 0a 20 20 20 20 20 20 20 20 73 74 6f 72 65 33  {.        store3
16480 32 62 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c  2bits(pPg->pgno,
16490 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20   pPg, -4);.     
164a0 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
164b0 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
164c0 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72  o, 7);.        r
164d0 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
164e0 74 65 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64  te(&pPager->stfd
164f0 2c 28 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d  ,((char*)pData)-
16500 34 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  4, pPager->pageS
16510 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20  ize+4);.        
16520 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55  TRACE3("STMT-JOU
16530 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c  RNAL %d page %d\
16540 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
16550 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b  er), pPg->pgno);
16560 0a 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70  .        CODEC(p
16570 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50  Pager, pData, pP
16580 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20  g->pgno, 0);.   
16590 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
165a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
165b0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
165c0 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
165d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  );.          pPa
165e0 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
165f0 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a  PAGER_ERR_FULL;.
16600 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
16610 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
16620 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
16630 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  tmtNRec++;.     
16640 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
16650 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b  r->aInStmt!=0 );
16660 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16670 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67  >aInStmt[pPg->pg
16680 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67  no/8] |= 1<<(pPg
16690 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20  ->pgno&7);.     
166a0 20 7d 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64   }.      page_ad
166b0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
166c0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  Pg);.    }.  }..
166d0 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20    /* Update the 
166e0 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e  database size an
166f0 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20  d return..  */. 
16700 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
16710 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67  ize<(int)pPg->pg
16720 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  no ){.    pPager
16730 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e  ->dbSize = pPg->
16740 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d  pgno;.    if( !M
16750 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e  EMDB && pPager->
16760 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f  dbSize==PENDING_
16770 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
16780 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70  eSize ){.      p
16790 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b  Pager->dbSize++;
167a0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
167b0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
167c0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
167d0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
167e0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
167f0 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
16800 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
16810 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e  e3pager_write().
16820 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
16830 2c 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66  , return TRUE if
16840 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20   it is ok.** to 
16850 63 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65  change the conte
16860 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a  nt of the page..
16870 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
16880 67 65 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28  ger_iswriteable(
16890 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
168a0 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54  PgHdr *pPg = DAT
168b0 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61  A_TO_PGHDR(pData
168c0 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d  );.  return pPg-
168d0 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  >dirty;.}../*.**
168e0 20 52 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e   Replace the con
168f0 74 65 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65  tent of a single
16900 20 70 61 67 65 20 77 69 74 68 20 74 68 65 20 69   page with the i
16910 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68  nformation in th
16920 65 20 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d  e third.** argum
16930 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
16940 74 65 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69  te3pager_overwri
16950 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  te(Pager *pPager
16960 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
16970 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69  d *pData){.  voi
16980 64 20 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20  d *pPage;.  int 
16990 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
169a0 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61  te3pager_get(pPa
169b0 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67  ger, pgno, &pPag
169c0 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
169d0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
169e0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
169f0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
16a00 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
16a10 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65  E_OK ){.      me
16a20 6d 63 70 79 28 70 50 61 67 65 2c 20 70 44 61 74  mcpy(pPage, pDat
16a30 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
16a40 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
16a50 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
16a60 65 66 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20  ef(pPage);.  }. 
16a70 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
16a80 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
16a90 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
16aa0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
16ab0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
16ac0 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
16ad0 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
16ae0 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20   on page "pgno" 
16af0 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
16b00 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
16b10 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
16b20 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
16b30 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
16b40 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
16b50 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
16b60 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
16b70 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
16b80 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
16b90 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
16ba0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
16bb0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
16bc0 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
16bd0 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
16be0 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
16bf0 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
16c00 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
16c10 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
16c20 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
16c30 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
16c40 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
16c50 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
16c60 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
16c70 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
16c80 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
16c90 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
16ca0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
16cb0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
16cc0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16cd0 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
16ce0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
16cf0 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
16d00 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
16d10 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
16d20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
16d30 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
16d40 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
16d50 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
16d60 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
16d70 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
16d80 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
16d90 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
16da0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
16db0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
16dc0 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
16dd0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
16de0 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
16df0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
16e00 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
16e10 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
16e20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
16e30 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
16e40 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
16e50 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
16e60 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
16e70 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
16e80 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
16e90 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
16ea0 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c  .** the dont_rol
16eb0 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
16ec0 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
16ed0 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
16ee0 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69   contains.** cri
16ef0 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
16f00 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
16f10 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c  sure it gets rol
16f20 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
16f30 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74  e.** of the dont
16f40 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  _rollback() call
16f50 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
16f60 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74  3pager_dont_writ
16f70 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
16f80 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
16f90 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
16fa0 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  ( MEMDB ) return
16fb0 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
16fc0 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
16fd0 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  pgno);.  pPg->al
16fe0 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
16ff0 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70  ;.  if( pPg && p
17000 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
17010 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
17020 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
17030 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
17040 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
17050 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
17060 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
17070 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
17080 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
17090 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
170a0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
170b0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
170c0 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
170d0 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
170e0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
170f0 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
17100 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17110 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
17120 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
17130 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
17140 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
17150 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
17160 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
17170 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
17180 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
17190 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
171a0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
171b0 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
171c0 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
171d0 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
171e0 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
171f0 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
17200 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
17210 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
17220 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
17230 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
17240 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
17250 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
17260 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 44  .      TRACE3("D
17270 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
17280 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  d of %d\n", pgno
17290 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
172a0 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
172b0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
172c0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
172d0 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
172e0 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
172f0 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
17300 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
17310 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
17320 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
17330 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
17340 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
17350 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
17360 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
17370 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
17380 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
17390 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
173a0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
173b0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
173c0 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
173d0 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
173e0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
173f0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
17400 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
17410 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
17420 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
17430 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45  ->state!=PAGER_E
17440 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67  XCLUSIVE || pPag
17450 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
17460 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
17470 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
17480 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
17490 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
174a0 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
174b0 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
174c0 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
174d0 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
174e0 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
174f0 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
17500 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17510 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
17520 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17530 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
17540 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
17550 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
17560 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
17570 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
17580 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
17590 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
175a0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
175b0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
175c0 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
175d0 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
175e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
175f0 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
17600 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
17610 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
17620 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
17630 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
17640 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
17650 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
17660 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
17670 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
17680 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
17690 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
176a0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
176b0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
176c0 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
176d0 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
176e0 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
176f0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
17700 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
17710 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
17720 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
17730 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
17740 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65   }.}.../*.** Cle
17750 61 72 20 61 20 50 67 48 69 73 74 6f 72 79 20 62  ar a PgHistory b
17760 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lock.*/.static v
17770 6f 69 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79  oid clearHistory
17780 28 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73  (PgHistory *pHis
17790 74 29 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t){.  sqliteFree
177a0 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a  (pHist->pOrig);.
177b0 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
177c0 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48  st->pStmt);.  pH
177d0 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a  ist->pOrig = 0;.
177e0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
177f0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d   0;.}../*.** Com
17800 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 20  mit all changes 
17810 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
17820 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 20  and release the 
17830 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a  write lock..**.*
17840 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69 74 20  * If the commit 
17850 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20 72 65  fails for any re
17860 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ason, a rollback
17870 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61 64 65   attempt is made
17880 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72 6f 72  .** and an error
17890 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
178a0 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  d.  If the commi
178b0 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49 54 45  t worked, SQLITE
178c0 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75 72 6e  _OK.** is return
178d0 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
178e0 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74 28 50  e3pager_commit(P
178f0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
17900 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
17910 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20 70 50   *pPg;..  if( pP
17920 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d 3d 50  ager->errMask==P
17930 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b  AGER_ERR_FULL ){
17940 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
17950 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
17960 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
17970 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
17980 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
17990 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a  ITE_FULL;.    }.
179a0 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
179b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
179c0 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
179d0 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
179e0 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
179f0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
17a00 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
17a10 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53 45  state<PAGER_RESE
17a20 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74 75  RVED ){.    retu
17a30 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
17a40 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
17a50 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50 41 47  OMMIT %d\n", PAG
17a60 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
17a70 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
17a80 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
17a90 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
17aa0 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 77  s(pPager);.    w
17ab0 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20 20 20  hile( pPg ){.   
17ac0 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
17ad0 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
17ae0 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20 20 20  g, pPager));.   
17af0 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
17b00 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  0;.      pPg->in
17b10 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
17b20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d     pPg->inStmt =
17b30 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   0;.      pPg->p
17b40 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e  PrevStmt = pPg->
17b50 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20  pNextStmt = 0;. 
17b60 20 20 20 20 20 70 50 67 20 3d 20 70 50 67 2d 3e       pPg = pPg->
17b70 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 23 69  pDirty;.    }.#i
17b80 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20  fndef NDEBUG.   
17b90 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
17ba0 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
17bb0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
17bc0 20 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20        PgHistory 
17bd0 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54  *pHist = PGHDR_T
17be0 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67  O_HIST(pPg, pPag
17bf0 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  er);.      asser
17c00 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79 73 52  t( !pPg->alwaysR
17c10 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20 20 20  ollback );.     
17c20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d   assert( !pHist-
17c30 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
17c40 61 73 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e  assert( !pHist->
17c50 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23  pStmt );.    }.#
17c60 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67 65 72  endif.    pPager
17c70 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20  ->pStmt = 0;.   
17c80 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
17c90 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20   PAGER_SHARED;. 
17ca0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
17cb0 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  _OK;.  }.  if( p
17cc0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
17cd0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 45  e==0 ){.    /* E
17ce0 78 69 74 20 65 61 72 6c 79 20 28 77 69 74 68 6f  xit early (witho
17cf0 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74 69 6d  ut doing the tim
17d00 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71 6c 69  e-consuming sqli
17d10 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61 6c 6c  te3OsSync() call
17d20 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74 68 65  s).    ** if the
17d30 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e 6f 20  re have been no 
17d40 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65 20 64  changes to the d
17d50 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
17d60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
17d70 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  ger->needSync==0
17d80 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67   );.    rc = pag
17d90 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
17da0 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67  Pager);.    pPag
17db0 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b  er->dbSize = -1;
17dc0 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17dd0 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50    }.  assert( pP
17de0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
17df0 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
17e00 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 70 50  te3pager_sync(pP
17e10 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 69  ager, 0, 0);.  i
17e20 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
17e30 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63 6f 6d   ){.    goto com
17e40 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d 0a 20  mit_abort;.  }. 
17e50 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
17e60 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
17e70 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
17e80 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
17e90 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d 70 20   rc;..  /* Jump 
17ea0 68 65 72 65 20 69 66 20 61 6e 79 74 68 69 6e 67  here if anything
17eb0 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75 72 69   goes wrong duri
17ec0 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 70 72  ng the commit pr
17ed0 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f 6d 6d  ocess..  */.comm
17ee0 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71 6c 69  it_abort:.  sqli
17ef0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
17f00 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 72 65 74  k(pPager);.  ret
17f10 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
17f20 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68   Rollback all ch
17f30 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61 74 61  anges.  The data
17f40 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20  base falls back 
17f50 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  to PAGER_SHARED 
17f60 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d  mode..** All in-
17f70 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67  memory cache pag
17f80 65 73 20 72 65 76 65 72 74 20 74 6f 20 74 68 65  es revert to the
17f90 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61  ir original data
17fa0 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68   contents..** Th
17fb0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c  e journal is del
17fc0 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  eted..**.** This
17fd0 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20   routine cannot 
17fe0 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65  fail unless some
17ff0 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 69   other process i
18000 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a  s not following.
18010 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c  ** the correct l
18020 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20  ocking protocol 
18030 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c  (SQLITE_PROTOCOL
18040 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f 6d 65  ) or unless some
18050 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63 65 73   other.** proces
18060 73 20 69 73 20 77 72 69 74 69 6e 67 20 74 72 61  s is writing tra
18070 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  sh into the jour
18080 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49 54 45  nal file (SQLITE
18090 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a 2a 20  _CORRUPT) or.** 
180a0 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72 20 6d  unless a prior m
180b0 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20 28  alloc() failed (
180c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20  SQLITE_NOMEM).  
180d0 41 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  Appropriate erro
180e0 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65 20 72  r.** codes are r
180f0 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c 6c 20  eturned for all 
18100 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e 73 2e  these occasions.
18110 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a 2a 20    Otherwise,.** 
18120 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
18130 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
18140 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
18150 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65  ack(Pager *pPage
18160 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
18170 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
18180 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
18190 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
181a0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
181b0 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
181c0 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
181d0 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
181e0 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
181f0 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
18200 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
18210 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
18220 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
18230 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
18240 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
18250 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
18260 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
18270 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
18280 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
18290 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
182a0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
182b0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
182c0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
182d0 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
182e0 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
182f0 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
18300 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
18310 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
18320 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
18330 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
18340 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
18350 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
18360 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c 42 41    TRACE3("ROLLBA
18370 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20 25 64  CK-PAGE %d of %d
18380 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41  \n", p->pgno, PA
18390 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
183a0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
183b0 20 20 20 20 20 54 52 41 43 45 33 28 22 50 41 47       TRACE3("PAG
183c0 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20 6f 6e  E %d is clean on
183d0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
183e0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
183f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
18400 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 70 48   clearHistory(pH
18410 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d 3e 64  ist);.      p->d
18420 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20  irty = 0;.      
18430 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  p->inJournal = 0
18440 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53 74 6d  ;.      p->inStm
18450 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e  t = 0;.      p->
18460 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d 3e 70  pPrevStmt = p->p
18470 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 0a 20  NextStmt = 0;.. 
18480 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
18490 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20  >xReiniter ){.  
184a0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52        pPager->xR
184b0 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f  einiter(PGHDR_TO
184c0 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67 65 72  _DATA(p), pPager
184d0 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
184e0 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20 20 20     }.      .    
184f0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  }.    pPager->pS
18500 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  tmt = 0;.    pPa
18510 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
18520 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
18530 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
18540 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
18550 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
18560 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
18570 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
18580 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20 72  ER_SHARED;.    r
18590 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
185a0 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61  .  }..  if( !pPa
185b0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
185c0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  || !pPager->jour
185d0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  nalOpen ){.    r
185e0 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69 74  c = pager_unwrit
185f0 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  elock(pPager);. 
18600 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
18610 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65 74 75  e = -1;.    retu
18620 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 69 66  rn rc;.  }..  if
18630 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
18640 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  k!=0 && pPager->
18650 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52 5f 45  errMask!=PAGER_E
18660 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 69  RR_FULL ){.    i
18670 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
18680 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
18690 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  E ){.      pager
186a0 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
186b0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  );.    }.    ret
186c0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
186d0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
186e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
186f0 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56  te==PAGER_RESERV
18700 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  ED ){.    int rc
18710 32 2c 20 72 63 33 3b 0a 20 20 20 20 72 63 20 3d  2, rc3;.    rc =
18720 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61   pager_reload_ca
18730 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  che(pPager);.   
18740 20 72 63 32 20 3d 20 70 61 67 65 72 5f 74 72 75   rc2 = pager_tru
18750 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70 50  ncate(pPager, pP
18760 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
18770 29 3b 0a 20 20 20 20 72 63 33 20 3d 20 70 61 67  );.    rc3 = pag
18780 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70  er_unwritelock(p
18790 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20  Pager);.    if( 
187a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
187b0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
187c0 0a 20 20 20 20 20 20 69 66 28 20 72 63 33 20 29  .      if( rc3 )
187d0 20 72 63 20 3d 20 72 63 33 3b 0a 20 20 20 20 7d   rc = rc3;.    }
187e0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
187f0 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
18800 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
18810 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18820 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  OK ){.    rc = S
18830 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20  QLITE_CORRUPT;  
18840 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20  /* bkpt-CORRUPT 
18850 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  */.    pPager->e
18860 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
18870 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d  ERR_CORRUPT;.  }
18880 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  .  pPager->dbSiz
18890 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  e = -1;.  return
188a0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65   rc;.}../*.** Re
188b0 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
188c0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69   database file i
188d0 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e  s opened read-on
188e0 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53  ly.  Return FALS
188f0 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61  E.** if the data
18900 62 61 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f  base is (in theo
18910 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f  ry) writable..*/
18920 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
18930 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67  r_isreadonly(Pag
18940 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72  er *pPager){.  r
18950 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65  eturn pPager->re
18960 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  adOnly;.}../*.**
18970 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
18980 20 75 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   used for testin
18990 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
189a0 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c  nly..*/.int *sql
189b0 69 74 65 33 70 61 67 65 72 5f 73 74 61 74 73 28  ite3pager_stats(
189c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
189d0 20 20 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31    static int a[1
189e0 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61  1];.  a[0] = pPa
189f0 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31  ger->nRef;.  a[1
18a00 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67  ] = pPager->nPag
18a10 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67  e;.  a[2] = pPag
18a20 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b  er->mxPage;.  a[
18a30 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  3] = pPager->dbS
18a40 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50  ize;.  a[4] = pP
18a50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61  ager->state;.  a
18a60 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72  [5] = pPager->er
18a70 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20  rMask;.  a[6] = 
18a80 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20  pPager->nHit;.  
18a90 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[7] = pPager->n
18aa0 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70  Miss;.  a[8] = p
18ab0 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20  Pager->nOvfl;.  
18ac0 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[9] = pPager->n
18ad0 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20  Read;.  a[10] = 
18ae0 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a  pPager->nWrite;.
18af0 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
18b00 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
18b10 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
18b20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
18b30 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
18b40 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
18b50 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18b60 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
18b70 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
18b80 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
18b90 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
18ba0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
18bb0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
18bc0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
18bd0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
18be0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
18bf0 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
18c00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
18c10 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
18c20 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
18c30 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
18c40 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
18c50 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
18c60 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
18c70 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
18c80 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
18c90 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
18ca0 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
18cb0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18cc0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
18cd0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
18ce0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
18cf0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
18d00 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
18d10 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
18d20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
18d30 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
18d40 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
18d50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
18d60 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
18d70 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18d80 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18d90 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18da0 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
18db0 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
18dc0 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
18dd0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
18de0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
18df0 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
18e00 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
18e10 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
18e20 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74  D_LOCK);.    ret
18e30 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18e40 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
18e50 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
18e60 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
18e70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
18e80 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
18e90 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
18ea0 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
18eb0 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
18ec0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
18ed0 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
18ee0 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
18ef0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
18f00 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
18f10 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
18f20 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
18f30 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
18f40 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
18f50 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
18f60 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
18f70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
18f80 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
18f90 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
18fa0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
18fb0 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
18fc0 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
18fd0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
18fe0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
18ff0 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
19000 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
19010 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
19020 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
19030 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
19040 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
19050 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
19060 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
19070 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
19080 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
19090 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
190a0 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
190b0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
190c0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
190d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
190e0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
190f0 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19100 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
19110 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
19120 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
19130 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
19140 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
19150 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
19160 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
19170 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
19180 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
19190 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
191a0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
191b0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
191c0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
191d0 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
191e0 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
191f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
19200 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
19210 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
19220 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
19230 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
19240 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
19250 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
19260 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
19270 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
19280 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
19290 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  Pg->inStmt );.  
192a0 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
192b0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
192c0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
192d0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
192e0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
192f0 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
19300 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19310 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19320 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
19330 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
19340 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
19350 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
19360 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19370 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
19380 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
19390 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
193a0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
193b0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
193c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
193d0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
193e0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
193f0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
19400 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
19410 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19420 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c  3pager_stmt_roll
19430 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
19440 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
19450 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
19460 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52  tInUse ){.    TR
19470 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
19480 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
19490 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
194a0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
194b0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
194c0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
194d0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
194e0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
194f0 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Stmt){.        P
19500 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
19510 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
19520 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
19530 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
19540 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
19550 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
19560 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
19570 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
19580 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
19590 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
195a0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
195b0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
195c0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
195d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
195e0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
195f0 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
19600 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
19610 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
19620 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
19630 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19640 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19650 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
19660 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
19670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19680 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
19690 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
196a0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
196b0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
196c0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
196d0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
196e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
196f0 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
19700 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
19710 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19720 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
19730 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65  qlite3pager_file
19740 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
19750 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
19760 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
19770 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19780 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
19790 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
197a0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
197b0 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
197c0 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  _dirname(Pager *
197d0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
197e0 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
197f0 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
19800 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
19810 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
19820 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
19830 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
19840 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c  te3pager_journal
19850 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
19860 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
19870 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
19880 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
19890 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
198a0 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
198b0 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
198c0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
198d0 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a  Pager,.  void (*
198e0 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
198f0 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
19900 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
19910 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
19920 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
19930 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
19940 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
19950 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19960 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19970 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
19980 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
19990 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
199a0 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
199b0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
199c0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
199d0 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
199e0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
199f0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19a00 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50  void *pPage;.  P
19a10 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
19a20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
19a30 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
19a40 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
19a50 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
19a60 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  writing. */.  rc
19a70 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
19a80 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  get(pPager, 1, &
19a90 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
19aa0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
19ab0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
19ac0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
19ad0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  te(pPage);.  if(
19ae0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
19b00 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
19b10 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
19b20 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72   24. */.  pPgHdr
19b30 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19b40 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67  (pPage);.  chang
19b50 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72  e_counter = retr
19b60 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64  ieve32bits(pPgHd
19b70 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e  r, 24);..  /* In
19b80 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
19b90 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
19ba0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
19bb0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
19bc0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
19bd0 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63  .  store32bits(c
19be0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70  hange_counter, p
19bf0 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
19c00 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
19c10 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
19c20 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
19c30 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
19c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19c50 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
19c60 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19c70 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
19c80 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
19c90 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
19ca0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
19cb0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
19cc0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
19cd0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
19ce0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
19cf0 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
19d00 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
19d10 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
19d20 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
19d30 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
19d40 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
19d50 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
19d60 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19d70 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
19d80 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
19d90 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
19da0 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
19db0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19dc0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
19dd0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
19de0 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
19df0 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
19e00 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
19e10 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
19e20 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
19e30 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
19e40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19e50 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
19e60 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
19e70 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
19e80 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
19e90 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
19ea0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
19eb0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
19ec0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
19ed0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
19ee0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
19ef0 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
19f00 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
19f10 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
19f20 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
19f30 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
19f40 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
19f50 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
19f60 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
19f70 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
19f80 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
19f90 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
19fa0 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
19fb0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
19fc0 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53   TRACE4("DATABAS
19fd0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
19fe0 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
19ff0 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
1a000 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
1a010 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
1a020 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
1a030 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
1a040 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
1a050 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
1a060 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
1a070 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
1a080 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
1a090 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
1a0a0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
1a0b0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
1a0c0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
1a0d0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
1a0e0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
1a0f0 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
1a100 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1a110 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1a120 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
1a130 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
1a140 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
1a150 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
1a160 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
1a170 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
1a180 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
1a190 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
1a1a0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
1a1b0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
1a1c0 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
1a1d0 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
1a1e0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1a1f0 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1a200 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1a210 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1a220 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1a230 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1a240 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1a250 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1a260 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1a270 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1a280 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1a290 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1a2a0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1a2b0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1a2c0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1a2d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a2e0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1a2f0 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1a300 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a310 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1a320 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1a330 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1a340 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1a350 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1a360 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1a370 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1a380 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1a390 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1a3a0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1a3b0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1a3c0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1a3d0 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1a3e0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1a3f0 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  o i;.        voi
1a400 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  d *pPage;.      
1a410 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1a420 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1a430 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1a440 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1a450 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1a460 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28  nal[i/8] & (1<<(
1a470 69 26 37 29 29 29 20 29 7b 0a 20 20 20 20 20 20  i&7))) ){.      
1a480 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a490 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1a4a0 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a4c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a4d0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a4e0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a4f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1a500 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1a510 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
1a520 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1a530 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1a540 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a550 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a560 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1a570 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1a580 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
1a590 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1a5a0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1a5b0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
1a5c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a5d0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a5e0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
1a5f0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1a600 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a610 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a620 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1a630 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1a640 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a650 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
1a660 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
1a670 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1a680 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1a690 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
1a6a0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a6b0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1a6c0 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
1a6d0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
1a6e0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
1a6f0 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1a700 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
1a710 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1a720 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1a730 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
1a740 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1a750 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
1a760 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a770 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a780 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
1a790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a7a0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1a7b0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1a7c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a7d0 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
1a7e0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
1a7f0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1a800 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
1a810 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20  }..sync_exit:.  
1a820 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1a830 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a840 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
1a850 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
1a860 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1a870 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Data to location
1a880 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
1a890 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e. .**.** There 
1a8a0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
1a8b0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72  ences to the cur
1a8c0 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20  rent page pgno. 
1a8d0 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a  If current page.
1a8e0 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  ** pgno is not a
1a8f0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f  lready in the ro
1a900 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
1a910 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  it is not writte
1a920 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79  n there by.** by
1a930 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54   this routine. T
1a940 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20  he same applies 
1a950 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74  to the page pDat
1a960 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65  a refers to on e
1a970 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20  ntry to.** this 
1a980 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
1a990 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1a9a0 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f   page refered to
1a9b0 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e   by pData remain
1a9c0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
1a9d0 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
1a9e0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1a9f0 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e  h page pData (i.
1aa00 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
1aa10 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
1aa20 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
1aa30 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
1aa40 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
1aa50 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1aa60 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
1aa70 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
1aa80 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
1aa90 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1aaa0 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77 65 76 65  s called, howeve
1aab0 72 20 69 74 20 69 73 20 0a 2a 2a 20 69 6c 6c 65  r it is .** ille
1aac0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  gal to call this
1aad0 20 72 6f 75 74 69 6e 65 20 69 66 20 61 20 73 74   routine if a st
1aae0 61 74 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  atment transacti
1aaf0 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
1ab00 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1ab10 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65 72  r_movepage(Pager
1ab20 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 2a   *pPager, void *
1ab30 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f  pData, Pgno pgno
1ab40 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1ab50 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1ab60 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72 20  pData);.  PgHdr 
1ab70 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
1ab80 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
1ab90 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
1aba0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1abb0 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
1abc0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1abd0 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28  >0 );..  TRACE5(
1abe0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
1abf0 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
1ac00 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
1ac10 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1ac20 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1ac30 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
1ac40 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70   pgno);..  if( p
1ac50 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1ac60 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
1ac70 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
1ac80 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1ac90 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
1aca0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1acb0 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
1acc0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1acd0 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
1ace0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
1acf0 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
1ad00 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
1ad10 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
1ad20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1ad30 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
1ad40 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
1ad50 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
1ad60 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
1ad70 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
1ad80 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
1ad90 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
1ada0 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
1adb0 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
1adc0 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
1add0 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
1ade0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
1adf0 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
1ae00 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
1ae10 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
1ae20 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1ae30 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
1ae40 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
1ae50 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
1ae60 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
1ae70 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1ae80 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
1ae90 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79     pPgOld->dirty
1aea0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1aeb0 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
1aec0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1aed0 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
1aee0 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
1aef0 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1af00 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1af10 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
1af20 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1af30 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
1af40 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
1af50 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1af60 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
1af70 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
1af80 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
1af90 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  */.  pPg->pgno =
1afa0 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67   pgno;.  h = pag
1afb0 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
1afc0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
1afd0 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
1afe0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
1aff0 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1b000 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1b010 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1b020 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1b030 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
1b040 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1b050 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
1b060 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1b070 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
1b080 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64  h = 0;..  pPg->d
1b090 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61 67  irty = 1;.  pPag
1b0a0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1b0b0 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
1b0c0 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
1b0d0 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
1b0e0 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
1b0f0 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1b100 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
1b110 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
1b120 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1b130 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1b140 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
1b150 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
1b160 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
1b170 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
1b180 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
1b190 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
1b1a0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
1b1b0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
1b1c0 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
1b1d0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
1b1e0 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
1b1f0 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
1b200 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
1b210 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
1b220 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1b230 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
1b240 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
1b250 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
1b260 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
1b270 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
1b280 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
1b290 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
1b2a0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1b2b0 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
1b2c0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
1b2d0 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53 79     void *pNeedSy
1b2e0 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nc;.    assert( 
1b2f0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b300 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1b310 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1b320 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
1b330 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29 3b  no, &pNeedSync);
1b340 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b350 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b360 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
1b370 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1b380 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28    DATA_TO_PGHDR(
1b390 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64  pNeedSync)->need
1b3a0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41  Sync = 1;.    DA
1b3b0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1b3c0 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61  dSync)->inJourna
1b3d0 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  l = 1;.    DATA_
1b3e0 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1b3f0 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  nc)->dirty = 1;.
1b400 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1b410 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e 63  _unref(pNeedSync
1b420 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1b430 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1b440 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1b450 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1b460 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1b470 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1b480 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
1b490 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
1b4a0 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
1b4b0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
1b4c0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1b4d0 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
1b4e0 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
1b4f0 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
1b500 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
1b510 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
1b520 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1b530 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74  e3pager_lockstat
1b540 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1b550 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54  {.#ifdef OS_TEST
1b560 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1b570 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ->fd->fd.locktyp
1b580 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  e;.#else.  retur
1b590 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63  n pPager->fd.loc
1b5a0 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ktype;.#endif.}.
1b5b0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b5c0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1b5d0 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
1b5e0 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
1b5f0 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
1b600 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
1b610 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1b620 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
1b630 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1b640 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
1b650 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1b660 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1b670 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
1b680 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
1b690 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
1b6a0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1b6b0 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
1b6c0 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
1b6d0 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
1b6e0 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
1b6f0 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
1b700 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.