/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 2907f0b0c9b6efc99076d5a112cadb3f9153025e:


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 37  : pager.c,v 1.17
0350: 38 20 32 30 30 34 2f 31 31 2f 32 33 20 30 39 3a  8 2004/11/23 09:
0360: 30 36 3a 35 36 20 64 61 6e 69 65 6c 6b 31 39 37  06:56 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 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
29f0: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2a00: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2a10: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2a20: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2a30: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a50: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2a60: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
2a70: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2a80: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2a90: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2aa0: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2ab0: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2ac0: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2ad0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2ae0: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2af0: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2b00: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b20: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
2b30: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
2b40: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
2b50: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2b60: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b70: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2b80: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2b90: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2ba0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2bb0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2bc0: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2bd0: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2be0: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2bf0: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2c00: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2c10: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2c20: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2c30: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2c60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2c70: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2c80: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2c90: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2ca0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2cb0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2cc0: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2cd0: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2ce0: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2cf0: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2d00: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2d10: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2d40: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2d50: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
2d60: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2d70: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2d80: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2d90: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2da0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2db0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2dc0: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2dd0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2de0: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2df0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e00: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2e10: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2e20: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2e30: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2e40: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e50: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2e60: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2e70: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2e80: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2e90: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2ea0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2eb0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2ec0: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2ed0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2ee0: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2ef0: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2f00: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2f10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f20: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f30: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f40: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
2f50: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
2f60: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
2f70: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2f80: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2f90: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2fa0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2fb0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
2fc0: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
2fd0: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
2fe0: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
2ff0: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3000: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3010: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
3020: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
3030: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
3040: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3050: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
3060: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
3070: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
3080: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
3090: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
30a0: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
30b0: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
30c0: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
30d0: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
30e0: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
30f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3100: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
3110: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3120: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
3130: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
3140: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3150: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
3160: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
3170: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
3180: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
3190: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
31a0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
31b0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
31c0: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
31d0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
31e0: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
31f0: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3200: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3210: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3220: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3230: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
3240: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
3250: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e   started */.  in
3260: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
3270: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
3280: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
3290: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
32a0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
32b0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
32c0: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
32d0: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
32e0: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d  er to PgHdr */.}
32f0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
3300: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
3310: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
3320: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
3330: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
3340: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
3350: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
3360: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
3370: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
3380: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
3390: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
33a0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
33b0: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
33c0: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
33d0: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
33e0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
33f0: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
3400: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
3410: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
3420: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
3430: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
3440: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
3450: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
3460: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
3470: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ve? */../*.** Jo
3480: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
3490: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
34a0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
34b0: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
34c0: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
34d0: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
34e0: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
34f0: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3500: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3510: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3520: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3530: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3540: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3550: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
3560: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
3570: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
3580: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
3590: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
35a0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
35b0: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
35c0: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
35d0: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
35e0: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
35f0: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3600: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3610: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3620: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3630: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3640: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3650: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
3660: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
3670: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
3680: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
3690: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
36a0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
36b0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
36c0: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
36d0: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
36e0: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
36f0: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3700: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3710: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3720: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3730: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3740: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3750: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
3760: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
3770: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
3780: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
3790: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
37a0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
37b0: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
37c0: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
37d0: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
37e0: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
37f0: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3800: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3810: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3820: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3830: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
3840: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
3850: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
3860: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
3870: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
3880: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
3890: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
38a0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
38b0: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
38c0: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
38d0: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
38e0: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
38f0: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3900: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3910: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3920: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3930: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
3940: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
3950: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
3960: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
3970: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
3980: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
3990: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
39a0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
39b0: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
39c0: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
39d0: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
39e0: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
39f0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3a00: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3a10: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3a20: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3a30: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
3a40: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
3a50: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
3a60: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
3a70: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
3a80: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
3a90: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3aa0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3ab0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3ac0: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3ad0: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3ae0: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3af0: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3b00: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3b10: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3b20: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3b30: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
3b40: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3b50: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3b60: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3b70: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3b80: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3b90: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3ba0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3bb0: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3bc0: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3bd0: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3be0: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3bf0: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3c00: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3c10: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3c20: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3c30: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3c40: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3c50: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3c60: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3c70: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3c80: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3c90: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3ca0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3cb0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3cc0: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3cd0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3ce0: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3cf0: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3d00: 54 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65  The default size
3d10: 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f   of a disk secto
3d20: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  r.*/.#define PAG
3d30: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35  ER_SECTOR_SIZE 5
3d40: 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  12../*.** Page n
3d50: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
3d60: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3d70: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3d80: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3d90: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3da0: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3db0: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3dc0: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3dd0: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3de0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3df0: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3e00: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
3e10: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
3e20: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
3e30: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
3e40: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
3e50: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3e60: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3e70: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3e80: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3e90: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3ea0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3eb0: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3ec0: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3ed0: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3ee0: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3ef0: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3f00: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3f10: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
3f20: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
3f30: 31 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  1)../*.** Enable
3f40: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3f50: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
3f60: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
3f70: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3f80: 5f 54 45 53 54 0a 20 20 69 6e 74 20 70 61 67 65  _TEST.  int page
3f90: 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c  r3_refinfo_enabl
3fa0: 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63 20  e = 0;.  static 
3fb0: 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69 6e  void pager_refin
3fc0: 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20 20  fo(PgHdr *p){.  
3fd0: 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e 74    static int cnt
3fe0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21 70   = 0;.    if( !p
3ff0: 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e  ager3_refinfo_en
4000: 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a 20  able ) return;. 
4010: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
4020: 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 52  rintf(.       "R
4030: 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72 3d  EFCNT: %4d addr=
4040: 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a 20  %p nRef=%d\n",. 
4050: 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20 50        p->pgno, P
4060: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 2c  GHDR_TO_DATA(p),
4070: 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b 0a   p->nRef.    );.
4080: 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a 20      cnt++;   /* 
4090: 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65 74  Something to set
40a0: 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f 6e   a breakpoint on
40b0: 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e 65   */.  }.# define
40c0: 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61 67   REFINFO(X)  pag
40d0: 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23 65  er_refinfo(X).#e
40e0: 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45 46  lse.# define REF
40f0: 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a 0a  INFO(X).#endif..
4100: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
4110: 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f 6d  bit integer from
4120: 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65 20   the given file 
4130: 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74 6f  descriptor.  Sto
4140: 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  re the integer.*
4150: 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20 69  * that is read i
4160: 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72 6e  n *pRes.  Return
4170: 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
4180: 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64 2c  erything worked,
4190: 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72 20   or an.** error 
41a0: 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69 6e  code is somethin
41b0: 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2a  g goes wrong..**
41c0: 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20 61  .** All values a
41d0: 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69 73  re stored on dis
41e0: 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e 2e  k as big-endian.
41f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
4200: 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c 65  ead32bits(OsFile
4210: 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73 29   *fd, u32 *pRes)
4220: 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20 69  {.  u32 res;.  i
4230: 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  nt rc;.  rc = sq
4240: 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c 20  lite3OsRead(fd, 
4250: 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65 73  &res, sizeof(res
4260: 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  ));.  if( rc==SQ
4270: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75  LITE_OK ){.    u
4280: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b  nsigned char ac[
4290: 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 61  4];.    memcpy(a
42a0: 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20 20  c, &res, 4);.   
42b0: 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c 32   res = (ac[0]<<2
42c0: 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29  4) | (ac[1]<<16)
42d0: 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20   | (ac[2]<<8) | 
42e0: 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70 52  ac[3];.  }.  *pR
42f0: 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74 75  es = res;.  retu
4300: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
4310: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
4320: 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65 20  nteger into the 
4330: 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72  given file descr
4340: 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 53  iptor.  Return S
4350: 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20 73  QLITE_OK.** on s
4360: 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72 72  uccess or an err
4370: 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74  or code is somet
4380: 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e  hing goes wrong.
4390: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
43a0: 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69 6c  rite32bits(OsFil
43b0: 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29 7b  e *fd, u32 val){
43c0: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
43d0: 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d 20   ac[4];.  ac[0] 
43e0: 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30 78  = (val>>24) & 0x
43f0: 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76  ff;.  ac[1] = (v
4400: 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b 0a  al>>16) & 0xff;.
4410: 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e    ac[2] = (val>>
4420: 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b  8) & 0xff;.  ac[
4430: 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66 3b  3] = val & 0xff;
4440: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
4450: 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63 2c  3OsWrite(fd, ac,
4460: 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72   4);.}../*.** Wr
4470: 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20 69  ite the 32-bit i
4480: 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e 74  nteger 'val' int
4490: 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  o the page ident
44a0: 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68 65  ified by page he
44b0: 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20 6f  ader.** 'p' at o
44c0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e 0a  ffset 'offset'..
44d0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
44e0: 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20 76  tore32bits(u32 v
44f0: 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69 6e  al, PgHdr *p, in
4500: 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e 73  t offset){.  uns
4510: 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b 0a  igned char *ac;.
4520: 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67 6e    ac = &((unsign
4530: 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f 54  ed char*)PGHDR_T
4540: 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73 65  O_DATA(p))[offse
4550: 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76  t];.  ac[0] = (v
4560: 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a  al>>24) & 0xff;.
4570: 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e    ac[1] = (val>>
4580: 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  16) & 0xff;.  ac
4590: 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26  [2] = (val>>8) &
45a0: 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d   0xff;.  ac[3] =
45b0: 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a 0a   val & 0xff;.}..
45c0: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d  /*.** Read a 32-
45d0: 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f  bit integer at o
45e0: 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20 66  ffset 'offset' f
45f0: 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64 65  rom the page ide
4600: 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61  ntified by.** pa
4610: 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a  ge header 'p'..*
4620: 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65 74  /.static u32 ret
4630: 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48 64  rieve32bits(PgHd
4640: 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74  r *p, int offset
4650: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  ){.  unsigned ch
4660: 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26  ar *ac;.  ac = &
4670: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
4680: 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  )PGHDR_TO_DATA(p
4690: 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65  ))[offset];.  re
46a0: 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34 29  turn (ac[0]<<24)
46b0: 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20 7c   | (ac[1]<<16) |
46c0: 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61 63   (ac[2]<<8) | ac
46d0: 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  [3];.}.../*.** C
46e0: 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73 20  onvert the bits 
46f0: 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65  in the pPager->e
4700: 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20 61  rrMask into an a
4710: 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65 74  pproprate.** ret
4720: 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74 61  urn code..*/.sta
4730: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 72  tic int pager_er
4740: 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50 61  rcode(Pager *pPa
4750: 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ger){.  int rc =
4760: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 66   SQLITE_OK;.  if
4770: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4780: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  k & PAGER_ERR_LO
4790: 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51 4c  CK )    rc = SQL
47a0: 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20 20  ITE_PROTOCOL;.  
47b0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
47c0: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
47d0: 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20 53  DISK )    rc = S
47e0: 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 69  QLITE_IOERR;.  i
47f0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
4800: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 46  sk & PAGER_ERR_F
4810: 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53 51  ULL )    rc = SQ
4820: 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66 28  LITE_FULL;.  if(
4830: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4840: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d   & PAGER_ERR_MEM
4850: 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49   )     rc = SQLI
4860: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28 20  TE_NOMEM;.  if( 
4870: 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
4880: 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52  & PAGER_ERR_CORR
4890: 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49 54  UPT ) rc = SQLIT
48a0: 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65 74  E_CORRUPT;.  ret
48b0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
48c0: 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63 61   When this is ca
48d0: 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lled the journal
48e0: 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 20   file for pager 
48f0: 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20 6f  pPager must be o
4900: 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73 74  pen..** The mast
4910: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
4920: 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72 6f  name is read fro
4930: 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  m the end of the
4940: 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77 72   file and .** wr
4950: 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72  itten into memor
4960: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4970: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20  sqliteMalloc(). 
4980: 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a 20  *pzMaster is.** 
4990: 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74 20  set to point at 
49a0: 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20 53  the memory and S
49b0: 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65  QLITE_OK returne
49c0: 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d 75  d. The caller mu
49d0: 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65 65  st.** sqliteFree
49e0: 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a  () *pzMaster..**
49f0: 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65 72  .** If no master
4a00: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61   journal file na
4a10: 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 70  me is present *p
4a20: 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20 74  zMaster is set t
4a30: 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49 54  o 0 and.** SQLIT
4a40: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a 2a  E_OK returned..*
4a50: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61  /.static int rea
4a60: 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 4f  dMasterJournal(O
4a70: 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63 68  sFile *pJrnl, ch
4a80: 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b 0a  ar **pzMaster){.
4a90: 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32 20    int rc;.  u32 
4aa0: 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b 0a  len;.  i64 szJ;.
4ab0: 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20 69    u32 cksum;.  i
4ac0: 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65 64  nt i;.  unsigned
4ad0: 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b   char aMagic[8];
4ae0: 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f 20   /* A buffer to 
4af0: 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20 68  hold the magic h
4b00: 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d  eader */..  *pzM
4b10: 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72 63  aster = 0;..  rc
4b20: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
4b30: 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a  Size(pJrnl, &szJ
4b40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
4b50: 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36  ITE_OK || szJ<16
4b60: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
4b70: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
4b80: 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31  eek(pJrnl, szJ-1
4b90: 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  6);.  if( rc!=SQ
4ba0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
4bb0: 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72 65   rc;. .  rc = re
4bc0: 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20  ad32bits(pJrnl, 
4bd0: 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21  &len);.  if( rc!
4be0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
4bf0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
4c00: 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c  read32bits(pJrnl
4c10: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66 28  , &cksum);.  if(
4c20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
4c30: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
4c40: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61  c = sqlite3OsRea
4c50: 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63 2c  d(pJrnl, aMagic,
4c60: 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53   8);.  if( rc!=S
4c70: 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63  QLITE_OK || memc
4c80: 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72  mp(aMagic, aJour
4c90: 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20 72  nalMagic, 8) ) r
4ca0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
4cb0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
4cc0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65  pJrnl, szJ-16-le
4cd0: 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  n);.  if( rc!=SQ
4ce0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
4cf0: 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74 65   rc;..  *pzMaste
4d00: 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  r = (char *)sqli
4d10: 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b  teMalloc(len+1);
4d20: 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74 65  .  if( !*pzMaste
4d30: 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  r ){.    return 
4d40: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
4d50: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
4d60: 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a 70  OsRead(pJrnl, *p
4d70: 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20  zMaster, len);. 
4d80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4d90: 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
4da0: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
4db0: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
4dc0: 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   0;.    return r
4dd0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65 65  c;.  }..  /* See
4de0: 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d   if the checksum
4df0: 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61 73   matches the mas
4e00: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
4e10: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
4e20: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
4e30: 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73  cksum -= (*pzMas
4e40: 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69  ter)[i];.  }.  i
4e50: 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  f( cksum ){.    
4e60: 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b 73  /* If the checks
4e70: 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20 75  um doesn't add u
4e80: 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20 6d  p, then one or m
4e90: 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b 20  ore of the disk 
4ea0: 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20 63  sectors.    ** c
4eb0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d 61  ontaining the ma
4ec0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
4ed0: 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70 74  ename is corrupt
4ee0: 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a 20  ed. This means. 
4ef0: 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c 79     ** definitely
4f00: 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20 6a   roll back, so j
4f10: 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ust return SQLIT
4f20: 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74 20  E_OK and report 
4f30: 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20 6d  a (nul).    ** m
4f40: 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66 69  aster-journal fi
4f50: 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20  lename..    */. 
4f60: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70     sqliteFree(*p
4f70: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70  zMaster);.    *p
4f80: 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 7d  zMaster = 0;.  }
4f90: 0a 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c  .  (*pzMaster)[l
4fa0: 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 0a  en] = '\0';.   .
4fb0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
4fc0: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65  OK;.}../*.** See
4fd0: 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  k the journal fi
4fe0: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f  le descriptor to
4ff0: 20 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72   the next sector
5000: 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72 65 20   boundary where 
5010: 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68 65 61  a.** journal hea
5020: 64 65 72 20 6d 61 79 20 62 65 20 72 65 61 64 20  der may be read 
5030: 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61 67 65  or written. Page
5040: 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69 73 20  r.journalOff is 
5050: 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a 2a 20  updated with.** 
5060: 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f 66 66  the new seek off
5070: 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66  set..**.** i.e f
5080: 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69 7a 65  or a sector size
5090: 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49   of 512:.**.** I
50a0: 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20 20 20  nput Offset     
50b0: 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74 20           Output 
50c0: 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d  Offset.** ------
50d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
50f0: 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20 20 20  -.** 0          
5100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30                 0
5110: 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20 20 20  .** 512         
5120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35 31                51
5130: 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20 20 20  2.** 100        
5140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 35                 5
5150: 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20 20 20  12.** 2000      
5160: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5170: 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74  2048.** .*/.stat
5180: 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75 72 6e  ic int seekJourn
5190: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
51a0: 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66 66 73  ger){.  i64 offs
51b0: 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20 63 20  et = 0;.  i64 c 
51c0: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
51d0: 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20 29 7b  lOff;.  if( c ){
51e0: 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20 28 28  .    offset = ((
51f0: 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52  c-1)/JOURNAL_HDR
5200: 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20 31 29  _SZ(pPager) + 1)
5210: 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53   * JOURNAL_HDR_S
5220: 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  Z(pPager);.  }. 
5230: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 25   assert( offset%
5240: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
5250: 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20 20 61  Pager)==0 );.  a
5260: 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e 3d 63  ssert( offset>=c
5270: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 28 6f   );.  assert( (o
5280: 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c  ffset-c)<JOURNAL
5290: 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20  _HDR_SZ(pPager) 
52a0: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
52b0: 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73 65 74  rnalOff = offset
52c0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
52d0: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
52e0: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
52f0: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f  ournalOff);.}../
5300: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5310: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5320: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  en when this rou
5330: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
5340: 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65 61  A journal.** hea
5350: 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52  der (JOURNAL_HDR
5360: 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77 72  _SZ bytes) is wr
5370: 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a  itten into the j
5380: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20 74  ournal file at t
5390: 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c 6f  he.** current lo
53a0: 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68  cation..**.** Th
53b0: 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  e format for the
53c0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
53d0: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  is as follows:.*
53e0: 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61 67  * - 8 bytes: Mag
53f0: 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20 6a  ic identifying j
5400: 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a  ournal format..*
5410: 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75 6d  * - 4 bytes: Num
5420: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
5430: 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d 31  n journal, or -1
5440: 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69 73   no-sync mode is
5450: 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65   on..** - 4 byte
5460: 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65 72  s: Random number
5470: 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20 68   used for page h
5480: 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  ash..** - 4 byte
5490: 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61 62  s: Initial datab
54a0: 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e 0a  ase page count..
54b0: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53 65  ** - 4 bytes: Se
54c0: 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20 62  ctor size used b
54d0: 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  y the process th
54e0: 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a 6f  at wrote this jo
54f0: 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f  urnal..** .** Fo
5500: 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52 4e  llowed by (JOURN
5510: 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29 20  AL_HDR_SZ - 24) 
5520: 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64 20  bytes of unused 
5530: 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  space..*/.static
5540: 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e 61   int writeJourna
5550: 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61 67  lHdr(Pager *pPag
5560: 65 72 29 7b 0a 0a 20 20 69 6e 74 20 72 63 20 3d  er){..  int rc =
5570: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
5580: 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72  pPager);.  if( r
5590: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
55a0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
55b0: 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d 3e 6a  lHdr = pPager->j
55c0: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
55d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
55e0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
55f0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
5600: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5610: 61 6c 48 64 72 3b 0a 20 20 7d 0a 20 20 70 50 61  alHdr;.  }.  pPa
5620: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
5630: 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  += JOURNAL_HDR_S
5640: 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20 2f 2a  Z(pPager);..  /*
5650: 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20   FIX ME: .  **. 
5660: 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66 6f 72   ** Possibly for
5670: 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69 6e 20   a pager not in 
5680: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68  no-sync mode, th
5690: 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69 63 20  e journal magic 
56a0: 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20  should not.  ** 
56b0: 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74 69 6c  be written until
56c0: 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65 64 20   nRec is filled 
56d0: 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20 6e 65  in as part of ne
56e0: 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 29  xt syncJournal()
56f0: 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41 63 74  . .  **.  ** Act
5700: 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68 65 20  ually maybe the 
5710: 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20 68 65  whole journal he
5720: 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65 20 64  ader should be d
5730: 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74 68 61  elayed until tha
5740: 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20 54 68  t.  ** point. Th
5750: 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73 2e 0a  ink about this..
5760: 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c 69    */.  rc = sqli
5770: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
5780: 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61  er->jfd, aJourna
5790: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
57a0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
57b0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
57c0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
57d0: 68 65 20 6e 52 65 63 20 46 69 65 6c 64 2e 20 30  he nRec Field. 0
57e0: 78 46 46 46 46 46 46 46 46 20 66 6f 72 20 6e 6f  xFFFFFFFF for no
57f0: 2d 73 79 6e 63 20 6a 6f 75 72 6e 61 6c 73 2e 20  -sync journals. 
5800: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
5810: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5820: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  >jfd, pPager->no
5830: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
5840: 66 20 3a 20 30 29 3b 0a 20 20 7d 0a 20 20 69 66  f : 0);.  }.  if
5850: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
5860: 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 61  ){.    /* The ra
5870: 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61 73 68 20  ndom check-hash 
5880: 69 6e 69 74 69 61 6c 69 73 65 72 20 2a 2f 20 0a  initialiser */ .
5890: 20 20 20 20 73 71 6c 69 74 65 33 52 61 6e 64 6f      sqlite3Rando
58a0: 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50 61  mness(sizeof(pPa
58b0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 2c  ger->cksumInit),
58c0: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
58d0: 6e 69 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 77  nit);.    rc = w
58e0: 72 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67  rite32bits(&pPag
58f0: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5900: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 7d  >cksumInit);.  }
5910: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5920: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
5930: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
5940: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 20 20  ase size */.    
5950: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
5960: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
5970: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 29 3b 0a  Pager->dbSize);.
5980: 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51    }.  if( rc==SQ
5990: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f  LITE_OK ){.    /
59a0: 2a 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65  * The assumed se
59b0: 63 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ctor size for th
59c0: 69 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20  is process */.  
59d0: 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69    rc = write32bi
59e0: 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ts(&pPager->jfd,
59f0: 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53   pPager->sectorS
5a00: 69 7a 65 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  ize);.  }..  /* 
5a10: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  The journal head
5a20: 65 72 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  er has been writ
5a30: 74 65 6e 20 73 75 63 63 65 73 73 66 75 6c 6c 79  ten successfully
5a40: 2e 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  . Seek the journ
5a50: 61 6c 0a 20 20 2a 2a 20 66 69 6c 65 20 64 65 73  al.  ** file des
5a60: 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65 20 65  criptor to the e
5a70: 6e 64 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  nd of the journa
5a80: 6c 20 68 65 61 64 65 72 20 73 65 63 74 6f 72 2e  l header sector.
5a90: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 72 63 3d 3d  .  */.  if( rc==
5aa0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5ab0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
5ac0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5ad0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d  ger->journalOff-
5ae0: 31 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  1);.    rc = sql
5af0: 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61  ite3OsWrite(&pPa
5b00: 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30 22  ger->jfd, "\000"
5b10: 2c 20 31 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , 1);.  }.  retu
5b20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5b30: 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  The journal file
5b40: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77 68   must be open wh
5b50: 65 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65  en this is calle
5b60: 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 20 68 65 61  d. A journal hea
5b70: 64 65 72 20 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55  der file.** (JOU
5b80: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
5b90: 73 29 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20  s) is read from 
5ba0: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
5bb0: 74 69 6f 6e 20 69 6e 20 74 68 65 20 6a 6f 75 72  tion in the jour
5bc0: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 2e 20 53 65 65  nal.** file. See
5bd0: 20 63 6f 6d 6d 65 6e 74 73 20 61 62 6f 76 65 20   comments above 
5be0: 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65 4a 6f  function writeJo
5bf0: 75 72 6e 61 6c 48 64 72 28 29 20 66 6f 72 20 61  urnalHdr() for a
5c00: 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 0a   description of.
5c10: 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  ** the journal h
5c20: 65 61 64 65 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a  eader format..**
5c30: 0a 2a 2a 20 49 66 20 74 68 65 20 68 65 61 64 65  .** If the heade
5c40: 72 20 69 73 20 72 65 61 64 20 73 75 63 63 65 73  r is read succes
5c50: 73 66 75 6c 6c 79 2c 20 2a 6e 52 65 63 20 69 73  sfully, *nRec is
5c60: 20 73 65 74 20 74 6f 20 74 68 65 20 6e 75 6d 62   set to the numb
5c70: 65 72 20 6f 66 0a 2a 2a 20 70 61 67 65 20 72 65  er of.** page re
5c80: 63 6f 72 64 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  cords following 
5c90: 74 68 69 73 20 68 65 61 64 65 72 20 61 6e 64 20  this header and 
5ca0: 2a 64 62 53 69 7a 65 20 69 73 20 73 65 74 20 74  *dbSize is set t
5cb0: 6f 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  o the size of th
5cc0: 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 62 65  e.** database be
5cd0: 66 6f 72 65 20 74 68 65 20 74 72 61 6e 73 61 63  fore the transac
5ce0: 74 69 6f 6e 20 62 65 67 61 6e 2c 20 69 6e 20 70  tion began, in p
5cf0: 61 67 65 73 2e 20 41 6c 73 6f 2c 20 70 50 61 67  ages. Also, pPag
5d00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a  er->cksumInit.**
5d10: 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 76   is set to the v
5d20: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
5d30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5d40: 72 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  r. SQLITE_OK is 
5d50: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 69 6e 20 74  returned.** in t
5d60: 68 69 73 20 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20  his case..**.** 
5d70: 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  If the journal h
5d80: 65 61 64 65 72 20 66 69 6c 65 20 61 70 70 65 61  eader file appea
5d90: 72 73 20 74 6f 20 62 65 20 63 6f 72 72 75 70 74  rs to be corrupt
5da0: 65 64 2c 20 53 51 4c 49 54 45 5f 44 4f 4e 45 20  ed, SQLITE_DONE 
5db0: 69 73 0a 2a 2a 20 72 65 74 75 72 6e 65 64 20 61  is.** returned a
5dc0: 6e 64 20 2a 6e 52 65 63 20 61 6e 64 20 2a 64 62  nd *nRec and *db
5dd0: 53 69 7a 65 20 61 72 65 20 6e 6f 74 20 73 65 74  Size are not set
5de0: 2e 20 20 49 66 20 4a 4f 55 52 4e 41 4c 5f 48 44  .  If JOURNAL_HD
5df0: 52 5f 53 5a 20 62 79 74 65 73 0a 2a 2a 20 63 61  R_SZ bytes.** ca
5e00: 6e 6e 6f 74 20 62 65 20 72 65 61 64 20 66 72 6f  nnot be read fro
5e10: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  m the journal fi
5e20: 6c 65 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  le an error code
5e30: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
5e40: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 61 64  .static int read
5e50: 4a 6f 75 72 6e 61 6c 48 64 72 28 0a 20 20 50 61  JournalHdr(.  Pa
5e60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 0a 20 20  ger *pPager, .  
5e70: 69 36 34 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c  i64 journalSize,
5e80: 0a 20 20 75 33 32 20 2a 70 4e 52 65 63 2c 20 0a  .  u32 *pNRec, .
5e90: 20 20 75 33 32 20 2a 70 44 62 53 69 7a 65 0a 29    u32 *pDbSize.)
5ea0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 6e  {.  int rc;.  un
5eb0: 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61 67  signed char aMag
5ec0: 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66 66  ic[8]; /* A buff
5ed0: 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6d  er to hold the m
5ee0: 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a 0a  agic header */..
5ef0: 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e    rc = seekJourn
5f00: 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20  alHdr(pPager);. 
5f10: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
5f20: 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 50 61 67   rc;..  if( pPag
5f30: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a  er->journalOff+J
5f40: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5f50: 61 67 65 72 29 20 3e 20 6a 6f 75 72 6e 61 6c 53  ager) > journalS
5f60: 69 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ize ){.    retur
5f70: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
5f80: 20 7d 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   }..  rc = sqlit
5f90: 65 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72  e3OsRead(&pPager
5fa0: 2d 3e 6a 66 64 2c 20 61 4d 61 67 69 63 2c 20 73  ->jfd, aMagic, s
5fb0: 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 3b 0a  izeof(aMagic));.
5fc0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
5fd0: 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20 6d 65 6d  n rc;..  if( mem
5fe0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
5ff0: 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f  rnalMagic, sizeo
6000: 66 28 61 4d 61 67 69 63 29 29 21 3d 30 20 29 7b  f(aMagic))!=0 ){
6010: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
6020: 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20  TE_DONE;.  }..  
6030: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6040: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 4e  &pPager->jfd, pN
6050: 52 65 63 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Rec);.  if( rc )
6060: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
6070: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 26  c = read32bits(&
6080: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50  pPager->jfd, &pP
6090: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
60a0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
60b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
60c0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
60d0: 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53 69 7a 65  er->jfd, pDbSize
60e0: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
60f0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 55  turn rc;..  /* U
6100: 70 64 61 74 65 20 74 68 65 20 61 73 73 75 6d 65  pdate the assume
6110: 64 20 73 65 63 74 6f 72 2d 73 69 7a 65 20 74 6f  d sector-size to
6120: 20 6d 61 74 63 68 20 74 68 65 20 76 61 6c 75 65   match the value
6130: 20 75 73 65 64 20 62 79 20 0a 20 20 2a 2a 20 74   used by .  ** t
6140: 68 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20  he process that 
6150: 63 72 65 61 74 65 64 20 74 68 69 73 20 6a 6f 75  created this jou
6160: 72 6e 61 6c 2e 20 49 66 20 74 68 69 73 20 6a 6f  rnal. If this jo
6170: 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a 2a 20 63  urnal was.  ** c
6180: 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f 63  reated by a proc
6190: 65 73 73 20 6f 74 68 65 72 20 74 68 61 6e 20 74  ess other than t
61a0: 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e 20 74 68  his one, then th
61b0: 69 73 20 72 6f 75 74 69 6e 65 0a 20 20 2a 2a 20  is routine.  ** 
61c0: 69 73 20 62 65 69 6e 67 20 63 61 6c 6c 65 64 20  is being called 
61d0: 66 72 6f 6d 20 77 69 74 68 69 6e 20 70 61 67 65  from within page
61e0: 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e 20 54 68  r_playback(). Th
61f0: 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65 0a 20 20  e local value.  
6200: 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73 65 63 74  ** of Pager.sect
6210: 6f 72 53 69 7a 65 20 69 73 20 72 65 73 74 6f 72  orSize is restor
6220: 65 64 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ed at the end of
6230: 20 74 68 61 74 20 72 6f 75 74 69 6e 65 2e 0a 20   that routine.. 
6240: 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 33   */.  rc = read3
6250: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6260: 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50 61 67  fd, (u32 *)&pPag
6270: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 3b  er->sectorSize);
6280: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
6290: 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72  rn rc;..  pPager
62a0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
62b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
62c0: 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d 20 73  Pager);.  rc = s
62d0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
62e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
62f0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
6300: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
6310: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68 65  ./*.** Write the
6320: 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65 72   supplied master
6330: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69 6e   journal name in
6340: 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  to the journal f
6350: 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a 2a  ile for pager.**
6360: 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20 63   pPager at the c
6370: 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e  urrent location.
6380: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
6390: 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62 65  nal name must be
63a0: 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68 69   the last.** thi
63b0: 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61 20  ng written to a 
63c0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49 66  journal file. If
63d0: 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
63e0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
63f0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
6400: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6410: 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20 74  is advanced to t
6420: 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62  he next sector b
6430: 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a 2a  oundary before.*
6440: 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77 72  * anything is wr
6450: 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d 61  itten. The forma
6460: 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20  t is:.**.** + 4 
6470: 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a 5f  bytes: PAGER_MJ_
6480: 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74  PGNO..** + N byt
6490: 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d 61  es: length of ma
64a0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
64b0: 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a  e..** + 4 bytes:
64c0: 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a   N.** + 4 bytes:
64d0: 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   Master journal 
64e0: 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a 2a  name checksum..*
64f0: 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a 6f  * + 8 bytes: aJo
6500: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
6510: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
6520: 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65 63  ournal page chec
6530: 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d 20  ksum is the sum 
6540: 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e 20  of the bytes in 
6550: 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f  the master.** jo
6560: 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  urnal name..*/.s
6570: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4d  tatic int writeM
6580: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 50 61 67  asterJournal(Pag
6590: 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e 73  er *pPager, cons
65a0: 74 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29  t char *zMaster)
65b0: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  {.  int rc;.  in
65c0: 74 20 6c 65 6e 3b 20 0a 20 20 69 6e 74 20 69 3b  t len; .  int i;
65d0: 20 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20   .  u32 cksum = 
65e0: 30 3b 20 0a 0a 20 20 69 66 28 20 21 7a 4d 61 73  0; ..  if( !zMas
65f0: 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  ter || pPager->s
6600: 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72 6e  etMaster) return
6610: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50   SQLITE_OK;.  pP
6620: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
6630: 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73 74  = 1;..  len = st
6640: 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a 20  rlen(zMaster);. 
6650: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b   for(i=0; i<len;
6660: 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d   i++){.    cksum
6670: 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a   += zMaster[i];.
6680: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e 20    }..  /* If in 
6690: 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  full-sync mode, 
66a0: 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  advance to the n
66b0: 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72 20  ext disk sector 
66c0: 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a 20  before writing. 
66d0: 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20 6a   ** the master j
66e0: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68 69  ournal name. Thi
66f0: 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68 65  s is in case the
6700: 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20 77   previous page w
6710: 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20 74  ritten to.  ** t
6720: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 61  he journal has a
6730: 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e 63  lready been sync
6740: 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  ed..  */.  if( p
6750: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
6760: 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65 6b  ){.    rc = seek
6770: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
6780: 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  r);.    if( rc!=
6790: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
67a0: 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61  rn rc;.  }.  pPa
67b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
67c0: 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20  += (len+20);..  
67d0: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
67e0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  (&pPager->jfd, P
67f0: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
6800: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
6810: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6820: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6830: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
6840: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61  pPager->jfd, zMa
6850: 73 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  ster, len);.  if
6860: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6870: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6880: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6890: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 6c  (&pPager->jfd, l
68a0: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
68b0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
68c0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72  n rc;..  rc = wr
68d0: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
68e0: 72 2d 3e 6a 66 64 2c 20 63 6b 73 75 6d 29 3b 0a  r->jfd, cksum);.
68f0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
6900: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
6910: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6920: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
6930: 3e 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  >jfd, aJournalMa
6940: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
6950: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 70  rnalMagic));.  p
6960: 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
6970: 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  = 1;.  return rc
6980: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f  ;.}../*.** Add o
6990: 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65 20  r remove a page 
69a0: 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f 66  from the list of
69b0: 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74 20   all pages that 
69c0: 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73 74  are in the.** st
69d0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
69e0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65 72  .**.** The Pager
69f0: 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61 74   keeps a separat
6a00: 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20  e list of pages 
6a10: 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e 74  that are current
6a20: 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74 61  ly in.** the sta
6a30: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20  tement journal. 
6a40: 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65 20   This helps the 
6a50: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d  sqlite3pager_stm
6a60: 74 5f 63 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f  t_commit().** ro
6a70: 75 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66  utine run MUCH f
6a80: 61 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f  aster for the co
6a90: 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20  mmon case where 
6aa0: 74 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a  there are many.*
6ab0: 2a 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72  * pages in memor
6ac0: 79 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77  y but only a few
6ad0: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
6ae0: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  ement journal..*
6af0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
6b00: 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
6b10: 69 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ist(PgHdr *pPg){
6b20: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
6b30: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
6b40: 20 20 69 66 28 20 70 50 67 2d 3e 69 6e 53 74 6d    if( pPg->inStm
6b50: 74 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  t ) return;.  as
6b60: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76  sert( pPg->pPrev
6b70: 53 74 6d 74 3d 3d 30 20 26 26 20 70 50 67 2d 3e  Stmt==0 && pPg->
6b80: 70 4e 65 78 74 53 74 6d 74 3d 3d 30 20 29 3b 0a  pNextStmt==0 );.
6b90: 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74    pPg->pPrevStmt
6ba0: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
6bb0: 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  er->pStmt ){.   
6bc0: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2d 3e   pPager->pStmt->
6bd0: 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 3b  pPrevStmt = pPg;
6be0: 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
6bf0: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
6c00: 70 53 74 6d 74 3b 0a 20 20 70 50 61 67 65 72 2d  pStmt;.  pPager-
6c10: 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20  >pStmt = pPg;.  
6c20: 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 31 3b  pPg->inStmt = 1;
6c30: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  .}.static void p
6c40: 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f  age_remove_from_
6c50: 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20  stmt_list(PgHdr 
6c60: 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 21 70 50  *pPg){.  if( !pP
6c70: 67 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75  g->inStmt ) retu
6c80: 72 6e 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70  rn;.  if( pPg->p
6c90: 50 72 65 76 53 74 6d 74 20 29 7b 0a 20 20 20 20  PrevStmt ){.    
6ca0: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 50 72  assert( pPg->pPr
6cb0: 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d  evStmt->pNextStm
6cc0: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
6cd0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e  g->pPrevStmt->pN
6ce0: 65 78 74 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  extStmt = pPg->p
6cf0: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 65 6c 73  NextStmt;.  }els
6d00: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
6d10: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d  Pg->pPager->pStm
6d20: 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  t==pPg );.    pP
6d30: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  g->pPager->pStmt
6d40: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
6d50: 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67  t;.  }.  if( pPg
6d60: 2d 3e 70 4e 65 78 74 53 74 6d 74 20 29 7b 0a 20  ->pNextStmt ){. 
6d70: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
6d80: 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72 65 76  pNextStmt->pPrev
6d90: 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20  Stmt==pPg );.   
6da0: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d   pPg->pNextStmt-
6db0: 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
6dc0: 2d 3e 70 50 72 65 76 53 74 6d 74 3b 0a 20 20 7d  ->pPrevStmt;.  }
6dd0: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
6de0: 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 50  t = 0;.  pPg->pP
6df0: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70  revStmt = 0;.  p
6e00: 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b 0a  Pg->inStmt = 0;.
6e10: 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20  }../*.** Find a 
6e20: 70 61 67 65 20 69 6e 20 74 68 65 20 68 61 73 68  page in the hash
6e30: 20 74 61 62 6c 65 20 67 69 76 65 6e 20 69 74 73   table given its
6e40: 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20 20 52   page number.  R
6e50: 65 74 75 72 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74  eturn.** a point
6e60: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 6f  er to the page o
6e70: 72 20 4e 55 4c 4c 20 69 66 20 6e 6f 74 20 66 6f  r NULL if not fo
6e80: 75 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50  und..*/.static P
6e90: 67 48 64 72 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b  gHdr *pager_look
6ea0: 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
6eb0: 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
6ec0: 50 67 48 64 72 20 2a 70 20 3d 20 70 50 61 67 65  PgHdr *p = pPage
6ed0: 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72 5f 68  r->aHash[pager_h
6ee0: 61 73 68 28 70 67 6e 6f 29 5d 3b 0a 20 20 77 68  ash(pgno)];.  wh
6ef0: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 70 67 6e  ile( p && p->pgn
6f00: 6f 21 3d 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70  o!=pgno ){.    p
6f10: 20 3d 20 70 2d 3e 70 4e 65 78 74 48 61 73 68 3b   = p->pNextHash;
6f20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b  .  }.  return p;
6f30: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b  .}../*.** Unlock
6f40: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
6f50: 64 20 63 6c 65 61 72 20 74 68 65 20 69 6e 2d 6d  d clear the in-m
6f60: 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 54 68  emory cache.  Th
6f70: 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 73 65  is routine.** se
6f80: 74 73 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  ts the state of 
6f90: 74 68 65 20 70 61 67 65 72 20 62 61 63 6b 20 74  the pager back t
6fa0: 6f 20 77 68 61 74 20 69 74 20 77 61 73 20 77 68  o what it was wh
6fb0: 65 6e 20 69 74 20 77 61 73 20 66 69 72 73 74 0a  en it was first.
6fc0: 2a 2a 20 6f 70 65 6e 65 64 2e 20 20 41 6e 79 20  ** opened.  Any 
6fd0: 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67 65  outstanding page
6fe0: 73 20 61 72 65 20 69 6e 76 61 6c 69 64 61 74 65  s are invalidate
6ff0: 64 20 61 6e 64 20 73 75 62 73 65 71 75 65 6e 74  d and subsequent
7000: 20 61 74 74 65 6d 70 74 73 0a 2a 2a 20 74 6f 20   attempts.** to 
7010: 61 63 63 65 73 73 20 74 68 6f 73 65 20 70 61 67  access those pag
7020: 65 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72  es will likely r
7030: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
7040: 75 6d 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ump..*/.static v
7050: 6f 69 64 20 70 61 67 65 72 5f 72 65 73 65 74 28  oid pager_reset(
7060: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
7070: 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
7080: 4e 65 78 74 3b 0a 20 20 66 6f 72 28 70 50 67 3d  Next;.  for(pPg=
7090: 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50  pPager->pAll; pP
70a0: 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20  g; pPg=pNext){. 
70b0: 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d 3e     pNext = pPg->
70c0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73 71  pNextAll;.    sq
70d0: 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a 20  liteFree(pPg);. 
70e0: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69   }.  pPager->pFi
70f0: 72 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  rst = 0;.  pPage
7100: 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20  r->pFirstSynced 
7110: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7120: 4c 61 73 74 20 3d 20 30 3b 0a 20 20 70 50 61 67  Last = 0;.  pPag
7130: 65 72 2d 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20  er->pAll = 0;.  
7140: 6d 65 6d 73 65 74 28 70 50 61 67 65 72 2d 3e 61  memset(pPager->a
7150: 48 61 73 68 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Hash, 0, sizeof(
7160: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 29 29 3b  pPager->aHash));
7170: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65  .  pPager->nPage
7180: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
7190: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
71a0: 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20  _RESERVED ){.   
71b0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
71c0: 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
71d0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 55    }.  sqlite3OsU
71e0: 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
71f0: 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70  d, NO_LOCK);.  p
7200: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
7210: 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70  AGER_UNLOCK;.  p
7220: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
7230: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52  -1;.  pPager->nR
7240: 65 66 20 3d 20 30 3b 0a 20 20 61 73 73 65 72 74  ef = 0;.  assert
7250: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
7260: 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f  lOpen==0 );.}../
7270: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69 73 20 72  *.** When this r
7280: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
7290: 2c 20 74 68 65 20 70 61 67 65 72 20 68 61 73 20  , the pager has 
72a0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
72b0: 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20 61 20 52   open and.** a R
72c0: 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
72d0: 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
72e0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 69 73   database.  This
72f0: 20 72 6f 75 74 69 6e 65 20 72 65 6c 65 61 73 65   routine release
7300: 73 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73  s.** the databas
7310: 65 20 6c 6f 63 6b 20 61 6e 64 20 61 63 71 75 69  e lock and acqui
7320: 72 65 73 20 61 20 53 48 41 52 45 44 20 6c 6f 63  res a SHARED loc
7330: 6b 20 69 6e 20 69 74 73 20 70 6c 61 63 65 2e 20  k in its place. 
7340: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   The journal.** 
7350: 66 69 6c 65 20 69 73 20 64 65 6c 65 74 65 64 20  file is deleted 
7360: 61 6e 64 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a  and closed..**.*
7370: 2a 20 54 4f 44 4f 3a 20 43 6f 6e 73 69 64 65 72  * TODO: Consider
7380: 20 6b 65 65 70 69 6e 67 20 74 68 65 20 6a 6f 75   keeping the jou
7390: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 66  rnal file open f
73a0: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64 61 74  or temporary dat
73b0: 61 62 61 73 65 73 2e 0a 2a 2a 20 54 68 69 73 20  abases..** This 
73c0: 6d 69 67 68 74 20 67 69 76 65 20 61 20 70 65 72  might give a per
73d0: 66 6f 72 6d 61 6e 63 65 20 69 6d 70 72 6f 76 65  formance improve
73e0: 6d 65 6e 74 20 6f 6e 20 77 69 6e 64 6f 77 73 20  ment on windows 
73f0: 77 68 65 72 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a  where opening.**
7400: 20 61 20 66 69 6c 65 20 69 73 20 61 6e 20 65 78   a file is an ex
7410: 70 65 6e 73 69 76 65 20 6f 70 65 72 61 74 69 6f  pensive operatio
7420: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
7430: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
7440: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
7450: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
7460: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
7470: 65 72 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20  ert( !MEMDB );. 
7480: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
7490: 74 65 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45  te<PAGER_RESERVE
74a0: 44 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  D ){.    return 
74b0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
74c0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
74d0: 6d 74 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72  mt_commit(pPager
74e0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
74f0: 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
7500: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
7510: 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b 0a  &pPager->stfd);.
7520: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
7530: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  Open = 0;.  }.  
7540: 69 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  if( pPager->jour
7550: 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73  nalOpen ){.    s
7560: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
7570: 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20  Pager->jfd);.   
7580: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
7590: 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 73 71  Open = 0;.    sq
75a0: 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50  lite3OsDelete(pP
75b0: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
75c0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
75d0: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
75e0: 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
75f0: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
7600: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
7610: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
7620: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
7630: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
7640: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
7650: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
7660: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
7670: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
7680: 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
7690: 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b  >dirtyCache = 0;
76a0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  .    pPager->nRe
76b0: 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  c = 0;.  }else{.
76c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
76d0: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 3d 3d  er->dirtyCache==
76e0: 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 75 73 65  0 || pPager->use
76f0: 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
7700: 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
7710: 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72  OsUnlock(&pPager
7720: 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ->fd, SHARED_LOC
7730: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
7740: 61 74 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52  ate = PAGER_SHAR
7750: 45 44 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6f 72  ED;.  pPager->or
7760: 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20 20  igDbSize = 0;.  
7770: 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
7780: 72 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  r = 0;.  return 
7790: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
77a0: 70 75 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pute and return 
77b0: 61 20 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74  a checksum for t
77c0: 68 65 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e  he page of data.
77d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e  .**.** This is n
77e0: 6f 74 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73  ot a real checks
77f0: 75 6d 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c  um.  It is reall
7800: 79 20 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f  y just the sum o
7810: 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d  f the .** random
7820: 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61   initial value a
7830: 6e 64 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  nd the page numb
7840: 65 72 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65  er.  We experime
7850: 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63  nted with.** a c
7860: 68 65 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65  hecksum of the e
7870: 6e 74 69 72 65 20 64 61 74 61 2c 20 62 75 74 20  ntire data, but 
7880: 74 68 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74  that was found t
7890: 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a  o be too slow..*
78a0: 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74  *.** Note that t
78b0: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  he page number i
78c0: 73 20 73 74 6f 72 65 64 20 61 74 20 74 68 65 20  s stored at the 
78d0: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74  beginning of dat
78e0: 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65  a and.** the che
78f0: 63 6b 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20  cksum is stored 
7900: 61 74 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69  at the end.  Thi
7910: 73 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20  s is important. 
7920: 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63   If journal.** c
7930: 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73  orruption occurs
7940: 20 64 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20   due to a power 
7950: 66 61 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73  failure, the mos
7960: 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69  t likely scenari
7970: 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65  o.** is that one
7980: 20 65 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65   end or the othe
7990: 72 20 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20  r of the record 
79a0: 77 69 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e  will be changed.
79b0: 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20    It is.** much 
79c0: 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74  less likely that
79d0: 20 74 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66   the two ends of
79e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63   the journal rec
79f0: 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63  ord will be.** c
7a00: 6f 72 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d  orrect and the m
7a10: 69 64 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74  iddle be corrupt
7a20: 2e 20 20 54 68 75 73 2c 20 74 68 69 73 20 22 63  .  Thus, this "c
7a30: 68 65 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c  hecksum" scheme,
7a40: 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20  .** though fast 
7a50: 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63  and simple, catc
7a60: 68 65 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c  hes the mostly l
7a70: 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f  ikely kind of co
7a80: 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20  rruption..**.** 
7a90: 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65  FIX ME:  Conside
7aa0: 72 20 61 64 64 69 6e 67 20 65 76 65 72 79 20 32  r adding every 2
7ab0: 30 30 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74  00th (or so) byt
7ac0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f  e of the data to
7ad0: 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d   the.** checksum
7ae0: 2e 20 20 54 68 61 74 20 77 61 79 20 69 66 20 61  .  That way if a
7af0: 20 73 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61   single page spa
7b00: 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73  ns 3 or more dis
7b10: 6b 20 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a  k sectors and.**
7b20: 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65   only the middle
7b30: 20 73 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75   sector is corru
7b40: 70 74 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c  pt, we will stil
7b50: 6c 20 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61  l have a reasona
7b60: 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66  ble.** chance of
7b70: 20 66 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65   failing the che
7b80: 63 6b 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64  cksum and thus d
7b90: 65 74 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f  etecting the pro
7ba0: 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  blem..*/.static 
7bb0: 75 33 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28  u32 pager_cksum(
7bc0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
7bd0: 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e 73 74 20  gno pgno, const 
7be0: 63 68 61 72 20 2a 61 44 61 74 61 29 7b 0a 20 20  char *aData){.  
7bf0: 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61 67  u32 cksum = pPag
7c00: 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a 20  er->cksumInit;. 
7c10: 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72 2d   int i = pPager-
7c20: 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a 20  >pageSize-200;. 
7c30: 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a 20   while( i>0 ){. 
7c40: 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61 74     cksum += aDat
7c50: 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20 32  a[i];.    i -= 2
7c60: 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  00;.  }.  return
7c70: 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   cksum;.}../*.**
7c80: 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 70   Read a single p
7c90: 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  age from the jou
7ca0: 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65 6e 65 64  rnal file opened
7cb0: 20 6f 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70   on file descrip
7cc0: 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20 50 6c 61  tor.** jfd.  Pla
7cd0: 79 62 61 63 6b 20 74 68 69 73 20 6f 6e 65 20 70  yback this one p
7ce0: 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73  age..**.** If us
7cf0: 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20 6d 65 61  eCksum==0 it mea
7d00: 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20  ns this journal 
7d10: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 63 68 65  does not use che
7d20: 63 6b 73 75 6d 73 2e 20 20 43 68 65 63 6b 73 75  cksums.  Checksu
7d30: 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74 20 75 73  ms.** are not us
7d40: 65 64 20 69 6e 20 73 74 61 74 65 6d 65 6e 74 20  ed in statement 
7d50: 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61 75 73 65  journals because
7d60: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
7d70: 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65  als do not.** ne
7d80: 65 64 20 74 6f 20 73 75 72 76 69 76 65 20 70 6f  ed to survive po
7d90: 77 65 72 20 66 61 69 6c 75 72 65 73 2e 0a 2a 2f  wer failures..*/
7da0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
7db0: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
7dc0: 61 67 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  age(Pager *pPage
7dd0: 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66 64 2c 20  r, OsFile *jfd, 
7de0: 69 6e 74 20 75 73 65 43 6b 73 75 6d 29 7b 0a 20  int useCksum){. 
7df0: 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48 64 72   int rc;.  PgHdr
7e00: 20 2a 70 50 67 3b 20 20 20 20 20 20 20 20 20 20   *pPg;          
7e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 65           /* An e
7e20: 78 69 73 74 69 6e 67 20 70 61 67 65 20 69 6e 20  xisting page in 
7e30: 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20 20 50  the cache */.  P
7e40: 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20  gno pgno;       
7e50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7e60: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
7e70: 6f 66 20 61 20 70 61 67 65 20 69 6e 20 6a 6f 75  of a page in jou
7e80: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
7e90: 73 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20  sum;            
7ea0: 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b          /* Check
7eb0: 73 75 6d 20 75 73 65 64 20 66 6f 72 20 73 61 6e  sum used for san
7ec0: 69 74 79 20 63 68 65 63 6b 69 6e 67 20 2a 2f 0a  ity checking */.
7ed0: 20 20 75 38 20 61 44 61 74 61 5b 53 51 4c 49 54    u8 aData[SQLIT
7ee0: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 5d  E_MAX_PAGE_SIZE]
7ef0: 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72 61  ;  /* Temp stora
7f00: 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a 2f  ge for a page */
7f10: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7f20: 69 74 73 28 6a 66 64 2c 20 26 70 67 6e 6f 29 3b  its(jfd, &pgno);
7f30: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
7f40: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
7f50: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
7f60: 4f 73 52 65 61 64 28 6a 66 64 2c 20 26 61 44 61  OsRead(jfd, &aDa
7f70: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
7f80: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
7f90: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
7fa0: 75 72 6e 20 72 63 3b 0a 20 20 70 50 61 67 65 72  urn rc;.  pPager
7fb0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20  ->journalOff += 
7fc0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7fd0: 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69   + 4;..  /* Sani
7fe0: 74 79 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 74  ty checking on t
7ff0: 68 65 20 70 61 67 65 2e 20 20 54 68 69 73 20 69  he page.  This i
8000: 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74 61 6e 74  s more important
8010: 20 74 68 61 74 20 49 20 6f 72 69 67 69 6e 61 6c   that I original
8020: 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67 68 74 2e  ly.  ** thought.
8030: 20 20 49 66 20 61 20 70 6f 77 65 72 20 66 61 69    If a power fai
8040: 6c 75 72 65 20 6f 63 63 75 72 73 20 77 68 69 6c  lure occurs whil
8050: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  e the journal is
8060: 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e 2c 0a   being written,.
8070: 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64 20 63 61    ** it could ca
8080: 75 73 65 20 69 6e 76 61 6c 69 64 20 64 61 74 61  use invalid data
8090: 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20 69   to be written i
80a0: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e  nto the journal.
80b0: 20 20 57 65 20 6e 65 65 64 20 74 6f 0a 20 20 2a    We need to.  *
80c0: 2a 20 64 65 74 65 63 74 20 74 68 69 73 20 69 6e  * detect this in
80d0: 76 61 6c 69 64 20 64 61 74 61 20 28 77 69 74 68  valid data (with
80e0: 20 68 69 67 68 20 70 72 6f 62 61 62 69 6c 69 74   high probabilit
80f0: 79 29 20 61 6e 64 20 69 67 6e 6f 72 65 20 69 74  y) and ignore it
8100: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
8110: 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41  o==0 || pgno==PA
8120: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67  GER_MJ_PGNO(pPag
8130: 65 72 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  er) ){.    retur
8140: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
8150: 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f 3e 28 75   }.  if( pgno>(u
8160: 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
8170: 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
8180: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
8190: 20 20 7d 0a 20 20 69 66 28 20 75 73 65 43 6b 73    }.  if( useCks
81a0: 75 6d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 72  um ){.    rc = r
81b0: 65 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26  ead32bits(jfd, &
81c0: 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69 66 28 20  cksum);.    if( 
81d0: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
81e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
81f0: 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a 20 20 20  nalOff += 4;.   
8200: 20 69 66 28 20 70 61 67 65 72 5f 63 6b 73 75 6d   if( pager_cksum
8210: 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 61  (pPager, pgno, a
8220: 44 61 74 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a  Data)!=cksum ){.
8230: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8240: 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a  ITE_DONE;.    }.
8250: 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20 70    }..  assert( p
8260: 50 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41  Pager->state==PA
8270: 47 45 52 5f 52 45 53 45 52 56 45 44 20 7c 7c 20  GER_RESERVED || 
8280: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
8290: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29  AGER_EXCLUSIVE )
82a0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 70  ;..  /* If the p
82b0: 61 67 65 72 20 69 73 20 69 6e 20 52 45 53 45 52  ager is in RESER
82c0: 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 6e 20  VED state, then 
82d0: 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61 20  there must be a 
82e0: 63 6f 70 79 20 6f 66 20 74 68 69 73 0a 20 20 2a  copy of this.  *
82f0: 2a 20 70 61 67 65 20 69 6e 20 74 68 65 20 70 61  * page in the pa
8300: 67 65 72 20 63 61 63 68 65 2e 20 49 6e 20 74 68  ger cache. In th
8310: 69 73 20 63 61 73 65 20 6a 75 73 74 20 75 70 64  is case just upd
8320: 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63 61  ate the pager ca
8330: 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68  che,.  ** not th
8340: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
8350: 20 54 68 65 20 70 61 67 65 20 69 73 20 6c 65 66   The page is lef
8360: 74 20 6d 61 72 6b 65 64 20 64 69 72 74 79 20 69  t marked dirty i
8370: 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 20 20 2a  n this case..  *
8380: 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20 45 58 43  *.  ** If in EXC
8390: 4c 55 53 49 56 45 20 73 74 61 74 65 2c 20 74 68  LUSIVE state, th
83a0: 65 6e 20 77 65 20 75 70 64 61 74 65 20 74 68 65  en we update the
83b0: 20 70 61 67 65 72 20 63 61 63 68 65 20 69 66 20   pager cache if 
83c0: 69 74 20 65 78 69 73 74 73 0a 20 20 2a 2a 20 61  it exists.  ** a
83d0: 6e 64 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  nd the main file
83e0: 2e 20 54 68 65 20 70 61 67 65 20 69 73 20 74 68  . The page is th
83f0: 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74 20 64 69  en marked not di
8400: 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 20  rty..  */.  pPg 
8410: 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
8420: 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
8430: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
8440: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8450: 4c 55 53 49 56 45 20 7c 7c 20 70 50 67 20 29 3b  LUSIVE || pPg );
8460: 0a 20 20 54 52 41 43 45 33 28 22 50 4c 41 59 42  .  TRACE3("PLAYB
8470: 41 43 4b 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ACK %d page %d\n
8480: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
8490: 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  r), pgno);.  if(
84a0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
84b0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
84c0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
84d0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
84e0: 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
84f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8500: 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
8510: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
8520: 65 72 2d 3e 66 64 2c 20 61 44 61 74 61 2c 20 70  er->fd, aData, p
8530: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8540: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 20  ;.  }.  if( pPg 
8550: 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20 70 61 67  ){.    /* No pag
8560: 65 20 73 68 6f 75 6c 64 20 65 76 65 72 20 62 65  e should ever be
8570: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
8580: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
8590: 65 70 74 20 66 6f 72 20 70 61 67 65 0a 20 20 20  ept for page.   
85a0: 20 2a 2a 20 31 20 77 68 69 63 68 20 69 73 20 68   ** 1 which is h
85b0: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
85c0: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
85d0: 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
85e0: 62 61 73 65 0a 20 20 20 20 2a 2a 20 61 63 74 69  base.    ** acti
85f0: 76 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ve..    */.    v
8600: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
8610: 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
8620: 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70 67 6e  f==0 || pPg->pgn
8630: 6f 3d 3d 31 20 29 3b 0a 20 20 20 20 70 44 61 74  o==1 );.    pDat
8640: 61 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  a = PGHDR_TO_DAT
8650: 41 28 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63  A(pPg);.    memc
8660: 70 79 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c  py(pData, aData,
8670: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
8680: 65 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  e);.    if( pPag
8690: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20  er->xDestructor 
86a0: 29 7b 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a  ){  /*** FIX ME:
86b0: 20 20 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65    Should this be
86c0: 20 78 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20   xReinit? ***/. 
86d0: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65       pPager->xDe
86e0: 73 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20  structor(pData, 
86f0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
8700: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8710: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
8720: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20  PAGER_EXCLUSIVE 
8730: 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  ){.      pPg->di
8740: 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
8750: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
8760: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44 45  ;.    }.    CODE
8770: 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
8780: 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a   pPg->pgno, 3);.
8790: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
87a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
87b0: 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74  ter zMaster is t
87c0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73  he name of a mas
87d0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
87e0: 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e  . A single journ
87f0: 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20  al.** file that 
8800: 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65 20  referred to the 
8810: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
8820: 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65 65  ile has just bee
8830: 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a  n rolled back..*
8840: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
8850: 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20 70  hecks if it is p
8860: 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74  ossible to delet
8870: 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  e the master jou
8880: 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e  rnal file,.** an
8890: 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20  d does so if it 
88a0: 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61  is..**.** The ma
88b0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
88c0: 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e  e contains the n
88d0: 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c  ames of all chil
88e0: 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54  d journals..** T
88f0: 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74  o tell if a mast
8900: 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62  er journal can b
8910: 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b  e deleted, check
8920: 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a   to each of the.
8930: 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66  ** children.  If
8940: 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72   all children ar
8950: 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67  e either missing
8960: 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72   or do not refer
8970: 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65   to.** a differe
8980: 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  nt master journa
8990: 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73  l, then this mas
89a0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
89b0: 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73  be deleted..*/.s
89c0: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
89d0: 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20  delmaster(const 
89e0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a  char *zMaster){.
89f0: 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
8a00: 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b  master_open = 0;
8a10: 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72  .  OsFile master
8a20: 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65  ;.  char *zMaste
8a30: 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a  rJournal = 0; /*
8a40: 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73   Contents of mas
8a50: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8a60: 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65   */.  i64 nMaste
8a70: 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20  rJournal;       
8a80: 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65  /* Size of maste
8a90: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
8aa0: 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65  /..  /* Open the
8ab0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8ac0: 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79  file exclusively
8ad0: 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74   in case some ot
8ae0: 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a  her process.  **
8af0: 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73   is running this
8b00: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e   routine also. N
8b10: 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73  ot that it makes
8b20: 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72   too much differ
8b30: 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d  ence..  */.  mem
8b40: 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20  set(&master, 0, 
8b50: 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b  sizeof(master));
8b60: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
8b70: 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d  sOpenReadOnly(zM
8b80: 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b  aster, &master);
8b90: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
8ba0: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d  E_OK ) goto delm
8bb0: 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73  aster_out;.  mas
8bc0: 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  ter_open = 1;.  
8bd0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69  rc = sqlite3OsFi
8be0: 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72 2c 20  leSize(&master, 
8bf0: 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  &nMasterJournal)
8c00: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
8c10: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
8c20: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69  master_out;..  i
8c30: 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61  f( nMasterJourna
8c40: 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  l>0 ){.    char 
8c50: 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63  *zJournal;.    c
8c60: 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20  har *zMasterPtr 
8c70: 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61  = 0;..    /* Loa
8c80: 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73  d the entire mas
8c90: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
8ca0: 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61   into space obta
8cb0: 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a  ined from.    **
8cc0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20   sqliteMalloc() 
8cd0: 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62  and pointed to b
8ce0: 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  y zMasterJournal
8cf0: 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d  . .    */.    zM
8d00: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28  asterJournal = (
8d10: 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c  char *)sqliteMal
8d20: 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  loc(nMasterJourn
8d30: 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d  al);.    if( !zM
8d40: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a  asterJournal ){.
8d50: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
8d60: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67  E_NOMEM;.      g
8d70: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8d80: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
8d90: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
8da0: 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72  &master, zMaster
8db0: 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72  Journal, nMaster
8dc0: 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66  Journal);.    if
8dd0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8de0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
8df0: 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72  _out;..    zJour
8e00: 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75  nal = zMasterJou
8e10: 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28  rnal;.    while(
8e20: 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74   (zJournal-zMast
8e30: 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74  erJournal)<nMast
8e40: 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20  erJournal ){.   
8e50: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73     if( sqlite3Os
8e60: 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72  FileExists(zJour
8e70: 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nal) ){.        
8e80: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f  /* One of the jo
8e90: 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74  urnals pointed t
8ea0: 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72 20  o by the master 
8eb0: 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a  journal exists..
8ec0: 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20          ** Open 
8ed0: 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20  it and check if 
8ee0: 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65  it points at the
8ef0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e   master journal.
8f00: 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73   If.        ** s
8f10: 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75  o, return withou
8f20: 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d  t deleting the m
8f30: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8f40: 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  le..        */. 
8f50: 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f         OsFile jo
8f60: 75 72 6e 61 6c 3b 0a 0a 20 20 20 20 20 20 20 20  urnal;..        
8f70: 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c  memset(&journal,
8f80: 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e   0, sizeof(journ
8f90: 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  al));.        rc
8fa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
8fb0: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
8fc0: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
8fd0: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
8fe0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
8ff0: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9000: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9010: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
9020: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
9030: 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d  al(&journal, &zM
9040: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
9050: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
9060: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
9070: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
9080: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9090: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
90a0: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
90b0: 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  }..        if( z
90c0: 4d 61 73 74 65 72 50 74 72 20 26 26 20 21 73 74  MasterPtr && !st
90d0: 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c  rcmp(zMasterPtr,
90e0: 20 7a 4d 61 73 74 65 72 29 20 29 7b 0a 20 20 20   zMaster) ){.   
90f0: 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76         /* We hav
9100: 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f  e a match. Do no
9110: 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  t delete the mas
9120: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9130: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67  . */.          g
9140: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
9150: 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
9160: 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72     }.      zJour
9170: 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a  nal += (strlen(z
9180: 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20  Journal)+1);.   
9190: 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c 69   }.  }.  .  sqli
91a0: 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61 73  te3OsDelete(zMas
91b0: 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65 72  ter);..delmaster
91c0: 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61 73  _out:.  if( zMas
91d0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
91e0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
91f0: 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  sterJournal);.  
9200: 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65 72  }  .  if( master
9210: 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  _open ){.    sql
9220: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61 73  ite3OsClose(&mas
9230: 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ter);.  }.  retu
9240: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
9250: 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65 20  Make every page 
9260: 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67 72  in the cache agr
9270: 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73 20  ee with what is 
9280: 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74 68  on disk.  In oth
9290: 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65 72  er words,.** rer
92a0: 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f 20  ead the disk to 
92b0: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65 20  reset the state 
92c0: 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a 2a  of the cache..**
92d0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
92e0: 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65 72   is called after
92f0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20 77   a rollback in w
9300: 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68 65  hich some of the
9310: 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a 20   dirty cache.** 
9320: 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72 20  pages had never 
9330: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75 74  been written out
9340: 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e 65   to disk.  We ne
9350: 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b 20  ed to roll back 
9360: 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f 6e  the.** cache con
9370: 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61 73  tent and the eas
9380: 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20 74  iest way to do t
9390: 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61 64  hat is to reread
93a0: 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e 74   the old content
93b0: 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74 68  .** back from th
93c0: 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e disk..*/.stati
93d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c 6f  c int pager_relo
93e0: 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20 2a  ad_cache(Pager *
93f0: 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
9400: 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20   *pPg;.  int rc 
9410: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 66  = SQLITE_OK;.  f
9420: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
9430: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
9440: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
9450: 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c 49    char zBuf[SQLI
9460: 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45  TE_MAX_PAGE_SIZE
9470: 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  ];.    if( !pPg-
9480: 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e 75  >dirty ) continu
9490: 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74 29  e;.    if( (int)
94a0: 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61  pPg->pgno <= pPa
94b0: 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20  ger->origDbSize 
94c0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
94d0: 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
94e0: 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  fd, pPager->page
94f0: 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d 3e  Size*(i64)(pPg->
9500: 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20 20  pgno-1));.      
9510: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
9520: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
9530: 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70 61  zBuf, pPager->pa
9540: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54  geSize);.      T
9550: 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20 25  RACE3("REFETCH %
9560: 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
9570: 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
9580: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  Pg->pgno);.     
9590: 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b 3b   if( rc ) break;
95a0: 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61  .      CODEC(pPa
95b0: 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d 3e  ger, zBuf, pPg->
95c0: 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d 65  pgno, 2);.    }e
95d0: 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  lse{.      memse
95e0: 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67 65  t(zBuf, 0, pPage
95f0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
9600: 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
9610: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d 63  >nRef==0 || memc
9620: 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f 54  mp(zBuf, PGHDR_T
9630: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
9640: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 29  ger->pageSize) )
9650: 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50  {.      memcpy(P
9660: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9670: 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d  ), zBuf, pPager-
9680: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
9690: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 52    if( pPager->xR
96a0: 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20 20  einiter ){.     
96b0: 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e     pPager->xRein
96c0: 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44 41  iter(PGHDR_TO_DA
96d0: 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
96e0: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
96f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
9700: 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f   memset(PGHDR_TO
9710: 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61 67  _EXTRA(pPg, pPag
9720: 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e  er), 0, pPager->
9730: 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20 7d  nExtra);.      }
9740: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
9750: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
9760: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
9770: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
9780: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  c;.}../*.** Trun
9790: 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69  cate the main fi
97a0: 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20  le of the given 
97b0: 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d  pager to the num
97c0: 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20  ber of pages.** 
97d0: 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74  indicated..*/.st
97e0: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74  atic int pager_t
97f0: 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70  runcate(Pager *p
9800: 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65  Pager, int nPage
9810: 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  ){.  return sqli
9820: 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70  te3OsTruncate(&p
9830: 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67 65  Pager->fd, pPage
9840: 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36 34  r->pageSize*(i64
9850: 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  )nPage);.}../*.*
9860: 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20 6a  * Playback the j
9870: 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73 20  ournal and thus 
9880: 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74 61  restore the data
9890: 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a 20  base file to.** 
98a0: 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61 73  the state it was
98b0: 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73 74   in before we st
98c0: 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68 61  arted making cha
98d0: 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  nges.  .**.** Th
98e0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66  e journal file f
98f0: 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c 6c  ormat is as foll
9900: 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31 29  ows: .**.**  (1)
9910: 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78 2e    8 byte prefix.
9920: 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f 75    A copy of aJou
9930: 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 20  rnalMagic[]..** 
9940: 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69 67   (2)  4 byte big
9950: 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72 20  -endian integer 
9960: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
9970: 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61 67  ber of valid pag
9980: 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20 20  e records.**    
9990: 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61     in the journa
99a0: 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c 75  l.  If this valu
99b0: 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66 2c  e is 0xffffffff,
99c0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74 68   then compute th
99d0: 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62 65  e.**       numbe
99e0: 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72 64  r of page record
99f0: 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  s from the journ
9a00: 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33 29  al size..**  (3)
9a10: 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64    4 byte big-end
9a20: 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63  ian integer whic
9a30: 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  h is the initial
9a40: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 0a   value for the .
9a50: 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79 20  **       sanity 
9a60: 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28 34  checksum..**  (4
9a70: 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67 65  )  4 byte intege
9a80: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e  r which is the n
9a90: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
9aa0: 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a 2a  o truncate the.*
9ab0: 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65  *       database
9ac0: 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f 6c   to during a rol
9ad0: 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20 20  lback..**  (5)  
9ae0: 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20 77  4 byte integer w
9af0: 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d 62  hich is the numb
9b00: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 74  er of bytes in t
9b10: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
9b20: 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65 2e  l.**       name.
9b30: 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79 20    The value may 
9b40: 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61 74  be zero (indicat
9b50: 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  e that there is 
9b60: 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  no master.**    
9b70: 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a 20     journal.).** 
9b80: 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f 66   (6)  N bytes of
9b90: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
9ba0: 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20 6e  nal name.  The n
9bb0: 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c 2d  ame will be nul-
9bc0: 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20 20  terminated.**   
9bd0: 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62 65      and might be
9be0: 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74 68   shorter than th
9bf0: 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72 6f  e value read fro
9c00: 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20 66  m (5).  If the f
9c10: 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20 20  irst byte.**    
9c20: 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69     of the name i
9c30: 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65 72  s \000 then ther
9c40: 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20 6a  e is no master j
9c50: 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61 73  ournal.  The mas
9c60: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
9c70: 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74 6f  rnal name is sto
9c80: 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a 2a  red in UTF-8..**
9c90: 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20 6d    (7)  Zero or m
9ca0: 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61 6e  ore pages instan
9cb0: 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f 6c  ces, each as fol
9cc0: 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20 20  lows:.**        
9cd0: 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20 6e  +  4 byte page n
9ce0: 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20 20  umber..**       
9cf0: 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65   +  pPager->page
9d00: 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61  Size bytes of da
9d10: 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20  ta..**        + 
9d20: 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75 6d   4 byte checksum
9d30: 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20 73  .**.** When we s
9d40: 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75 72  peak of the jour
9d50: 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20 6d  nal header, we m
9d60: 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36 20  ean the first 6 
9d70: 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a 20  items above..** 
9d80: 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74 68  Each entry in th
9d90: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e 20  e journal is an 
9da0: 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20  instance of the 
9db0: 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a 20  7th item..**.** 
9dc0: 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20 66  Call the value f
9dd0: 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20 62  rom the second b
9de0: 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20 6e  ullet "nRec".  n
9df0: 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62 65  Rec is the numbe
9e00: 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70 61  r of.** valid pa
9e10: 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74 68  ge entries in th
9e20: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6d  e journal.  In m
9e30: 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20 63  ost cases, you c
9e40: 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a  an compute the.*
9e50: 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  * value of nRec 
9e60: 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66  from the size of
9e70: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
9e80: 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f 77  e.  But if a pow
9e90: 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f 63  er.** failure oc
9ea0: 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68 65  curred while the
9eb0: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65 69   journal was bei
9ec0: 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20 63  ng written, it c
9ed0: 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20 63  ould be the.** c
9ee0: 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69 7a  ase that the siz
9ef0: 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e of the journal
9f00: 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61 64   file had alread
9f10: 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65 64  y been increased
9f20: 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74 72   but.** the extr
9f30: 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e 6f  a entries had no
9f40: 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73 61  t yet made it sa
9f50: 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20 49  fely to disk.  I
9f60: 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a 2a  n such a case,.*
9f70: 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e  * the value of n
9f80: 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
9f90: 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65 20  m the file size 
9fa0: 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61 72  would be too lar
9fb0: 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61 74  ge.  For.** that
9fc0: 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77 61   reason, we alwa
9fd0: 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63 20  ys use the nRec 
9fe0: 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65 61  value in the hea
9ff0: 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  der..**.** If th
a000: 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73 20  e nRec value is 
a010: 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d 65  0xffffffff it me
a020: 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73 68  ans that nRec sh
a030: 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65 64  ould be computed
a040: 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  .** from the fil
a050: 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76 61  e size.  This va
a060: 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65 6e  lue is used when
a070: 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63 74   the user select
a080: 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e 63  s the.** no-sync
a090: 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65 20   option for the 
a0a0: 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77 65  journal.  A powe
a0b0: 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64 20  r failure could 
a0c0: 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74 69  lead to corrupti
a0d0: 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63 61  on.** in this ca
a0e0: 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68 69  se.  But for thi
a0f0: 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72 61  ngs like tempora
a100: 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68 20  ry table (which 
a110: 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65 74  will be.** delet
a120: 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77 65  ed when the powe
a130: 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20 77  r is restored) w
a140: 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20 0a  e don't care.  .
a150: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69 6c  **.** If the fil
a160: 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65 20  e opened as the 
a170: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20  journal file is 
a180: 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d 65  not a well-forme
a190: 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  d.** journal fil
a1a0: 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  e then all pages
a1b0: 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73 74   up to the first
a1c0: 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65 20   corrupted page 
a1d0: 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62 61  are rolled.** ba
a1e0: 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73 20  ck (or no pages 
a1f0: 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  if the journal h
a200: 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70 74  eader is corrupt
a210: 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61 6c  ed). The journal
a220: 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65 6e   file.** is then
a230: 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51 4c   deleted and SQL
a240: 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2c  ITE_OK returned,
a250: 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20 63   just as if no c
a260: 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a 2a  orruption had.**
a270: 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72 65   been encountere
a280: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 49  d..**.** If an I
a290: 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20 65  /O or malloc() e
a2a0: 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68 65  rror occurs, the
a2b0: 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69 73   journal-file is
a2c0: 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a 20   not deleted.** 
a2d0: 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64  and an error cod
a2e0: 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  e is returned..*
a2f0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
a300: 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67 65  er_playback(Page
a310: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
a320: 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20 20  4 szJ;          
a330: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
a340: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
a350: 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  le in bytes */. 
a360: 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20 20   u32 nRec;      
a370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
a380: 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 69  ber of Records i
a390: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
a3a0: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
a3b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
a3c0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
a3d0: 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b 20   Pgno mxPg = 0; 
a3e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a            /* Siz
a3f0: 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e 61  e of the origina
a400: 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73 20  l file in pages 
a410: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
a420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a430: 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66 20   Result code of 
a440: 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f 0a  a subroutine */.
a450: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 20    char *zMaster 
a460: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61  = 0;       /* Na
a470: 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75  me of master jou
a480: 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e 79  rnal file if any
a490: 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65   */..  /* Figure
a4a0: 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65   out how many re
a4b0: 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65  cords are in the
a4c0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72 74   journal.  Abort
a4d0: 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20 74   early if.  ** t
a4e0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65 6d  he journal is em
a4f0: 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65  pty..  */.  asse
a500: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
a510: 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20  nalOpen );.  rc 
a520: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
a530: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
a540: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
a550: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
a560: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
a570: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  yback;.  }..  /*
a580: 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65 72   Read the master
a590: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66 72   journal name fr
a5a0: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20  om the journal, 
a5b0: 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  if it is present
a5c0: 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73 74  ..  ** If a mast
a5d0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
a5e0: 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65  name is specifie
a5f0: 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65 20  d, but the file 
a600: 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65 73  is not.  ** pres
a610: 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68 65  ent on disk, the
a620: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73  n the journal is
a630: 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f 65   not hot and doe
a640: 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65  s not need to be
a650: 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61 63  .  ** played bac
a660: 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72  k..  */.  rc = r
a670: 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  eadMasterJournal
a680: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
a690: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73 65  zMaster);.  asse
a6a0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
a6b0: 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63 21  ONE );.  if( rc!
a6c0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28 7a  =SQLITE_OK || (z
a6d0: 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69 74  Master && !sqlit
a6e0: 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28 7a  e3OsFileExists(z
a6f0: 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20 20  Master)) ){.    
a700: 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74  sqliteFree(zMast
a710: 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65 72  er);.    zMaster
a720: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72 63   = 0;.    if( rc
a730: 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
a740: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
a750: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
a760: 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71 6c  yback;.  }.  sql
a770: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
a780: 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 70  er->jfd, 0);.  p
a790: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
a7a0: 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 69  f = 0;..  /* Thi
a7b0: 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74 65  s loop terminate
a7c0: 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74 68  s either when th
a7d0: 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  e readJournalHdr
a7e0: 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73 0a  () call returns.
a7f0: 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e 45    ** SQLITE_DONE
a800: 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72 20   or an IO error 
a810: 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68 69  occurs. */.  whi
a820: 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f 2a  le( 1 ){..    /*
a830: 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20 6a   Read the next j
a840: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 72  ournal header fr
a850: 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  om the journal f
a860: 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20 61  ile.  If there a
a870: 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65 6e  re.    ** not en
a880: 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74 20  ough bytes left 
a890: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  in the journal f
a8a0: 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c 65  ile for a comple
a8b0: 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20 20  te header, or.  
a8c0: 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72 75    ** it is corru
a8d0: 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72 6f  pted, then a pro
a8e0: 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61 69  cess must of fai
a8f0: 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69 6e  led while writin
a900: 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68 69  g it..    ** Thi
a910: 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74 68  s indicates noth
a920: 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20 74  ing more needs t
a930: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
a940: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20  ..    */.    rc 
a950: 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72  = readJournalHdr
a960: 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e  (pPager, szJ, &n
a970: 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20 20  Rec, &mxPg);.   
a980: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
a990: 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66 28  OK ){ .      if(
a9a0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
a9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
a9c0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
a9d0: 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20 65    }.      goto e
a9e0: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
a9f0: 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52   }..    /* If nR
aa00: 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ec is 0xffffffff
aa10: 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75 72  , then this jour
aa20: 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64 20  nal was created 
aa30: 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20 20  by a process.   
aa40: 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20 6e   ** working in n
aa50: 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68 69  o-sync mode. Thi
aa60: 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65  s means that the
aa70: 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f 75   rest of the jou
aa80: 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c 65  rnal.    ** file
aa90: 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61 67   consists of pag
aaa0: 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e 6f  es, there are no
aab0: 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68 65   more journal he
aac0: 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a 20  aders. Compute. 
aad0: 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65 20     ** the value 
aae0: 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f 6e  of nRec based on
aaf0: 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f 6e   this assumption
ab00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ab10: 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66 66   nRec==0xfffffff
ab20: 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  f ){.      asser
ab30: 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  t( pPager->journ
ab40: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
ab50: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b  DR_SZ(pPager) );
ab60: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
ab70: 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  zJ - JOURNAL_HDR
ab80: 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f 55  _SZ(pPager))/JOU
ab90: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
aba0: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
abb0: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
abc0: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
abd0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
abe0: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
abf0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
ac00: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
ac10: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
ac20: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ac30: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
ac40: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
ac50: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
ac60: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ac70: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
ac80: 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6f  ==0 || pPager->o
ac90: 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67 20  rigDbSize==mxPg 
aca0: 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  );.      rc = pa
acb0: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
acc0: 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20  ger, mxPg);.    
acd0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
ace0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 67  _OK ){.        g
acf0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
ad00: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ad10: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
ad20: 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20 20   mxPg;.    }..  
ad30: 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74 65    /* rc = sqlite
ad40: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
ad50: 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48 44  >jfd, JOURNAL_HD
ad60: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20 2a  R_SZ(pPager)); *
ad70: 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  /.    if( rc!=SQ
ad80: 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65  LITE_OK ) goto e
ad90: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 0a  nd_playback;.  .
ada0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67      /* Copy orig
adb0: 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f  inal pages out o
adc0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e  f the journal an
add0: 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20  d back into the 
ade0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
adf0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
ae00: 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b  0; i<nRec; i++){
ae10: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
ae20: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
ae30: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
ae40: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
ae50: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
ae60: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
ae70: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
ae80: 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DONE ){.        
ae90: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
aea0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  ;.          pPag
aeb0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
aec0: 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20 20   szJ;.          
aed0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
aee0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
aef0: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
af00: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
af10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
af20: 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74 20    /* Pages that 
af30: 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74 65  have been writte
af40: 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
af50: 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63 65   but never synce
af60: 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f 74  d.  ** where not
af70: 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68 65   restored by the
af80: 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57 65   loop above.  We
af90: 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72 65   have to restore
afa0: 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67 65   those.  ** page
afb0: 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68 65  s by reading the
afc0: 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  m back from the 
afd0: 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
afe0: 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  e..  */.  assert
aff0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
b000: 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f 61  );.  pager_reloa
b010: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
b020: 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a 0a  ..end_playback:.
b030: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
b040: 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
b050: 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
b060: 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  k(pPager);.  }. 
b070: 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a   if( zMaster ){.
b080: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
b090: 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75  was a master jou
b0a0: 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f  rnal and this ro
b0b0: 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72  utine will retur
b0c0: 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20 73  n true,.    ** s
b0d0: 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73 73  ee if it is poss
b0e0: 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 74  ible to delete t
b0f0: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
b100: 6c 2e 20 49 66 20 65 72 72 6f 72 73 20 0a 20 20  l. If errors .  
b110: 20 20 2a 2a 20 6f 63 63 75 72 20 64 75 72 69 6e    ** occur durin
b120: 67 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c 20  g this process, 
b130: 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20 20 20  ignore them..   
b140: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
b150: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b160: 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74     pager_delmast
b170: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
b180: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
b190: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
b1a0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
b1b0: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
b1c0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
b1d0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
b1e0: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
b1f0: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
b200: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
b210: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
b220: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
b230: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
b240: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
b250: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
b260: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
b270: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
b280: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
b290: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
b2a0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b2b0: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
b2c0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
b2d0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
b2e0: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
b2f0: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
b300: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
b310: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
b320: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
b330: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
b340: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
b350: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
b360: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
b370: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
b380: 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
b390: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
b3a0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
b3b0: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
b3c0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
b3d0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
b3e0: 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
b3f0: 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
b400: 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
b410: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
b420: 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
b430: 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
b440: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
b450: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
b460: 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
b470: 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
b480: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
b490: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
b4a0: 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
b4b0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
b4c0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
b4d0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
b4e0: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
b4f0: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
b500: 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
b510: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
b520: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
b530: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
b540: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
b550: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
b560: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
b570: 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
b580: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
b590: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
b5a0: 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73    {.    i64 os_s
b5b0: 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
b5c0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
b5d0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
b5e0: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
b5f0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
b600: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
b610: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
b620: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
b630: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
b640: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
b650: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a  t to the first j
b660: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
b670: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  itten.  ** this 
b680: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
b690: 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e  ction, or the en
b6a0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
b6b0: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
b6c0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
b6d0: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
b6e0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
b6f0: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
b700: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
b710: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
b720: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
b730: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
b740: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 0a 20 20 2f  szJ;.  }.  ..  /
b750: 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64  * Truncate the d
b760: 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20  atabase back to 
b770: 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  its original siz
b780: 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70  e..  */.  rc = p
b790: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
b7a0: 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73 74  ager, pPager->st
b7b0: 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65  mtSize);.  pPage
b7c0: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
b7d0: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20  er->stmtSize;.. 
b7e0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
b7f0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
b800: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
b810: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20  ment journal..  
b820: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  */.  assert( pPa
b830: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26  ger->stmtInUse &
b840: 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  & pPager->journa
b850: 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74  lOpen );.  sqlit
b860: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
b870: 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52  ->stfd, 0);.  nR
b880: 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ec = pPager->stm
b890: 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43  tNRec;.  .  /* C
b8a0: 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  opy original pag
b8b0: 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73 74  es out of the st
b8c0: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
b8d0: 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68  and back into th
b8e0: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20  e.  ** database 
b8f0: 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61 74  file.  Note that
b900: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
b910: 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65  ournal omits che
b920: 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a  cksums from.  **
b930: 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69 6e   each record sin
b940: 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72 65  ce power-failure
b950: 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f 74   recovery is not
b960: 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73 74   important to st
b970: 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75  atement.  ** jou
b980: 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f  rnals..  */.  fo
b990: 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30  r(i=nRec-1; i>=0
b9a0: 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d  ; i--){.    rc =
b9b0: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
b9c0: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
b9d0: 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20   &pPager->stfd, 
b9e0: 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  0);.    assert( 
b9f0: 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc!=SQLITE_DONE 
ba00: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
ba10: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
ba20: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
ba30: 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77  k;.  }..  /* Now
ba40: 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73   roll some pages
ba50: 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20 74   back from the t
ba60: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
ba70: 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a 53  al. Pager.stmtJS
ba80: 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68 65  ize.  ** was the
ba90: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75   size of the jou
baa0: 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20 74  rnal file when t
bab0: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77 61  his statement wa
bac0: 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20 20  s started, so.  
bad0: 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61 66  ** everything af
bae0: 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20 74  ter that needs t
baf0: 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b  o be rolled back
bb00: 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74 68  , either into th
bb10: 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 2c  e.  ** database,
bb20: 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63 68   the memory cach
bb30: 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a  e, or both..  **
bb40: 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20 6e  .  ** If it is n
bb50: 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61  ot zero, then Pa
bb60: 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20 69  ger.stmtHdrOff i
bb70: 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f 20  s the offset to 
bb80: 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f  the start.  ** o
bb90: 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75 72  f the first jour
bba0: 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74 74  nal header writt
bbb0: 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20 73  en during this s
bbc0: 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61 63  tatement transac
bbd0: 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tion..  */.  rc 
bbe0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
bbf0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
bc00: 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29  ager->stmtJSize)
bc10: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
bc20: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74  TE_OK ){.    got
bc30: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
bc40: 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65  ack;.  }.  pPage
bc50: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
bc60: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
bc70: 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b 73  e;.  pPager->cks
bc80: 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72 2d  umInit = pPager-
bc90: 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73  >stmtCksum;.  as
bca0: 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44  sert( JOURNAL_HD
bcb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70 50  R_SZ(pPager)<(pP
bcc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
bcd0: 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70 50  ) );.  while( pP
bce0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bcf0: 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50 61   <= (hdrOff-(pPa
bd00: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29  ger->pageSize+8)
bd10: 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  ) ){.    rc = pa
bd20: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
bd30: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
bd40: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a  Pager->jfd, 1);.
bd50: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
bd60: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
bd70: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
bd80: 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f  E_OK ) goto end_
bd90: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
bda0: 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50 61   }..  while( pPa
bdb0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
bdc0: 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32  < szJ ){.    u32
bdd0: 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20 64   nRec;.    u32 d
bde0: 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20 72  ummy;.    rc = r
bdf0: 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  eadJournalHdr(pP
be00: 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63  ager, szJ, &nRec
be10: 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69  , &dummy);.    i
be20: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
be30: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
be40: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc!=SQLITE_DON
be50: 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  E );.      goto 
be60: 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63  end_stmt_playbac
be70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  k;.    }.    if(
be80: 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20   nRec==0 ){.    
be90: 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20    nRec = (szJ - 
bea0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
beb0: 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e 70  ff) / (pPager->p
bec0: 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20  ageSize+8);.    
bed0: 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65 63  }.    for(i=nRec
bee0: 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61 67  -1; i>=0 && pPag
bef0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c  er->journalOff <
bf00: 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20   szJ; i--){.    
bf10: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
bf20: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
bf30: 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e  Pager, &pPager->
bf40: 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 61  jfd, 1);.      a
bf50: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
bf60: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
bf70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bf80: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
bf90: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  t_playback;.    
bfa0: 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d  }.  }..  pPager-
bfb0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
bfc0: 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70  J;.  .end_stmt_p
bfd0: 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20 72  layback:.  if( r
bfe0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
bff0: 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
c000: 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
c010: 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72 63  _CORRUPT;.    rc
c020: 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
c030: 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52  T;  /* bkpt-CORR
c040: 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a  UPT */.  }else{.
c050: 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
c060: 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20  nalOff = szJ;.  
c070: 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61    /* pager_reloa
c080: 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  d_cache(pPager);
c090: 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   */.  }.  return
c0a0: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68   rc;.}../*.** Ch
c0b0: 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75 6d  ange the maximum
c0c0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65   number of in-me
c0d0: 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74 20  mory pages that 
c0e0: 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a  are allowed..**.
c0f0: 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e  ** The maximum n
c100: 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62 73  umber is the abs
c110: 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20 74  olute value of t
c120: 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d 65  he mxPage parame
c130: 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67  ter..** If mxPag
c140: 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20 74  e is negative, t
c150: 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69  he noSync flag i
c160: 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53  s also set.  noS
c170: 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a 20  ync bypasses.** 
c180: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33  calls to sqlite3
c190: 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20 70  OsSync().  The p
c1a0: 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20 66  ager runs much f
c1b0: 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79 6e  aster with noSyn
c1c0: 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20  c on,.** but if 
c1d0: 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73 79  the operating sy
c1e0: 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72 20  stem crashes or 
c1f0: 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72 75  there is an abru
c200: 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69  pt power .** fai
c210: 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62 61  lure, the databa
c220: 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62 65  se file might be
c230: 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f   left in an inco
c240: 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20  nsistent and.** 
c250: 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74 61  unrepairable sta
c260: 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71  te.  .*/.void sq
c270: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
c280: 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20 2a  achesize(Pager *
c290: 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50 61  pPager, int mxPa
c2a0: 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61 67  ge){.  if( mxPag
c2b0: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67  e>=0 ){.    pPag
c2c0: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61  er->noSync = pPa
c2d0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
c2e0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e     if( pPager->n
c2f0: 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e  oSync ) pPager->
c300: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20  needSync = 0; . 
c310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
c320: 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a  er->noSync = 1;.
c330: 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78      mxPage = -mx
c340: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Page;.  }.  if( 
c350: 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20 20  mxPage>10 ){.   
c360: 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20   pPager->mxPage 
c370: 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73  = mxPage;.  }els
c380: 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d  e{.    pPager->m
c390: 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a  xPage = 10;.  }.
c3a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20  }../*.** Adjust 
c3b0: 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20 6f  the robustness o
c3c0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74  f the database t
c3d0: 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f 20  o damage due to 
c3e0: 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72  OS crashes.** or
c3f0: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 20   power failures 
c400: 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20  by changing the 
c410: 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73 28  number of syncs(
c420: 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67 0a  )s when writing.
c430: 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20  ** the rollback 
c440: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65 20  journal.  There 
c450: 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c 73  are three levels
c460: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20  :.**.**    OFF  
c470: 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 79       sqlite3OsSy
c480: 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63 61  nc() is never ca
c490: 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20 74  lled.  This is t
c4a0: 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20  he default.**   
c4b0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 74             for t
c4c0: 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72 61  emporary and tra
c4d0: 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a  nsient files..**
c4e0: 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20  .**    NORMAL   
c4f0: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
c500: 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66 6f  synced once befo
c510: 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e 20  re writes begin 
c520: 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  on the.**       
c530: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
c540: 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c    This is normal
c550: 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f 74  ly adequate prot
c560: 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20  ection, but.**  
c570: 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20 69              it i
c580: 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79 20  s theoretically 
c590: 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67 68  possible, though
c5a0: 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a   very unlikely,.
c5b0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c5c0: 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74 75  that an inopertu
c5d0: 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ne power failure
c5e0: 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68 65   could leave the
c5f0: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
c600: 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73 74           in a st
c610: 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64 20  ate which would 
c620: 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f 20  cause damage to 
c630: 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68 65               whe
c650: 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20 62  n it is rolled b
c660: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55  ack..**.**    FU
c670: 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75 72  LL      The jour
c680: 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74 77  nal is synced tw
c690: 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74 65  ice before write
c6a0: 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a  s begin on the.*
c6b0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64  *              d
c6c0: 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73 6f  atabase (with so
c6d0: 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  me additional in
c6e0: 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20  formation - the 
c6f0: 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20  nRec field.**   
c700: 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74 68             of th
c710: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c720: 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e   - being written
c730: 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65 20   in between the 
c740: 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  two.**          
c750: 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66 20      syncs).  If 
c760: 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20 77  we assume that w
c770: 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20  riting a.**     
c780: 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65 20           single 
c790: 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20 61  disk sector is a
c7a0: 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69 73  tomic, then this
c7b0: 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a 2a   mode provides.*
c7c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  *              a
c7d0: 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74 68  ssurance that th
c7e0: 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e  e journal will n
c7f0: 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64 20  ot be corrupted 
c800: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
c810: 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66 20         point of 
c820: 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20 74  causing damage t
c830: 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 64  o the database d
c840: 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a  uring rollback..
c850: 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61  **.** Numeric va
c860: 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  lues associated 
c870: 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74 65  with these state
c880: 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f  s are OFF==1, NO
c890: 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46  RMAL=2,.** and F
c8a0: 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ULL=3..*/.void s
c8b0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
c8c0: 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67  safety_level(Pag
c8d0: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
c8e0: 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72  level){.  pPager
c8f0: 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65  ->noSync =  leve
c900: 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e  l==1 || pPager->
c910: 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67  tempFile;.  pPag
c920: 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c  er->fullSync = l
c930: 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67  evel==3 && !pPag
c940: 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20  er->tempFile;.  
c950: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
c960: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
c970: 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  dSync = 0;.}../*
c980: 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f  .** Open a tempo
c990: 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74  rary file.  Writ
c9a0: 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
c9b0: 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d  e file into zNam
c9c0: 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74  e.** (zName must
c9d0: 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c   be at least SQL
c9e0: 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a  ITE_TEMPNAME_SIZ
c9f0: 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20  E bytes long.)  
ca00: 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c  Write.** the fil
ca10: 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74  e descriptor int
ca20: 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53  o *fd.  Return S
ca30: 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63  QLITE_OK on succ
ca40: 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f  ess or some.** o
ca50: 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20  ther error code 
ca60: 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a  if we fail..**.*
ca70: 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75  * The OS will au
ca80: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65  tomatically dele
ca90: 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  te the temporary
caa0: 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73   file when it is
cab0: 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73  .** closed..*/.s
cac0: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
cad0: 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28  3pager_opentemp(
cae0: 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46  char *zFile, OsF
caf0: 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20  ile *fd){.  int 
cb00: 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72  cnt = 8;.  int r
cb10: 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74  c;.  do{.    cnt
cb20: 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f  --;.    sqlite3O
cb30: 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46  sTempFileName(zF
cb40: 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ile);.    rc = s
cb50: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c  qlite3OsOpenExcl
cb60: 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c  usive(zFile, fd,
cb70: 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63   1);.  }while( c
cb80: 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49  nt>0 && rc!=SQLI
cb90: 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
cba0: 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72  ITE_NOMEM );.  r
cbb0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
cbc0: 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  ** Create a new 
cbd0: 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20 70  page cache and p
cbe0: 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  ut a pointer to 
cbf0: 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20 69  the page cache i
cc00: 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54  n *ppPager..** T
cc10: 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61  he file to be ca
cc20: 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78  ched need not ex
cc30: 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69  ist.  The file i
cc40: 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74  s not locked unt
cc50: 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20  il.** the first 
cc60: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70  call to sqlite3p
cc70: 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69  ager_get() and i
cc80: 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e  s only held open
cc90: 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61   until the.** la
cca0: 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
ccb0: 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65  sed using sqlite
ccc0: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
ccd0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
cce0: 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20  me is NULL then 
ccf0: 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64  a randomly-named
cd00: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20   temporary file 
cd10: 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e  is created.** an
cd20: 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66 69  d used as the fi
cd30: 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e  le to be cached.
cd40: 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20    The file will 
cd50: 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75  be deleted.** au
cd60: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e  tomatically when
cd70: 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a   it is closed..*
cd80: 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d  *.** If zFilenam
cd90: 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20  e is ":memory:" 
cda0: 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61  then all informa
cdb0: 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20  tion is held in 
cdc0: 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20  cache..** It is 
cdd0: 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f  never written to
cde0: 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e   disk.  This can
cdf0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c   be used to impl
ce00: 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d  ement an.** in-m
ce10: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a  emory database..
ce20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ce30: 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65  ger_open(.  Page
ce40: 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20  r **ppPager,    
ce50: 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74       /* Return t
ce60: 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
ce70: 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e  re here */.  con
ce80: 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61  st char *zFilena
ce90: 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me,   /* Name of
cea0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
ceb0: 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20  le to open */.  
cec0: 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20  int nExtra,     
ced0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72           /* Extr
cee0: 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20 74  a bytes append t
cef0: 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79  o each in-memory
cf00: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75   page */.  int u
cf10: 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20  seJournal       
cf20: 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75      /* TRUE to u
cf30: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
cf40: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
cf50: 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72  le */.){.  Pager
cf60: 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72   *pPager;.  char
cf70: 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20   *zFullPathname 
cf80: 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c  = 0;.  int nameL
cf90: 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b  en;.  OsFile fd;
cfa0: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
cfb0: 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a  TE_OK;.  int i;.
cfc0: 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d    int tempFile =
cfd0: 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20   0;.  int memDb 
cfe0: 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f  = 0;.  int readO
cff0: 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  nly = 0;.  char 
d000: 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d  zTemp[SQLITE_TEM
d010: 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20  PNAME_SIZE];..  
d020: 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20  *ppPager = 0;.  
d030: 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73  memset(&fd, 0, s
d040: 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66  izeof(fd));.  if
d050: 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  ( sqlite3_malloc
d060: 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72  _failed ){.    r
d070: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
d080: 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46  EM;.  }.  if( zF
d090: 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65  ilename && zFile
d0a0: 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64  name[0] ){.#ifnd
d0b0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d  ef SQLITE_OMIT_M
d0c0: 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20  EMORYDB.    if( 
d0d0: 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65  strcmp(zFilename
d0e0: 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20  ,":memory:")==0 
d0f0: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d  ){.      memDb =
d100: 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50   1;.      zFullP
d110: 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65  athname = sqlite
d120: 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20  StrDup("");.    
d130: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
d140: 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64  ;.    }else.#end
d150: 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a  if.    {.      z
d160: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
d170: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
d180: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
d190: 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c  .      if( zFull
d1a0: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
d1b0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
d1c0: 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28  OsOpenReadWrite(
d1d0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26  zFullPathname, &
d1e0: 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a  fd, &readOnly);.
d1f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
d200: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
d210: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
d220: 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64  ntemp(zTemp, &fd
d230: 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65  );.    zFilename
d240: 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46   = zTemp;.    zF
d250: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71  ullPathname = sq
d260: 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e  lite3OsFullPathn
d270: 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ame(zFilename);.
d280: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
d290: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74  TE_OK ){.      t
d2a0: 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20  empFile = 1;.   
d2b0: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46   }.  }.  if( !zF
d2c0: 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20  ullPathname ){. 
d2d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
d2e0: 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74 75  e(&fd);.    retu
d2f0: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d300: 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53  .  }.  if( rc!=S
d310: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
d320: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
d330: 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  fd);.    sqliteF
d340: 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ree(zFullPathnam
d350: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  e);.    return r
d360: 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e  c;.  }.  nameLen
d370: 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50   = strlen(zFullP
d380: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
d390: 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  er = sqliteMallo
d3a0: 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65  c( sizeof(*pPage
d3b0: 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b  r) + nameLen*3 +
d3c0: 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61   30 );.  if( pPa
d3d0: 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  ger==0 ){.    sq
d3e0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
d3f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
d400: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
d410: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
d420: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20  ITE_NOMEM;.  }. 
d430: 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64   TRACE3("OPEN %d
d440: 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44   %s\n", FILEHAND
d450: 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50  LEID(fd), zFullP
d460: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67  athname);.  pPag
d470: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20  er->zFilename = 
d480: 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31  (char*)&pPager[1
d490: 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69  ];.  pPager->zDi
d4a0: 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65  rectory = &pPage
d4b0: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d  r->zFilename[nam
d4c0: 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65  eLen+1];.  pPage
d4d0: 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70  r->zJournal = &p
d4e0: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
d4f0: 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20  y[nameLen+1];.  
d500: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
d510: 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50  Filename, zFullP
d520: 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63  athname);.  strc
d530: 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  py(pPager->zDire
d540: 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68  ctory, zFullPath
d550: 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e  name);.  for(i=n
d560: 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70  ameLen; i>0 && p
d570: 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72  Pager->zDirector
d580: 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d  y[i-1]!='/'; i--
d590: 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20  ){}.  if( i>0 ) 
d5a0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
d5b0: 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73  ry[i-1] = 0;.  s
d5c0: 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a  trcpy(pPager->zJ
d5d0: 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74  ournal, zFullPat
d5e0: 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65  hname);.  sqlite
d5f0: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
d600: 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70  me);.  strcpy(&p
d610: 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b  Pager->zJournal[
d620: 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72  nameLen], "-jour
d630: 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d  nal");.  pPager-
d640: 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53  >fd = fd;.#if OS
d650: 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d 3e  _UNIX.  pPager->
d660: 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61 67  fd.pPager = pPag
d670: 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61  er;.#endif.  pPa
d680: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
d690: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d6a0: 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65  useJournal = use
d6b0: 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44  Journal && !memD
d6c0: 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  b;.  pPager->stm
d6d0: 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61  tOpen = 0;.  pPa
d6e0: 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d  ger->stmtInUse =
d6f0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52   0;.  pPager->nR
d700: 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ef = 0;.  pPager
d710: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62  ->dbSize = memDb
d720: 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61  -1;.  pPager->pa
d730: 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f  geSize = SQLITE_
d740: 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a  DEFAULT_PAGE_SIZ
d750: 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41  E;.  pPager->psA
d760: 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41  ligned = FORCE_A
d770: 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d  LIGNMENT(pPager-
d780: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 70 50  >pageSize);.  pP
d790: 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
d7a0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74   0;.  pPager->st
d7b0: 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70  mtJSize = 0;.  p
d7c0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
d7d0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61  ;.  pPager->mxPa
d7e0: 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67  ge = 100;.  pPag
d7f0: 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
d800: 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67  R_UNLOCK;.  pPag
d810: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b  er->errMask = 0;
d820: 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  .  pPager->tempF
d830: 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a  ile = tempFile;.
d840: 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20    pPager->memDb 
d850: 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65  = memDb;.  pPage
d860: 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65  r->readOnly = re
d870: 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72  adOnly;.  pPager
d880: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
d890: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63    pPager->noSync
d8a0: 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46   = pPager->tempF
d8b0: 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e  ile || !useJourn
d8c0: 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75  al;.  pPager->fu
d8d0: 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72  llSync = (pPager
d8e0: 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20  ->noSync?0:1);. 
d8f0: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
d900: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
d910: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
d920: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
d930: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d940: 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41  nExtra = FORCE_A
d950: 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29  LIGNMENT(nExtra)
d960: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74  ;.  pPager->sect
d970: 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53  orSize = PAGER_S
d980: 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50  ECTOR_SIZE;.  pP
d990: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
d9a0: 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74  er = 0;.  memset
d9b0: 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20  (pPager->aHash, 
d9c0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72  0, sizeof(pPager
d9d0: 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70  ->aHash));.  *pp
d9e0: 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a  Pager = pPager;.
d9f0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
da00: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  OK;.}../*.** Set
da10: 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65   the busy handle
da20: 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76  r function..*/.v
da30: 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72  oid sqlite3pager
da40: 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72  _set_busyhandler
da50: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
da60: 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75  BusyHandler *pBu
da70: 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50  syHandler){.  pP
da80: 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
da90: 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65  er = pBusyHandle
daa0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  r;.}../*.** Set 
dab0: 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 66  the destructor f
dac0: 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20  or this pager.  
dad0: 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65  If not NULL, the
dae0: 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20 63   destructor is c
daf0: 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68  alled.** when th
db00: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
db10: 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72  t on each page r
db20: 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68  eaches zero.  Th
db30: 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e  e destructor can
db40: 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63  .** be used to c
db50: 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74  lean up informat
db60: 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61  ion in the extra
db70: 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65   segment appende
db80: 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a  d to each page..
db90: 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75  **.** The destru
dba0: 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c  ctor is not call
dbb0: 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20 73  ed as a result s
dbc0: 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73  qlite3pager_clos
dbd0: 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75  e().  .** Destru
dbe0: 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63  ctors are only c
dbf0: 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33  alled by sqlite3
dc00: 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a  pager_unref()..*
dc10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
dc20: 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74  ger_set_destruct
dc30: 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  or(Pager *pPager
dc40: 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28  , void (*xDesc)(
dc50: 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70  void*,int)){.  p
dc60: 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74  Pager->xDestruct
dc70: 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f  or = xDesc;.}../
dc80: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69  *.** Set the rei
dc90: 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74  nitializer for t
dca0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
dcb0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69  ot NULL, the rei
dcc0: 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73  nitializer.** is
dcd0: 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65   called when the
dce0: 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61   content of a pa
dcf0: 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20 72  ge in cache is r
dd00: 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f  estored to its o
dd10: 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65  riginal.** value
dd20: 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20   as a result of 
dd30: 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65  a rollback.  The
dd40: 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20   callback gives 
dd50: 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64  higher-level cod
dd60: 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e  e.** an opportun
dd70: 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74  ity to restore t
dd80: 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e  he EXTRA section
dd90: 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20 74   to agree with t
dda0: 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70  he restored.** p
ddb0: 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69  age data..*/.voi
ddc0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
ddd0: 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65  et_reiniter(Page
dde0: 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20  r *pPager, void 
ddf0: 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a  (*xReinit)(void*
de00: 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72  ,int)){.  pPager
de10: 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52  ->xReiniter = xR
de20: 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  einit;.}../*.** 
de30: 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69 7a  Set the page siz
de40: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67  e..**.** The pag
de50: 65 20 73 69 7a 65 20 6d 75 73 74 20 6f 6e 6c 79  e size must only
de60: 20 62 65 20 63 68 61 6e 67 65 64 20 77 68 65 6e   be changed when
de70: 20 74 68 65 20 63 61 63 68 65 20 69 73 20 65 6d   the cache is em
de80: 70 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  pty..*/.void sql
de90: 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61  ite3pager_set_pa
dea0: 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50  gesize(Pager *pP
deb0: 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69  ager, int pageSi
dec0: 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ze){.  assert( p
ded0: 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20  ageSize>=512 && 
dee0: 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45  pageSize<=SQLITE
def0: 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29  _MAX_PAGE_SIZE )
df00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
df10: 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b  Size = pageSize;
df20: 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69  .  pPager->psAli
df30: 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49  gned = FORCE_ALI
df40: 47 4e 4d 45 4e 54 28 70 61 67 65 53 69 7a 65 29  GNMENT(pageSize)
df50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20  ;.}../*.** Read 
df60: 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74 65  the first N byte
df70: 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e  s from the begin
df80: 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65  ning of the file
df90: 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20   into memory.** 
dfa0: 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74  that pDest point
dfb0: 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72 6f 72 20  s to.  No error 
dfc0: 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65  checking is done
dfd0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
dfe0: 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65  3pager_read_file
dff0: 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70 50  header(Pager *pP
e000: 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73  ager, int N, uns
e010: 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73  igned char *pDes
e020: 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65  t){.  memset(pDe
e030: 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28  st, 0, N);.  if(
e040: 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20   MEMDB==0 ){.   
e050: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
e060: 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a  pPager->fd, 0);.
e070: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61      sqlite3OsRea
e080: 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70  d(&pPager->fd, p
e090: 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a  Dest, N);.  }.}.
e0a0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
e0b0: 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f  e total number o
e0c0: 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20 64  f pages in the d
e0d0: 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61  isk file associa
e0e0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67  ted with.** pPag
e0f0: 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  er..*/.int sqlit
e100: 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
e110: 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
e120: 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73 73  {.  i64 n;.  ass
e130: 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
e140: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
e150: 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20  dbSize>=0 ){.   
e160: 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
e170: 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66  dbSize;.  }.  if
e180: 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  ( sqlite3OsFileS
e190: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ize(&pPager->fd,
e1a0: 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   &n)!=SQLITE_OK 
e1b0: 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65  ){.    pPager->e
e1c0: 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f  rrMask |= PAGER_
e1d0: 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65  ERR_DISK;.    re
e1e0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20  turn 0;.  }.  n 
e1f0: 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  /= pPager->pageS
e200: 69 7a 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44  ize;.  if( !MEMD
e210: 42 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f  B && n==PENDING_
e220: 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
e230: 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b 2b  eSize ){.    n++
e240: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
e250: 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52  er->state!=PAGER
e260: 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70  _UNLOCK ){.    p
e270: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
e280: 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  n;.  }.  return 
e290: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77  n;.}../*.** Forw
e2a0: 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a  ard declaration.
e2b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79  */.static int sy
e2c0: 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a  ncJournal(Pager*
e2d0: 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e  );.../*.** Unlin
e2e0: 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20  k pPg from it's 
e2f0: 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f  hash chain. Also
e300: 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e 75   set the page nu
e310: 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64  mber to 0 to ind
e320: 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68  icate.** that th
e330: 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61  e page is not pa
e340: 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63  rt of any hash c
e350: 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65  hain. This is re
e360: 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20 74  quired because t
e370: 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67  he.** sqlite3pag
e380: 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f  er_movepage() ro
e390: 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20  utine can leave 
e3a0: 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a  a page in the .*
e3b0: 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65  * pNextFree/pPre
e3c0: 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74 20  vFree list that 
e3d0: 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66  is not a part of
e3e0: 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e   any hash-chain.
e3f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
e400: 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
e410: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
e420: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
e430: 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29  ( pPg->pgno==0 )
e440: 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20  {.    /* If the 
e450: 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a  page number is z
e460: 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70  ero, then this p
e470: 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e  age is not in an
e480: 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f  y hash chain. */
e490: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
e4a0: 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78  .  if( pPg->pNex
e4b0: 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67  tHash ){.    pPg
e4c0: 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72  ->pNextHash->pPr
e4d0: 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50  evHash = pPg->pP
e4e0: 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69  revHash;.  }.  i
e4f0: 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  f( pPg->pPrevHas
e500: 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  h ){.    assert(
e510: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70   pPager->aHash[p
e520: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
e530: 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20  gno)]!=pPg );.  
e540: 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68    pPg->pPrevHash
e550: 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
e560: 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20  g->pNextHash;.  
e570: 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68  }else{.    int h
e580: 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 50   = pager_hash(pP
e590: 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73  g->pgno);.    as
e5a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48  sert( pPager->aH
e5b0: 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20  ash[h]==pPg );. 
e5c0: 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68     pPager->aHash
e5d0: 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  [h] = pPg->pNext
e5e0: 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50 67  Hash;.  }..  pPg
e5f0: 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50  ->pgno = 0;.  pP
e600: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  g->pNextHash = p
e610: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
e620: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  0;.}../*.** Unli
e630: 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74  nk a page from t
e640: 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74 68  he free list (th
e650: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61  e list of all pa
e660: 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d  ges where nRef==
e670: 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69  0).** and from i
e680: 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f  ts hash collisio
e690: 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74  n chain..*/.stat
e6a0: 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61  ic void unlinkPa
e6b0: 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  ge(PgHdr *pPg){.
e6c0: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
e6d0: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a  = pPg->pPager;..
e6e0: 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46    /* Keep the pF
e6f0: 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74  irstSynced point
e700: 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74  er pointing at t
e710: 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f  he first synchro
e720: 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20  nized page */.  
e730: 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d  if( pPg==pPager-
e740: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
e750: 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20  .    PgHdr *p = 
e760: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
e770: 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26 20      while( p && 
e780: 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70  p->needSync ){ p
e790: 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b   = p->pNextFree;
e7a0: 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
e7b0: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b  FirstSynced = p;
e7c0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e  .  }..  /* Unlin
e7d0: 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c  k from the freel
e7e0: 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  ist */.  if( pPg
e7f0: 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20  ->pPrevFree ){. 
e800: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
e810: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
e820: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
e830: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
e840: 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
e850: 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  st==pPg );.    p
e860: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
e870: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
e880: 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70    }.  if( pPg->p
e890: 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20  NextFree ){.    
e8a0: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e  pPg->pNextFree->
e8b0: 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d  pPrevFree = pPg-
e8c0: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65  >pPrevFree;.  }e
e8d0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
e8e0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d   pPager->pLast==
e8f0: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
e900: 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e  r->pLast = pPg->
e910: 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20  pPrevFree;.  }. 
e920: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
e930: 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  = pPg->pPrevFree
e940: 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69   = 0;..  /* Unli
e950: 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f  nk from the pgno
e960: 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20   hash table */. 
e970: 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
e980: 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d  (pPager, pPg);.}
e990: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e9a0: 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f 20  tine is used to 
e9b0: 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d 6d  truncate an in-m
e9c0: 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 20  emory database. 
e9d0: 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20 70   Delete.** all p
e9e0: 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f 20  ages whose pgno 
e9f0: 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70  is larger than p
ea00: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 6e  Pager->dbSize an
ea10: 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63 65  d is unreference
ea20: 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65 64  d..** Referenced
ea30: 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74 68   pages larger th
ea40: 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  an pPager->dbSiz
ea50: 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2f  e are zeroed..*/
ea60: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65 6d  .static void mem
ea70: 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67 65  oryTruncate(Page
ea80: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
ea90: 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48 64  Hdr *pPg;.  PgHd
eaa0: 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74 20  r **ppPg;.  int 
eab0: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
eac0: 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50 67  >dbSize;..  ppPg
ead0: 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c 6c   = &pPager->pAll
eae0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67 20  ;.  while( (pPg 
eaf0: 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a 20  = *ppPg)!=0 ){. 
eb00: 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e 6f     if( pPg->pgno
eb10: 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  <=dbSize ){.    
eb20: 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e 70    ppPg = &pPg->p
eb30: 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c  NextAll;.    }el
eb40: 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  se if( pPg->nRef
eb50: 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73  >0 ){.      mems
eb60: 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  et(PGHDR_TO_DATA
eb70: 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65 72  (pPg), 0, pPager
eb80: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
eb90: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
eba0: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
ebb0: 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50 67  lse{.      *ppPg
ebc0: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
ebd0: 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50 61  ;.      unlinkPa
ebe0: 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  ge(pPg);.      s
ebf0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
ec00: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
ec10: 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
ec20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
ec30: 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20 74  te the file to t
ec40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  he number of pag
ec50: 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2f  es specified..*/
ec60: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
ec70: 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65 72  r_truncate(Pager
ec80: 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 6e   *pPager, Pgno n
ec90: 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  Page){.  int rc;
eca0: 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
ecb0: 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  pagecount(pPager
ecc0: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
ecd0: 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20  >errMask!=0 ){. 
ece0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72     rc = pager_er
ecf0: 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
ed00: 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
ed10: 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28  }.  if( nPage>=(
ed20: 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d  unsigned)pPager-
ed30: 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72  >dbSize ){.    r
ed40: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
ed50: 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42  .  }.  if( MEMDB
ed60: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
ed70: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
ed80: 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
ed90: 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
eda0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
edb0: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79 6e  ;.  }.  rc = syn
edc0: 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
edd0: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
ede0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
edf0: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63  urn rc;.  }.  rc
ee00: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
ee10: 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65 29  e(pPager, nPage)
ee20: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
ee30: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50 61  TE_OK ){.    pPa
ee40: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50  ger->dbSize = nP
ee50: 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  age;.  }.  retur
ee60: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  n rc;.}../*.** S
ee70: 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65  hutdown the page
ee80: 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c   cache.  Free al
ee90: 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f  l memory and clo
eea0: 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a  se all files..**
eeb0: 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63  .** If a transac
eec0: 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67  tion was in prog
eed0: 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20 72  ress when this r
eee0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
eef0: 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61  , that.** transa
ef00: 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20  ction is rolled 
ef10: 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74  back.  All outst
ef20: 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72 65  anding pages are
ef30: 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20   invalidated.** 
ef40: 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79  and their memory
ef50: 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20   is freed.  Any 
ef60: 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61  attempt to use a
ef70: 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65 64   page associated
ef80: 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70 61  .** with this pa
ef90: 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20 74  ge cache after t
efa0: 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  his function ret
efb0: 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79  urns will likely
efc0: 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20  .** result in a 
efd0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e 74  coredump..*/.int
efe0: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c   sqlite3pager_cl
eff0: 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ose(Pager *pPage
f000: 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  r){.  PgHdr *pPg
f010: 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69 74  , *pNext;.  swit
f020: 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ch( pPager->stat
f030: 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50 41  e ){.    case PA
f040: 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20 20  GER_RESERVED:.  
f050: 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59 4e    case PAGER_SYN
f060: 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20 50  CED: .    case P
f070: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a 20  AGER_EXCLUSIVE: 
f080: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 70  {.      sqlite3p
f090: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
f0a0: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ager);.      if(
f0b0: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
f0c0: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
f0d0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
f0e0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
f0f0: 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
f100: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
f110: 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  pen==0 );.      
f120: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f130: 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41 52   case PAGER_SHAR
f140: 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ED: {.      if( 
f150: 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
f160: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
f170: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
f180: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  O_LOCK);.      }
f190: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
f1a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
f1b0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e   {.      /* Do n
f1c0: 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  othing */.      
f1d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
f1e0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
f1f0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
f200: 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64 65  g=pNext){.#ifnde
f210: 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66 28  f NDEBUG.    if(
f220: 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
f230: 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
f240: 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
f250: 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
f260: 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70 50       assert( !pP
f270: 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
f280: 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  k );.      asser
f290: 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69 67  t( !pHist->pOrig
f2a0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
f2b0: 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74 20  ( !pHist->pStmt 
f2c0: 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
f2d0: 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67 2d      pNext = pPg-
f2e0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 73  >pNextAll;.    s
f2f0: 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
f300: 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43 4c    }.  TRACE2("CL
f310: 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  OSE %d\n", PAGER
f320: 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 73  ID(pPager));.  s
f330: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70  qlite3OsClose(&p
f340: 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61 73  Pager->fd);.  as
f350: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f  sert( pPager->jo
f360: 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a  urnalOpen==0 );.
f370: 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20    /* Temp files 
f380: 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  are automaticall
f390: 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65  y deleted by the
f3a0: 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61   OS.  ** if( pPa
f3b0: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b  ger->tempFile ){
f3c0: 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f  .  **   sqlite3O
f3d0: 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e  sDelete(pPager->
f3e0: 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a  zFilename);.  **
f3f0: 20 7d 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50   }.  */.  if( pP
f400: 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 21  ager->zFilename!
f410: 3d 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b  =(char*)&pPager[
f420: 31 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  1] ){.    assert
f430: 28 20 30 20 29 3b 20 20 2f 2a 20 43 61 6e 6e 6f  ( 0 );  /* Canno
f440: 74 20 68 61 70 70 65 6e 20 2a 2f 0a 20 20 20 20  t happen */.    
f450: 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
f460: 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  r->zFilename);. 
f470: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
f480: 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b  ager->zJournal);
f490: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
f4a0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
f4b0: 72 79 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ry);.  }.  sqlit
f4c0: 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20  eFree(pPager);. 
f4d0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
f4e0: 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  K;.}../*.** Retu
f4f0: 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  rn the page numb
f500: 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  er for the given
f510: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 50   page data..*/.P
f520: 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72  gno sqlite3pager
f530: 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69 64  _pagenumber(void
f540: 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64   *pData){.  PgHd
f550: 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f 50  r *p = DATA_TO_P
f560: 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 72  GHDR(pData);.  r
f570: 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a 7d  eturn p->pgno;.}
f580: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65  ../*.** The page
f590: 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e 20  _ref() function 
f5a0: 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20 72  increments the r
f5b0: 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66  eference count f
f5c0: 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66  or a page..** If
f5d0: 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75 72   the page is cur
f5e0: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
f5f0: 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66 65  eelist (the refe
f600: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
f610: 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d  ero) then.** rem
f620: 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65 20  ove it from the 
f630: 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  freelist..**.** 
f640: 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73  For non-test sys
f650: 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28 29  tems, page_ref()
f660: 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61 74   is a macro that
f670: 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66   calls _page_ref
f680: 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20  ().** online of 
f690: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
f6a0: 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f  unt is zero.  Fo
f6b0: 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20  r test systems, 
f6c0: 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73  page_ref().** is
f6d0: 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e   a real function
f6e0: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 20   so that we can 
f6f0: 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73 20  set breakpoints 
f700: 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f  and trace it..*/
f710: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70 61  .static void _pa
f720: 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70 50  ge_ref(PgHdr *pP
f730: 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e  g){.  if( pPg->n
f740: 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  Ref==0 ){.    /*
f750: 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75 72   The page is cur
f760: 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66 72  rently on the fr
f770: 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65 20  eelist.  Remove 
f780: 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  it. */.    if( p
f790: 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d  Pg==pPg->pPager-
f7a0: 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b  >pFirstSynced ){
f7b0: 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 20  .      PgHdr *p 
f7c0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
f7d0: 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 70  ;.      while( p
f7e0: 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20   && p->needSync 
f7f0: 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46  ){ p = p->pNextF
f800: 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50 67  ree; }.      pPg
f810: 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ->pPager->pFirst
f820: 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20 20  Synced = p;.    
f830: 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  }.    if( pPg->p
f840: 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
f850: 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
f860: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
f870: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
f880: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
f890: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72  Pg->pPager->pFir
f8a0: 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46  st = pPg->pNextF
f8b0: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ree;.    }.    i
f8c0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
f8d0: 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e  e ){.      pPg->
f8e0: 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76  pNextFree->pPrev
f8f0: 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65  Free = pPg->pPre
f900: 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65  vFree;.    }else
f910: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61  {.      pPg->pPa
f920: 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
f930: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 20  ->pPrevFree;.   
f940: 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67   }.    pPg->pPag
f950: 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a  er->nRef++;.  }.
f960: 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20    pPg->nRef++;. 
f970: 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d   REFINFO(pPg);.}
f980: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 54  .#ifdef SQLITE_T
f990: 45 53 54 0a 20 20 73 74 61 74 69 63 20 76 6f 69  EST.  static voi
f9a0: 64 20 70 61 67 65 5f 72 65 66 28 50 67 48 64 72  d page_ref(PgHdr
f9b0: 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20   *pPg){.    if( 
f9c0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
f9d0: 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28        _page_ref(
f9e0: 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
f9f0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66  .      pPg->nRef
fa00: 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46  ++;.      REFINF
fa10: 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  O(pPg);.    }.  
fa20: 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
fa30: 20 70 61 67 65 5f 72 65 66 28 50 29 20 20 20 28   page_ref(P)   (
fa40: 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61  (P)->nRef==0?_pa
fa50: 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29  ge_ref(P):(void)
fa60: 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e  (P)->nRef++).#en
fa70: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65  dif../*.** Incre
fa80: 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
fa90: 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70  ce count for a p
faa0: 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20  age.  The input 
fab0: 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20  pointer is.** a 
fac0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
fad0: 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69   page data..*/.i
fae0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
faf0: 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ref(void *pData)
fb00: 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
fb10: 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
fb20: 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f 72 65  Data);.  page_re
fb30: 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e  f(pPg);.  return
fb40: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
fb50: 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f  *.** Sync the jo
fb60: 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68 65 72  urnal.  In other
fb70: 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73 75 72   words, make sur
fb80: 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65 73 20  e all the pages 
fb90: 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62 65 65  that have.** bee
fba0: 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  n written to the
fbb0: 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20 61 63   journal have ac
fbc0: 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64 20 74  tually reached t
fbd0: 68 65 20 73 75 72 66 61 63 65 20 6f 66 20 74 68  he surface of th
fbe0: 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74 20 69  e.** disk.  It i
fbf0: 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20 6d 6f  s not safe to mo
fc00: 64 69 66 79 20 74 68 65 20 6f 72 69 67 69 6e 61  dify the origina
fc10: 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  l database file 
fc20: 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a 20 74  until after.** t
fc30: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20 62  he journal has b
fc40: 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49 66 20  een synced.  If 
fc50: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
fc60: 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66 69 65  abase is modifie
fc70: 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68 65 20  d before.** the 
fc80: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
fc90: 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20 66 61  d and a power fa
fca0: 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20 74 68  ilure occurs, th
fcb0: 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75 72 6e  e unsynced journ
fcc0: 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75 6c 64  al.** data would
fcd0: 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77 65 20   be lost and we 
fce0: 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c 65 20  would be unable 
fcf0: 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20 72 6f  to completely ro
fd00: 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20 64 61  llback the.** da
fd10: 74 61 62 61 73 65 20 63 68 61 6e 67 65 73 2e 20  tabase changes. 
fd20: 20 44 61 74 61 62 61 73 65 20 63 6f 72 72 75 70   Database corrup
fd30: 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63 75 72  tion would occur
fd40: 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20 72 6f  ..** .** This ro
fd50: 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64 61 74  utine also updat
fd60: 65 73 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  es the nRec fiel
fd70: 64 20 69 6e 20 74 68 65 20 68 65 61 64 65 72 20  d in the header 
fd80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a  of the journal..
fd90: 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e 74 73  ** (See comments
fda0: 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f 70 6c   on the pager_pl
fdb0: 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65  ayback() routine
fdc0: 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
fdd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a 2a 2a  information.).**
fde0: 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d 6f 64   If the sync mod
fdf0: 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f 20 73  e is FULL, two s
fe00: 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75 72 2e  yncs will occur.
fe10: 20 20 46 69 72 73 74 20 74 68 65 20 77 68 6f 6c    First the whol
fe20: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69 73 20  e journal.** is 
fe30: 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74 68 65  synced, then the
fe40: 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20 75   nRec field is u
fe50: 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61 20 73  pdated, then a s
fe60: 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63 75 72  econd sync occur
fe70: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 65 6d  s..**.** For tem
fe80: 70 6f 72 61 72 79 20 64 61 74 61 62 61 73 65 73  porary databases
fe90: 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65  , we do not care
fea0: 20 69 66 20 77 65 20 61 72 65 20 61 62 6c 65 20   if we are able 
feb0: 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 61  to rollback.** a
fec0: 66 74 65 72 20 61 20 70 6f 77 65 72 20 66 61 69  fter a power fai
fed0: 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20 6f 63  lure, so sync oc
fee0: 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  curs..**.** This
fef0: 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72 73 20   routine clears 
ff00: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 69 65  the needSync fie
ff10: 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61 67 65  ld of every page
ff20: 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20 69 6e   current held in
ff30: 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f 0a 73  .** memory..*/.s
ff40: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
ff50: 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61  urnal(Pager *pPa
ff60: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
ff70: 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  Pg;.  int rc = S
ff80: 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f 2a 20  QLITE_OK;..  /* 
ff90: 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Sync the journal
ffa0: 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79 69 6e   before modifyin
ffb0: 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62  g the main datab
ffc0: 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75 6d 69  ase.  ** (assumi
ffd0: 6e 67 20 74 68 65 72 65 20 69 73 20 61 20 6a 6f  ng there is a jo
ffe0: 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e 65 65  urnal and it nee
fff0: 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65 64 2e  ds to be synced.
10000 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ).  */.  if( pPa
10010 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  ger->needSync ){
10020 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
10030 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
10040 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
10050 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
10060 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73 73 65  );.      /* asse
10070 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  rt( !pPager->noS
10080 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79 6e 63  ync ); // noSync
10090 20 6d 69 67 68 74 20 62 65 20 73 65 74 20 69 66   might be set if
100a0 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20 20 20   synchronous.   
100b0 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e 65 64     ** was turned
100c0 20 6f 66 66 20 61 66 74 65 72 20 74 68 65 20 74   off after the t
100d0 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20 73  ransaction was s
100e0 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65 74 20  tarted.  Ticket 
100f0 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65 66 20  #615 */.#ifndef 
10100 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b 0a 20  NDEBUG.      {. 
10110 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 73         /* Make s
10120 75 72 65 20 74 68 65 20 70 50 61 67 65 72 2d 3e  ure the pPager->
10130 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77 65 20  nRec counter we 
10140 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67 72 65  are keeping agre
10150 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 77 69  es.        ** wi
10160 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f 6d 70  th the nRec comp
10170 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20 73 69  uted from the si
10180 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
10190 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  l file..        
101a0 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34 20 6a  */.        i64 j
101b0 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  Sz;.        rc =
101c0 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69   sqlite3OsFileSi
101d0 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ze(&pPager->jfd,
101e0 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20 20 20   &jSz);.        
101f0 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
10200 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 61  rn rc;.        a
10210 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10220 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a 20 29  ournalOff==jSz )
10230 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  ;.      }.#endif
10240 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20  .      {.       
10250 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20 6e 52   /* Write the nR
10260 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20 74 68  ec value into th
10270 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68  e journal file h
10280 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20 20 20  eader. If in.   
10290 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73 79 6e       ** full-syn
102a0 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c 20 73  chronous mode, s
102b0 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ync the journal 
102c0 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e 73 75  first. This ensu
102d0 72 65 73 20 74 68 61 74 0a 20 20 20 20 20 20 20  res that.       
102e0 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68 61 73   ** all data has
102f0 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68 65 20   really hit the 
10300 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52 65 63  disk before nRec
10310 20 69 73 20 75 70 64 61 74 65 64 20 74 6f 20 6d   is updated to m
10320 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a 20 69  ark.        ** i
10330 74 20 61 73 20 61 20 63 61 6e 64 69 64 61 74 65  t as a candidate
10340 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e 20 0a   for rollback. .
10350 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
10360 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66     if( pPager->f
10370 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20  ullSync ){.     
10380 20 20 20 20 20 54 52 41 43 45 32 28 22 53 59 4e       TRACE2("SYN
10390 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25 64 5c  C journal of %d\
103a0 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
103b0 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er));.          
103c0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79  rc = sqlite3OsSy
103d0 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  nc(&pPager->jfd)
103e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
103f0 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e 20 72  rc!=0 ) return r
10400 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
10410 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65       sqlite3OsSe
10420 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  ek(&pPager->jfd,
10430 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
10440 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
10450 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20  urnalMagic));.  
10460 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
10470 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
10480 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e 52 65  jfd, pPager->nRe
10490 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  c);.        if( 
104a0 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
104b0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
104c0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
104d0 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75  jfd, pPager->jou
104e0 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20 20 20  rnalOff);.      
104f0 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32 28 22  }.      TRACE2("
10500 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20  SYNC journal of 
10510 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
10520 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 72  Pager));.      r
10530 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 79 6e  c = sqlite3OsSyn
10540 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b  c(&pPager->jfd);
10550 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
10560 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
10570 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
10580 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
10590 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
105a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
105b0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
105c0 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
105d0 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
105e0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
105f0 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
10600 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
10610 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
10620 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
10630 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
10640 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
10650 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
10660 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
10670 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
10680 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
10690 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
106a0 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
106b0 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
106c0 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
106d0 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
106e0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
106f0 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
10700 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
10710 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
10720 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
10730 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
10740 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
10750 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
10760 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
10770 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
10780 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
10790 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
107a0 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
107b0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
107c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72   rc;.}../*.** Tr
107d0 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20 6c 6f  y to obtain a lo
107e0 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20 20 49  ck on a file.  I
107f0 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79 20 63  nvoke the busy c
10800 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65 20 6c  allback if the l
10810 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72 65 6e  ock.** is curren
10820 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  tly not availabl
10830 65 2e 20 20 52 65 70 65 61 74 65 20 75 6e 74 69  e.  Repeate unti
10840 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  l the busy callb
10850 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a 20 66  ack returns.** f
10860 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20 74 68  alse or until th
10870 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64 73 2e  e lock succeeds.
10880 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 53 51  .**.** Return SQ
10890 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65  LITE_OK on succe
108a0 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20  ss and an error 
108b0 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e 6e 6f  code if we canno
108c0 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68 65 20  t obtain.** the 
108d0 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lock..*/.static 
108e0 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74 5f 6f  int pager_wait_o
108f0 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70 50  n_lock(Pager *pP
10900 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b 74 79  ager, int lockty
10910 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  pe){.  int rc;. 
10920 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 53   assert( PAGER_S
10930 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c 4f  HARED==SHARED_LO
10940 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  CK );.  assert( 
10950 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d 3d  PAGER_RESERVED==
10960 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29 3b  RESERVED_LOCK );
10970 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
10980 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43 4c  _EXCLUSIVE==EXCL
10990 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20  USIVE_LOCK );.  
109a0 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
109b0 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a 20  e>=locktype ){. 
109c0 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
109d0 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  K;.  }else{.    
109e0 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a 20 20  int busy = 1;.  
109f0 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20    do {.      rc 
10a00 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
10a10 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63  &pPager->fd, loc
10a20 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69  ktype);.    }whi
10a30 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42  le( rc==SQLITE_B
10a40 55 53 59 20 26 26 20 0a 20 20 20 20 20 20 20 20  USY && .        
10a50 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e  pPager->pBusyHan
10a60 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20 20 20  dler && .       
10a70 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61   pPager->pBusyHa
10a80 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26 26 20  ndler->xFunc && 
10a90 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
10aa0 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 78  >pBusyHandler->x
10ab0 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70 42 75  Func(pPager->pBu
10ac0 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72 67 2c  syHandler->pArg,
10ad0 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29 3b 0a   busy++).    );.
10ae0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
10af0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70  TE_OK ){.      p
10b00 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 6c  Pager->state = l
10b10 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d 0a 20  ocktype;.    }. 
10b20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
10b30 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 61  }../*.** Given a
10b40 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73 20 28   list of pages (
10b50 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74 68 65  connected by the
10b60 20 50 67 48 64 72 2e 70 44 69 72 74 79 20 70 6f   PgHdr.pDirty po
10b70 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a 2a 20  inter) write.** 
10b80 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74 68 6f  every one of tho
10b90 73 65 20 70 61 67 65 73 20 6f 75 74 20 74 6f 20  se pages out to 
10ba0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
10bb0 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65 6d 20  e and mark them 
10bc0 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61 6e 2e  all.** as clean.
10bd0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
10be0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
10bf0 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69 73 74  ist(PgHdr *pList
10c00 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  ){.  Pager *pPag
10c10 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
10c20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
10c30 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
10c40 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70 4c 69  ;.  pPager = pLi
10c50 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f  st->pPager;..  /
10c60 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20  * At this point 
10c70 74 68 65 72 65 20 6d 61 79 20 62 65 20 65 69 74  there may be eit
10c80 68 65 72 20 61 20 52 45 53 45 52 56 45 44 20 6f  her a RESERVED o
10c90 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
10ca0 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74   on the.  ** dat
10cb0 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66 20 74  abase file. If t
10cc0 68 65 72 65 20 69 73 20 61 6c 72 65 61 64 79 20  here is already 
10cd0 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  an EXCLUSIVE loc
10ce0 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  k, the following
10cf0 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73  .  ** calls to s
10d00 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29 20 61  qlite3OsLock() a
10d10 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a 2a 0a  re no-ops..  **.
10d20 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68 65 20    ** Moving the 
10d30 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45 52 56  lock from RESERV
10d40 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56 45 20  ED to EXCLUSIVE 
10d50 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c 76 65  actually involve
10d60 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74 68 72  s going.  ** thr
10d70 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d 65 64  ough an intermed
10d80 69 61 74 65 20 73 74 61 74 65 20 50 45 4e 44 49  iate state PENDI
10d90 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e 47 20  NG.   A PENDING 
10da0 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20 6e 65  lock prevents ne
10db0 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73 20 66  w.  ** readers f
10dc0 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20 74 6f  rom attaching to
10dd0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 62 75   the database bu
10de0 74 20 69 73 20 75 6e 73 75 66 66 69 63 69 65 6e  t is unsufficien
10df0 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20 2a 2a  t for us to.  **
10e00 20 77 72 69 74 65 2e 20 20 54 68 65 20 69 64 65   write.  The ide
10e10 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47 20 6c  a of a PENDING l
10e20 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76 65 6e  ock is to preven
10e30 74 20 6e 65 77 20 72 65 61 64 65 72 73 20 66 72  t new readers fr
10e40 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67 20 69  om.  ** coming i
10e50 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69 74 20  n while we wait 
10e60 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72 65 61  for existing rea
10e70 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e 0a 20  ders to clear.. 
10e80 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65 20 74   **.  ** While t
10e90 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 74  he pager is in t
10ea0 68 65 20 52 45 53 45 52 56 45 44 20 73 74 61 74  he RESERVED stat
10eb0 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  e, the original 
10ec0 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a 20 20  database file.  
10ed0 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65 64 20  ** is unchanged 
10ee0 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c 6c 62  and we can rollb
10ef0 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61 76 69  ack without havi
10f00 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b 20 74  ng to playback t
10f10 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20  he.  ** journal 
10f20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
10f30 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  l database file.
10f40 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e 73 69    Once we transi
10f50 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45 58 43  tion to.  ** EXC
10f60 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61 6e 73  LUSIVE, it means
10f70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
10f80 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68 61 6e  le has been chan
10f90 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f 6c 6c  ged and any roll
10fa0 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c 20 72  back.  ** will r
10fb0 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e 61 6c  equire a journal
10fc0 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a 2f 0a   playback..  */.
10fd0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69    rc = pager_wai
10fe0 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72  t_on_lock(pPager
10ff0 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  , EXCLUSIVE_LOCK
11000 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
11010 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
11020 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
11030 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29 7b 0a  while( pList ){.
11040 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73      assert( pLis
11050 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20  t->dirty );.    
11060 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
11070 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c 69 73  Pager->fd, (pLis
11080 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  t->pgno-1)*(i64)
11090 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
110a0 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  );.    /* If the
110b0 72 65 20 61 72 65 20 64 69 72 74 79 20 70 61 67  re are dirty pag
110c0 65 73 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  es in the page c
110d0 61 63 68 65 20 77 69 74 68 20 70 61 67 65 20 6e  ache with page n
110e0 75 6d 62 65 72 73 20 67 72 65 61 74 65 72 0a 20  umbers greater. 
110f0 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72     ** than Pager
11100 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65  .dbSize, this me
11110 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67 65 72  ans sqlite3pager
11120 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61 73 20  _truncate() was 
11130 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a  called to.    **
11140 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65 20 73   make the file s
11150 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d 61 62  maller (presumab
11160 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ly by auto-vacuu
11170 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20  m code). Do not 
11180 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79  write.    ** any
11190 20 73 75 63 68 20 70 61 67 65 73 20 74 6f 20 74   such pages to t
111a0 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  he file..    */.
111b0 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 70      if( pList->p
111c0 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53  gno<=pPager->dbS
111d0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43 4f 44  ize ){.      COD
111e0 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
111f0 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
11200 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 36 29   pList->pgno, 6)
11210 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
11220 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64  STORE %d page %d
11230 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
11240 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e  ger), pList->pgn
11250 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  o);.      rc = s
11260 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
11270 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
11280 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c  _TO_DATA(pList),
11290 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
112a0 65 29 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28  e);.      CODEC(
112b0 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f  pPager, PGHDR_TO
112c0 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c  _DATA(pList), pL
112d0 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  ist->pgno, 0);. 
112e0 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45     }.#ifndef NDE
112f0 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20  BUG.    else{.  
11300 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54      TRACE3("NOST
11310 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e  ORE %d page %d\n
11320 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
11330 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29  r), pList->pgno)
11340 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
11350 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
11360 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74  rn rc;.    pList
11370 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
11380 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e   pList = pList->
11390 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65  pDirty;.  }.  re
113a0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
113b0 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74  }../*.** Collect
113c0 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61 67   every dirty pag
113d0 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20 6c  e into a dirty l
113e0 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  ist and.** retur
113f0 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
11400 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74 20  he head of that 
11410 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65 73  list.  All pages
11420 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65   are.** collecte
11430 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20 61  d even if they a
11440 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e  re still in use.
11450 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
11460 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f   *pager_get_all_
11470 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67 65  dirty_pages(Page
11480 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
11490 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a  Hdr *p, *pList;.
114a0 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66    pList = 0;.  f
114b0 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c  or(p=pPager->pAl
114c0 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74  l; p; p=p->pNext
114d0 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70 2d  All){.    if( p-
114e0 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20  >dirty ){.      
114f0 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69 73  p->pDirty = pLis
11500 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20 3d  t;.      pList =
11510 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   p;.    }.  }.  
11520 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
11530 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
11540 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72   page..**.** A r
11550 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  ead lock on the 
11560 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62 74  disk file is obt
11570 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20 66  ained when the f
11580 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63 71  irst page is acq
11590 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20  uired. .** This 
115a0 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f  read lock is dro
115b0 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c 61  pped when the la
115c0 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65 61  st page is relea
115d0 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65  sed..**.** A _ge
115e0 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20  t works for any 
115f0 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65 61  page number grea
11600 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66 20  ter than 0.  If 
11610 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  the database.** 
11620 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72 20  file is smaller 
11630 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73 74  than the request
11640 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f  ed page, then no
11650 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20   actual disk.** 
11660 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64 20  read occurs and 
11670 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65  the memory image
11680 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73 20   of the page is 
11690 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a  initialized to.*
116a0 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68  * all zeros.  Th
116b0 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70 70  e extra data app
116c0 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65 20  ended to a page 
116d0 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69 61  is always initia
116e0 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f  lized.** to zero
116f0 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  s the first time
11700 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64 65   a page is loade
11710 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a  d into memory..*
11720 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73 69  *.** The acquisi
11730 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c 20  tion might fail 
11740 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61 73  for several reas
11750 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73  ons.  In all cas
11760 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70  es,.** an approp
11770 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64 65  riate error code
11780 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e 64   is returned and
11790 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74 20   *ppPage is set 
117a0 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53  to NULL..**.** S
117b0 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70  ee also sqlite3p
117c0 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20  ager_lookup().  
117d0 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
117e0 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20  e and _lookup() 
117f0 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69  attempt.** to fi
11800 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
11810 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
11820 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20   first.  If the 
11830 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
11840 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79  ady.** in memory
11850 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67  , this routine g
11860 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72  oes to disk to r
11870 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61  ead it in wherea
11880 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a  s _lookup().** j
11890 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20  ust returns 0.  
118a0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71  This routine acq
118b0 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63  uires a read-loc
118c0 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d 65  k the first time
118d0 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f   it.** has to go
118e0 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f   to disk, and co
118f0 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63  uld also playbac
11900 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c  k an old journal
11910 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   if necessary..*
11920 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28  * Since _lookup(
11930 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f 20  ) never goes to 
11940 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20 68  disk, it never h
11950 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20  as to deal with 
11960 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72  locks.** or jour
11970 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e  nal files..*/.in
11980 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67  t sqlite3pager_g
11990 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  et(Pager *pPager
119a0 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69  , Pgno pgno, voi
119b0 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20 50  d **ppPage){.  P
119c0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
119d0 20 72 63 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20   rc;..  /* Make 
119e0 73 75 72 65 20 77 65 20 68 61 76 65 20 6e 6f 74  sure we have not
119f0 20 68 69 74 20 61 6e 79 20 63 72 69 74 69 63 61   hit any critica
11a00 6c 20 65 72 72 6f 72 73 2e 0a 20 20 2a 2f 20 0a  l errors..  */ .
11a10 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
11a20 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  !=0 );.  assert(
11a30 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 20 20 2a 70   pgno!=0 );.  *p
11a40 70 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  pPage = 0;.  if(
11a50 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
11a60 20 26 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46   & ~(PAGER_ERR_F
11a70 55 4c 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ULL) ){.    retu
11a80 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65  rn pager_errcode
11a90 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 0a 20  (pPager);.  }.. 
11aa0 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74   /* If this is t
11ab0 68 65 20 66 69 72 73 74 20 70 61 67 65 20 61 63  he first page ac
11ac0 63 65 73 73 65 64 2c 20 74 68 65 6e 20 67 65 74  cessed, then get
11ad0 20 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 0a 20   a SHARED lock. 
11ae0 20 2a 2a 20 6f 6e 20 74 68 65 20 64 61 74 61 62   ** on the datab
11af0 61 73 65 20 66 69 6c 65 2e 0a 20 20 2a 2f 0a 20  ase file..  */. 
11b00 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65   if( pPager->nRe
11b10 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44 42 20 29  f==0 && !MEMDB )
11b20 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
11b30 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50  _wait_on_lock(pP
11b40 61 67 65 72 2c 20 53 48 41 52 45 44 5f 4c 4f 43  ager, SHARED_LOC
11b50 4b 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  K);.    if( rc!=
11b60 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
11b70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
11b80 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61    }..    /* If a
11b90 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78   journal file ex
11ba0 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65 20  ists, and there 
11bb0 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20 6c  is no RESERVED l
11bc0 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a  ock on the.    *
11bd0 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
11be0 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72 20   then it either 
11bf0 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61 79  needs to be play
11c00 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65 74  ed back or delet
11c10 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
11c20 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  f( pPager->useJo
11c30 75 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20 20  urnal && .      
11c40 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45    sqlite3OsFileE
11c50 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
11c60 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20 20  ournal) &&.     
11c70 20 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68 65     !sqlite3OsChe
11c80 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 26  ckReservedLock(&
11c90 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20 20  pPager->fd) .   
11ca0 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20 72   ){.       int r
11cb0 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47 65  c;..       /* Ge
11cc0 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  t an EXCLUSIVE l
11cd0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62  ock on the datab
11ce0 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68 69  ase file. At thi
11cf0 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20 20  s point it is.  
11d00 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61 6e       ** importan
11d10 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56 45  t that a RESERVE
11d20 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f 62  D lock is not ob
11d30 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77 61  tained on the wa
11d40 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 20  y to the.       
11d50 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
11d60 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20 61  k. If it were, a
11d70 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20 6d  nother process m
11d80 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20 20  ight open the.  
11d90 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65       ** database
11da0 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74 68   file, detect th
11db0 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 2c  e RESERVED lock,
11dc0 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74 68   and conclude th
11dd0 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a  at the.       **
11de0 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61 66   database is saf
11df0 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65 20  e to read while 
11e00 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73 20  this process is 
11e10 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69 74  still rolling it
11e20 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63 6b   .       ** back
11e30 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20 20  ..       ** .   
11e40 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20 74      ** Because t
11e50 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20  he intermediate 
11e60 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73  RESERVED lock is
11e70 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c 20   not requested, 
11e80 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73 65  the.       ** se
11e90 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69 6c  cond process wil
11ea0 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70 6f  l get to this po
11eb0 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65 20  int in the code 
11ec0 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20 20  and fail to.    
11ed0 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27     ** obtain it'
11ee0 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20  s own EXCLUSIVE 
11ef0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
11f00 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20  base file..     
11f10 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
11f20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26   sqlite3OsLock(&
11f30 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c  pPager->fd, EXCL
11f40 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20  USIVE_LOCK);.   
11f50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
11f60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
11f70 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
11f80 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
11f90 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20  O_LOCK);.       
11fa0 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
11fb0 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a  = PAGER_UNLOCK;.
11fc0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
11fd0 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20  rc;.       }.   
11fe0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
11ff0 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
12000 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20  IVE;..       /* 
12010 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  Open the journal
12020 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e 6c   for reading onl
12030 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  y.  Return SQLIT
12040 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20 20  E_BUSY if.      
12050 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62 6c   ** we are unabl
12060 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a 6f  e to open the jo
12070 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20 20  urnal file. .   
12080 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a 2a      **.       **
12090 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
120a0 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64 20  e does not need 
120b0 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74 73  to be locked its
120c0 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20 20  elf.  The.      
120d0 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
120e0 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20 75   is never open u
120f0 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20 64  nless the main d
12100 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f 6c  atabase file hol
12110 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20 77  ds.       ** a w
12120 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74 68  rite lock, so th
12130 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e 79  ere is never any
12140 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20 6f   chance of two o
12150 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a 2a  r more.       **
12160 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e 69   processes openi
12170 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  ng the journal a
12180 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e  t the same time.
12190 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
121a0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
121b0 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50 61  OpenReadOnly(pPa
121c0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
121d0 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
121e0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
121f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12200 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
12210 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
12220 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
12230 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
12240 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
12250 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
12260 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20   SQLITE_BUSY;.  
12270 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
12280 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
12290 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70 50  n = 1;.       pP
122a0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
122b0 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  rted = 0;.      
122c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
122d0 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Off = 0;.       
122e0 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
122f0 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70 50  r = 0;.       pP
12300 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
12310 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f 2a   = 0;..       /*
12320 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64 65   Playback and de
12330 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  lete the journal
12340 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74 61  .  Drop the data
12350 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20 20  base write.     
12360 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72 65    ** lock and re
12370 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61 64  acquire the read
12380 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2f   lock..       */
12390 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  .       rc = pag
123a0 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
123b0 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20  er);.       if( 
123c0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
123d0 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
123e0 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
123f0 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30 3b    }.    pPg = 0;
12400 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
12410 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67 65   Search for page
12420 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20 20   in cache */.   
12430 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
12440 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
12450 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42  );.    if( MEMDB
12460 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61 74   && pPager->stat
12470 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e==PAGER_UNLOCK 
12480 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
12490 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
124a0 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20 7d  HARED;.    }.  }
124b0 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b  .  if( pPg==0 ){
124c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
124d0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e 6f  ested page is no
124e0 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61  t in the page ca
124f0 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20  che. */.    int 
12500 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  h;.    pPager->n
12510 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28 20  Miss++;.    if( 
12520 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70 50  pPager->nPage<pP
12530 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c 20  ager->mxPage || 
12540 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
12550 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20 20  0 || MEMDB ){.  
12560 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61 20      /* Create a 
12570 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20 20  new page */.    
12580 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d 61    pPg = sqliteMa
12590 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
125a0 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d 3e  *pPg) + pPager->
125b0 70 73 41 6c 69 67 6e 65 64 0a 20 20 20 20 20 20  psAligned.      
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66          + sizeof
125e0 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e  (u32) + pPager->
125f0 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20  nExtra.         
12600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12610 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a       + MEMDB*siz
12620 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20 29  eof(PgHistory) )
12630 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  ;.      if( pPg=
12640 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
12650 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
12660 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77 72        pager_unwr
12670 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
12680 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12690 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
126a0 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
126b0 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65 74  MEM;.        ret
126c0 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
126d0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
126e0 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20 73  memset(pPg, 0, s
126f0 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20 20  izeof(*pPg));.  
12700 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
12710 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28  .        memset(
12720 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
12730 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73  g, pPager), 0, s
12740 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29  izeof(PgHistory)
12750 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
12760 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20 70   pPg->pPager = p
12770 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50 67  Pager;.      pPg
12780 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50 61  ->pNextAll = pPa
12790 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20 20  ger->pAll;.     
127a0 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
127b0 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67 65  pPg;.      pPage
127c0 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20 20  r->nPage++;.    
127d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20  }else{.      /* 
127e0 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20 72  Find a page to r
127f0 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f 20  ecycle.  Try to 
12800 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74 68  locate a page th
12810 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20 20  at does not.    
12820 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73 20    ** require us 
12830 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28 29  to do an fsync()
12840 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   on the journal.
12850 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
12860 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46  pPg = pPager->pF
12870 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 20  irstSynced;..   
12880 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75 6c     /* If we coul
12890 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61 67  d not find a pag
128a0 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  e that does not 
128b0 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e 63  require an fsync
128c0 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20 74  ().      ** on t
128d0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
128e0 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20 6a  then fsync the j
128f0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54 68  ournal file.  Th
12900 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a 2a  is is a.      **
12910 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72 61   very slow opera
12920 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72 6b  tion, so we work
12930 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20 69   hard to avoid i
12940 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d 65  t.  But sometime
12950 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63 61  s.      ** it ca
12960 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20  n't be helped.. 
12970 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66       */.      if
12980 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20  ( pPg==0 ){.    
12990 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79 6e      int rc = syn
129a0 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29  cJournal(pPager)
129b0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
129c0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
129d0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
129e0 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
129f0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12a00 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
12a10 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12a20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c   if( pPager->ful
12a30 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  lSync ){.       
12a40 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
12a50 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
12a60 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
12a70 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
12a80 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  .  ** journal fi
12a90 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e 65  le. This is done
12aa0 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20 6d   to avoid ever m
12ab0 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72 6e  odifying a journ
12ac0 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72 20  al..  ** header 
12ad0 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65 64  that is involved
12ae0 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b   in the rollback
12af0 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20 68   of pages that h
12b00 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61 64  ave..  ** alread
12b10 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74  y been written t
12b20 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  o the database (
12b30 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61 64  in case the head
12b40 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61 73  er is..  ** tras
12b50 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52 65  hed when the nRe
12b60 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61 74  c field is updat
12b70 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ed)..          *
12b80 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67  /.          pPag
12b90 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20  er->nRec = 0;.  
12ba0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
12bb0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
12bc0 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
12bd0 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f      rc = writeJo
12be0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
12bf0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
12c00 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  rc!=0 ){.       
12c10 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
12c20 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
12c30 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
12c40 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f  return SQLITE_IO
12c50 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ERR;.          }
12c60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
12c70 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d     pPg = pPager-
12c80 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20 7d  >pFirst;.      }
12c90 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
12ca0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a  Pg->nRef==0 );..
12cb0 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 74        /* Write t
12cc0 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 64  he page to the d
12cd0 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20  atabase file if 
12ce0 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20 20  it is dirty..   
12cf0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
12d00 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
12d10 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
12d20 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
12d30 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 70  ;.        pPg->p
12d40 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  Dirty = 0;.     
12d50 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77 72     rc = pager_wr
12d60 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70 50  ite_pagelist( pP
12d70 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  g );.        if(
12d80 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12d90 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
12da0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
12db0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
12dc0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
12dd0 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
12de0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12df0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
12e00 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20 20  irty==0 );..    
12e10 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
12e20 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69 6e   we are recyclin
12e30 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20 61  g is marked as a
12e40 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74  lwaysRollback, t
12e50 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65 74  hen.      ** set
12e60 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77 61   the global alwa
12e70 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67 2c  ysRollback flag,
12e80 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67 20   thus disabling 
12e90 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  the.      ** sql
12ea0 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ite_dont_rollbac
12eb0 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e  k() optimization
12ec0 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f 66   for the rest of
12ed0 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
12ee0 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20 69  n..      ** It i
12ef0 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  s necessary to d
12f00 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20 74  o this because t
12f10 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20 61  he page marked a
12f20 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20 20  lwaysRollback.  
12f30 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
12f40 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c 61  reloaded at a la
12f50 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74 20  ter time but at 
12f60 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77 6f  that point we wo
12f70 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20 20  n't remember.   
12f80 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77 61     ** that is wa
12f90 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  s marked alwaysR
12fa0 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20 6d  ollback.  This m
12fb0 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70 61  eans that all pa
12fc0 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20 2a  ges must.      *
12fd0 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 61  * be marked as a
12fe0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 72  lwaysRollback fr
12ff0 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e 0a  om here on out..
13000 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
13010 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
13020 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  llback ){.      
13030 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79 73    pPager->always
13040 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20 20  Rollback = 1;.  
13050 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13060 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20 70  Unlink the old p
13070 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65  age from the fre
13080 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20 68  e list and the h
13090 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ash table.      
130a0 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  */.      unlinkP
130b0 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
130c0 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b 3b  pPager->nOvfl++;
130d0 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
130e0 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20  pgno = pgno;.   
130f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
13100 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74 29  Journal && (int)
13110 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  pgno<=pPager->or
13120 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
13130 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d 65    sqlite3CheckMe
13140 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49 6e  mory(pPager->aIn
13150 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29  Journal, pgno/8)
13160 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
13170 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
13180 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50 67  pen );.      pPg
13190 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70  ->inJournal = (p
131a0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
131b0 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c  l[pgno/8] & (1<<
131c0 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20  (pgno&7)))!=0;. 
131d0 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
131e0 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  nc = 0;.    }els
131f0 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  e{.      pPg->in
13200 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20  Journal = 0;.   
13210 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
13220 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
13230 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
13240 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  tmt && (int)pgno
13250 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69  <=pPager->stmtSi
13260 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ze.             
13270 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 53  && (pPager->aInS
13280 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31  tmt[pgno/8] & (1
13290 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 20  <<(pgno&7)))!=0 
132a0 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  ){.      page_ad
132b0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
132c0 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  Pg);.    }else{.
132d0 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f 76        page_remov
132e0 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
132f0 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20  (pPg);.    }.   
13300 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b   pPg->dirty = 0;
13310 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20 3d  .    pPg->nRef =
13320 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f 28   1;.    REFINFO(
13330 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65 72  pPg);.    pPager
13340 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68 20  ->nRef++;.    h 
13350 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e  = pager_hash(pgn
13360 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65  o);.    pPg->pNe
13370 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d  xtHash = pPager-
13380 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 70  >aHash[h];.    p
13390 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
133a0 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70  = pPg;.    if( p
133b0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29 7b  Pg->pNextHash ){
133c0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
133d0 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
133e0 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
133f0 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48       pPg->pNextH
13400 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  ash->pPrevHash =
13410 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
13420 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  if( pPager->nExt
13430 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  ra>0 ){.      me
13440 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45 58  mset(PGHDR_TO_EX
13450 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
13460 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78  , 0, pPager->nEx
13470 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tra);.    }.    
13480 73 71 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67  sqlite3pager_pag
13490 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a  ecount(pPager);.
134a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
134b0 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a 20 20  errMask!=0 ){.  
134c0 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
134d0 5f 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f  _unref(PGHDR_TO_
134e0 44 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20  DATA(pPg));.    
134f0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65 72 72    rc = pager_err
13500 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
13510 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
13520 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61     }.    if( pPa
13530 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28 69 6e 74  ger->dbSize<(int
13540 29 70 67 6e 6f 20 29 7b 0a 20 20 20 20 20 20 6d  )pgno ){.      m
13550 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
13560 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
13570 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
13580 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13590 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 61   int rc;.      a
135a0 73 73 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20  ssert( MEMDB==0 
135b0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
135c0 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
135d0 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36  fd, (pgno-1)*(i6
135e0 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
135f0 7a 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ze);.      rc = 
13600 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
13610 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48 44 52  Pager->fd, PGHDR
13620 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
13630 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
13640 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22  ;.      TRACE3("
13650 46 45 54 43 48 20 25 64 20 70 61 67 65 20 25 64  FETCH %d page %d
13660 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
13670 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ger), pPg->pgno)
13680 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
13690 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44  ager, PGHDR_TO_D
136a0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70  ATA(pPg), pPg->p
136b0 67 6e 6f 2c 20 33 29 3b 0a 20 20 20 20 20 20 69  gno, 3);.      i
136c0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
136d0 20 29 7b 0a 20 20 20 20 20 20 20 20 69 36 34 20   ){.        i64 
136e0 66 69 6c 65 53 69 7a 65 3b 0a 20 20 20 20 20 20  fileSize;.      
136f0 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46    if( sqlite3OsF
13700 69 6c 65 53 69 7a 65 28 26 70 50 61 67 65 72 2d  ileSize(&pPager-
13710 3e 66 64 2c 26 66 69 6c 65 53 69 7a 65 29 21 3d  >fd,&fileSize)!=
13720 53 51 4c 49 54 45 5f 4f 4b 0a 20 20 20 20 20 20  SQLITE_OK.      
13730 20 20 20 20 20 20 20 20 20 7c 7c 20 66 69 6c 65           || file
13740 53 69 7a 65 3e 3d 70 67 6e 6f 2a 70 50 61 67 65  Size>=pgno*pPage
13750 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a 20  r->pageSize ){. 
13760 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
13770 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
13780 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
13790 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
137a0 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 65  n rc;.        }e
137b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
137c0 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44  emset(PGHDR_TO_D
137d0 41 54 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61  ATA(pPg), 0, pPa
137e0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
137f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13800 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
13810 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
13820 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
13830 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
13840 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
13850 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
13860 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
13870 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
13880 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
13890 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
138a0 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
138b0 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
138c0 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
138d0 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
138e0 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
138f0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
13900 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
13910 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
13920 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
13930 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
13940 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
13950 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
13960 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
13970 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
13980 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
13990 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
139a0 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
139b0 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
139c0 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
139d0 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
139e0 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
139f0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
13a00 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
13a10 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
13a20 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
13a30 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
13a40 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
13a50 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
13a60 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
13a70 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
13a80 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
13a90 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
13aa0 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
13ab0 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
13ac0 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
13ad0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
13ae0 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
13af0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
13b00 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
13b10 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
13b20 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
13b30 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
13b40 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
13b50 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
13b60 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
13b70 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
13b80 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
13b90 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
13ba0 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
13bb0 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
13bc0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
13bd0 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
13be0 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
13bf0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
13c00 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
13c10 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
13c20 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
13c30 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
13c40 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
13c50 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
13c60 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13c70 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
13c80 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13c90 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
13ca0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
13cb0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
13cc0 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
13cd0 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
13ce0 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
13cf0 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
13d00 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
13d10 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
13d20 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
13d30 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
13d40 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
13d50 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13d60 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
13d70 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
13d80 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
13d90 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
13da0 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
13db0 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
13dc0 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
13dd0 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
13de0 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
13df0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
13e00 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
13e10 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
13e20 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
13e30 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
13e40 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
13e50 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
13e60 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
13e70 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
13e80 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
13e90 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
13ea0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
13eb0 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
13ec0 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
13ed0 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
13ee0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13ef0 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
13f00 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13f10 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
13f20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
13f30 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
13f40 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
13f50 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
13f60 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
13f70 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
13f80 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
13f90 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
13fa0 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
13fb0 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
13fc0 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
13fd0 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
13fe0 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
13ff0 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
14000 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
14010 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
14020 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
14030 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
14040 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14050 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
14060 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14070 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
14080 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
14090 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
140a0 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
140b0 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
140c0 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
140d0 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
140e0 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
140f0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14100 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
14110 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
14120 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
14130 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
14140 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
14150 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
14160 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
14170 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
14180 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
14190 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
141a0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
141b0 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
141c0 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
141d0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
141e0 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
141f0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
14200 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
14210 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
14220 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
14230 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74  urnal );.  sqlit
14240 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
14250 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
14260 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
14270 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
14280 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
14290 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
142a0 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
142b0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
142c0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
142d0 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
142e0 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
142f0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
14300 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
14310 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
14320 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
14330 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
14340 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
14350 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
14360 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
14370 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14380 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
14390 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
143a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
143b0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
143c0 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71  ournal;.  }.  sq
143d0 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
143e0 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
143f0 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
14400 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
14410 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
14420 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
14430 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
14440 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
14450 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
14460 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
14470 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
14480 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
14490 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
144a0 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
144b0 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
144c0 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
144d0 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
144e0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
144f0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
14500 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
14510 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
14520 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
14530 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
14540 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14550 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14560 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
14570 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
14580 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14590 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
145a0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
145b0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
145c0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
145d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
145e0 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
145f0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
14600 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
14610 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
14620 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
14630 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
14640 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
14650 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  al = 0;.  sqlite
14660 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
14670 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
14680 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
14690 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
146a0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
146b0 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
146c0 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
146d0 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
146e0 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
146f0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
14700 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
14710 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
14720 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
14730 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
14740 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
14750 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14760 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
14770 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
14780 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
14790 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
147a0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
147b0 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
147c0 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
147d0 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
147e0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
147f0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
14800 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
14810 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
14820 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
14830 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
14840 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
14850 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
14860 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
14870 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
14880 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
14890 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
148a0 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
148b0 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
148c0 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
148d0 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
148e0 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
148f0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
14900 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
14910 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
14920 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
14930 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
14940 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
14950 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
14960 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
14970 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
14980 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
14990 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
149a0 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
149b0 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
149c0 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
149d0 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
149e0 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
149f0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
14a00 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
14a10 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
14a20 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
14a30 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
14a40 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
14a50 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
14a60 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
14a70 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
14a80 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14a90 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
14aa0 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
14ab0 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
14ac0 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
14ad0 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
14ae0 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
14af0 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
14b00 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
14b10 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
14b20 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
14b30 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
14b40 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
14b50 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
14b60 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
14b70 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  n(void *pData, i
14b80 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67  nt exFlag){.  Pg
14b90 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
14ba0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
14bb0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14bc0 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
14bd0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14be0 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
14bf0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
14c00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14c10 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
14c20 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
14c30 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
14c40 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
14c50 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14c60 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
14c70 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
14c80 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
14c90 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
14ca0 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
14cb0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
14cc0 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
14cd0 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
14ce0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
14cf0 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14d00 4f 43 4b 20 7c 7c 20 65 78 46 6c 61 67 20 29 7b  OCK || exFlag ){
14d10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
14d20 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14d30 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
14d40 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
14d50 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
14d60 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
14d70 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  (&pPager->fd, RE
14d80 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
14d90 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14da0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14db0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14dc0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
14dd0 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
14de0 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
14df0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
14e00 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14e10 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
14e20 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
14e30 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14e40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14e50 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
14e60 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14e70 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14e80 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
14e90 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54 52        TRACE2("TR
14ea0 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
14eb0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14ec0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
14ed0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14ee0 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
14ef0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
14f00 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
14f10 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
14f20 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14f30 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14f40 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
14f50 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
14f60 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
14f70 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
14f80 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
14f90 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
14fa0 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
14fb0 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
14fc0 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
14fd0 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
14fe0 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
14ff0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
15000 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
15010 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
15020 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
15030 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
15040 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
15050 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
15060 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
15070 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
15080 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
15090 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
150a0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
150b0 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
150c0 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
150d0 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
150e0 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
150f0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
15100 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
15110 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
15120 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
15130 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
15140 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
15150 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
15160 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
15170 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
15180 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
15190 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
151a0 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
151b0 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
151c0 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
151d0 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
151e0 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
151f0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
15200 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
15210 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
15220 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
15230 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
15240 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
15250 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
15260 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
15270 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
15280 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
15290 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
152a0 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
152b0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
152c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
152d0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
152e0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
152f0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
15300 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
15310 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
15320 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74  Mask ){ .    ret
15330 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
15340 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
15350 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
15360 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
15370 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
15380 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
15390 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
153a0 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  er );..  /* Mark
153b0 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
153c0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
153d0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
153e0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
153f0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
15400 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
15410 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
15420 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
15430 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
15440 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
15450 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
15460 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
15470 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
15480 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
15490 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
154a0 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
154b0 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
154c0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
154d0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
154e0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
154f0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
15500 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
15510 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
15520 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
15530 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
15540 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
15550 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
15560 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
15570 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
15580 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
15590 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
155a0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
155b0 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
155c0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
155d0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
155e0 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
155f0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15600 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
15610 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15620 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15630 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
15640 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
15650 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
15660 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
15670 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
15680 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
15690 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
156a0 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
156b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
156c0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
156d0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
156e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
156f0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
15700 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
15710 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
15720 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
15730 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
15740 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
15750 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
15760 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
15770 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
15780 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
15790 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
157a0 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
157b0 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
157c0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
157d0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
157e0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
157f0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
15800 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
15810 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
15820 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
15830 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
15840 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
15850 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
15860 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
15870 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
15880 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73  g;.        u32 s
15890 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
158a0 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
158b0 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
158c0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
158d0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
158e0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  r);.          TR
158f0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
15900 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
15910 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
15920 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
15930 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
15940 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
15950 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
15960 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
15970 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
15980 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
15990 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
159a0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
159b0 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
159c0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
159d0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
159e0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
159f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
15a00 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15a10 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
15a20 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44  m;.          COD
15a30 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
15a40 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
15a50 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
15a60 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
15a70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
15a80 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
15a90 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33      saved = *(u3
15aa0 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
15ab0 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  A(pPg, pPager);.
15ac0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33            store3
15ad0 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
15ae0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15af0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
15b00 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
15b10 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
15b20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
15b30 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20  pPg->pgno, pPg, 
15b40 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  -4);.          r
15b50 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
15b60 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
15b70 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29   &((char*)pData)
15b80 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20  [-4], szPg);.   
15b90 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
15ba0 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
15bb0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  g;.          TRA
15bc0 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
15bd0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
15be0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15bf0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
15c00 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
15c10 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
15c20 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
15c30 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
15c40 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
15c50 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  0);.          *(
15c60 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
15c70 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
15c80 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20   = saved;.      
15c90 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15ca0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15cb0 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
15cc0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
15cd0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
15ce0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
15cf0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
15d00 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
15d10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15d20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15d30 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
15d40 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15d50 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
15d60 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
15d70 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
15d80 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
15d90 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
15da0 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
15db0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
15dc0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
15dd0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
15de0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
15df0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
15e00 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
15e10 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
15e20 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
15e30 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
15e40 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
15e50 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15e60 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15e70 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
15e80 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
15e90 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
15ea0 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
15eb0 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
15ec0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ync;.        TRA
15ed0 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
15ee0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
15ef0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
15f00 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
15f10 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
15f20 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
15f30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15f40 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
15f50 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
15f60 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
15f70 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
15f80 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
15f90 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
15fa0 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
15fb0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
15fc0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
15fd0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
15fe0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
15ff0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
16000 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
16010 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
16020 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
16030 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
16040 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
16050 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
16060 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
16070 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
16080 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
16090 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
160a0 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
160b0 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
160c0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
160d0 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
160e0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
160f0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
16100 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
16110 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
16120 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
16130 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
16140 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
16150 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16160 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
16170 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
16180 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
16190 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
161a0 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
161b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
161c0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
161d0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
161e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
161f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16200 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
16210 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
16220 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
16230 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16240 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16250 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
16260 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
16270 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
16280 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
16290 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
162a0 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
162b0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
162c0 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
162d0 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
162e0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
162f0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
16300 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
16310 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16320 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 73  Write(&pPager->s
16330 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74  tfd,((char*)pDat
16340 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70 61  a)-4, pPager->pa
16350 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
16360 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
16370 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
16380 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16390 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
163a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  o);.        CODE
163b0 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
163c0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
163d0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
163e0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
163f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
16400 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
16410 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16420 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
16430 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
16440 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  L;.          ret
16450 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16460 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
16470 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
16480 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16490 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
164a0 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
164b0 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
164c0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
164d0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
164e0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
164f0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
16500 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
16510 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
16520 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
16530 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
16540 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
16550 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
16560 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
16570 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
16580 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
16590 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
165a0 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
165b0 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
165c0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
165d0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
165e0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
165f0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
16600 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
16610 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
16620 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
16630 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
16640 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
16650 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16660 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
16670 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
16680 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
16690 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
166a0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
166b0 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
166c0 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
166d0 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
166e0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
166f0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
16700 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
16710 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
16720 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
16730 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
16740 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
16750 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
16760 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
16770 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
16780 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
16790 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
167a0 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
167b0 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
167c0 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
167d0 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
167e0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
167f0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
16800 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
16810 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
16820 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
16830 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
16840 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16850 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16860 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70   memcpy(pPage, p
16870 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
16880 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
16890 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
168a0 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
168b0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
168c0 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
168d0 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
168e0 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
168f0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
16900 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
16910 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
16920 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
16930 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
16940 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
16950 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
16960 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
16970 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
16980 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
16990 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
169a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
169b0 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
169c0 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
169d0 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
169e0 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
169f0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
16a00 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
16a10 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
16a20 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
16a30 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
16a40 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
16a50 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
16a60 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
16a70 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
16a80 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
16a90 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
16aa0 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
16ab0 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
16ac0 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
16ad0 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
16ae0 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
16af0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
16b00 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
16b10 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
16b20 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
16b30 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
16b40 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
16b50 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
16b60 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
16b70 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
16b80 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
16b90 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
16ba0 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
16bb0 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
16bc0 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
16bd0 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
16be0 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
16bf0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
16c00 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
16c10 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
16c20 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
16c30 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
16c40 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
16c50 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
16c60 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
16c70 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
16c80 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
16c90 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
16ca0 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
16cb0 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
16cc0 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
16cd0 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
16ce0 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
16cf0 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
16d00 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
16d10 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
16d20 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
16d30 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
16d40 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
16d50 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
16d60 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
16d70 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
16d80 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
16d90 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
16da0 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
16db0 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
16dc0 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
16dd0 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
16de0 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
16df0 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
16e00 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
16e10 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
16e20 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
16e30 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
16e40 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
16e50 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16e60 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
16e70 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
16e80 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
16e90 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
16ea0 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
16eb0 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
16ec0 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
16ed0 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
16ee0 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
16ef0 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
16f00 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
16f10 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
16f20 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16f30 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
16f40 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
16f50 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
16f60 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
16f70 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
16f80 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
16f90 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
16fa0 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
16fb0 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
16fc0 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
16fd0 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
16fe0 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
16ff0 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
17000 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
17010 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
17020 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
17030 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
17040 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
17050 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
17060 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
17070 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
17080 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
17090 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
170a0 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
170b0 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
170c0 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
170d0 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
170e0 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
170f0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
17100 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
17110 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
17120 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
17130 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
17140 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
17150 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
17160 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
17170 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
17180 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
17190 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
171a0 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
171b0 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
171c0 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
171d0 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
171e0 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
171f0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
17200 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
17210 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
17220 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
17230 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
17240 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
17250 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
17260 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
17270 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
17280 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
17290 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
172a0 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
172b0 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
172c0 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
172d0 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
172e0 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72  ack || MEMDB ) r
172f0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
17300 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
17310 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
17320 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
17330 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
17340 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17350 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
17360 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17370 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
17380 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
17390 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
173a0 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
173b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
173c0 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
173d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
173e0 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
173f0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
17400 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
17410 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
17420 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
17430 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
17440 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
17450 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
17460 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17470 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ));.  }.  if( pP
17480 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
17490 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
174a0 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
174b0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
174c0 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
174d0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
174e0 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
174f0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
17500 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
17510 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
17520 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
17530 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
17540 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
17550 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
17560 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
17570 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
17580 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
17590 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
175a0 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
175b0 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
175c0 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
175d0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46  Hist){.  sqliteF
175e0 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
175f0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
17600 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
17610 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
17620 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d  0;.  pHist->pStm
17630 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
17640 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
17650 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
17660 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
17670 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
17680 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
17690 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
176a0 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
176b0 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
176c0 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
176d0 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
176e0 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
176f0 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
17700 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
17710 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
17720 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
17730 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
17740 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
17750 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
17760 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17770 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ==PAGER_ERR_FULL
17780 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
17790 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
177a0 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
177b0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
177c0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
177d0 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
177e0 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
177f0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
17800 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
17810 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
17820 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
17830 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
17840 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
17850 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
17860 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
17870 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17880 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  OR;.  }.  TRACE2
17890 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
178a0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
178b0 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
178c0 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
178d0 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
178e0 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
178f0 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
17900 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
17910 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
17920 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
17930 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
17940 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
17950 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
17960 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
17970 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
17980 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
17990 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
179a0 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
179b0 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
179c0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
179d0 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
179e0 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
179f0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
17a00 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
17a10 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
17a20 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17a30 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
17a40 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
17a50 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
17a60 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
17a70 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
17a80 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
17a90 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
17aa0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
17ab0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
17ac0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
17ad0 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
17ae0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17af0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17b00 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
17b10 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
17b20 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
17b30 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
17b40 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
17b50 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
17b60 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
17b70 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
17b80 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
17b90 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17ba0 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17bb0 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17bc0 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
17bd0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
17be0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
17bf0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17c00 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
17c10 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
17c20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17c30 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
17c40 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
17c50 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
17c60 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17c70 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17c80 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
17c90 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75  }.  rc = pager_u
17ca0 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
17cb0 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  r);.  pPager->db
17cc0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
17cd0 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
17ce0 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68  mp here if anyth
17cf0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64  ing goes wrong d
17d00 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
17d10 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63   process..  */.c
17d20 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73  ommit_abort:.  s
17d30 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
17d40 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
17d50 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17d60 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
17d70 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
17d80 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
17d90 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
17da0 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
17db0 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
17dc0 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
17dd0 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
17de0 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
17df0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
17e00 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
17e10 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
17e20 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
17e30 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
17e40 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
17e50 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
17e60 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
17e70 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ol (SQLITE_PROTO
17e80 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73  COL) or unless s
17e90 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
17ea0 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
17eb0 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
17ec0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
17ed0 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
17ee0 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
17ef0 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
17f00 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
17f10 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
17f20 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
17f30 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
17f40 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
17f50 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
17f60 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
17f70 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
17f80 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
17f90 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
17fa0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
17fb0 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  .  TRACE2("ROLLB
17fc0 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
17fd0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
17fe0 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
17ff0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
18000 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
18010 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
18020 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
18030 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
18040 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
18050 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
18060 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
18070 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
18080 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
18090 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
180a0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
180b0 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
180c0 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
180d0 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
180e0 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
180f0 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
18100 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
18110 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
18120 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
18130 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
18140 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
18150 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
18160 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
18170 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
18180 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
18190 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
181a0 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c       TRACE3("ROL
181b0 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
181c0 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
181d0 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
181e0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
181f0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
18200 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
18210 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
18220 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
18230 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
18240 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
18250 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
18260 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
18270 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
18280 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
18290 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
182a0 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
182b0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
182c0 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
182d0 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
182e0 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
182f0 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
18300 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61  _TO_DATA(p), pPa
18310 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18320 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
18330 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
18340 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
18350 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
18360 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18370 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
18380 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
18390 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
183a0 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
183b0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
183c0 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
183d0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
183e0 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
183f0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18400 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
18410 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
18420 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
18430 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
18440 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
18450 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
18460 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
18470 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
18480 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
18490 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
184a0 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
184b0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
184c0 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
184d0 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
184e0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
184f0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
18500 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
18510 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
18520 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
18530 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
18540 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
18550 20 72 63 32 2c 20 72 63 33 3b 0a 20 20 20 20 72   rc2, rc3;.    r
18560 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  c = pager_reload
18570 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
18580 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
18590 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
185a0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
185b0 69 7a 65 29 3b 0a 20 20 20 20 72 63 33 20 3d 20  ize);.    rc3 = 
185c0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
185d0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
185e0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
185f0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
18600 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
18610 33 20 29 20 72 63 20 3d 20 72 63 33 3b 0a 20 20  3 ) rc = rc3;.  
18620 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
18630 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
18640 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
18650 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18660 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
18670 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18680 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55  ;  /* bkpt-CORRU
18690 50 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  PT */.    pPager
186a0 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
186b0 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
186c0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
186d0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
186e0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
186f0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
18700 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
18710 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
18720 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
18730 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
18740 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
18750 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
18760 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18770 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
18780 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18790 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
187a0 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
187b0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
187c0 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
187d0 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
187e0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
187f0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
18800 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
18810 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
18820 61 5b 39 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  a[9];.  a[0] = p
18830 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
18840 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
18850 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
18860 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
18870 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
18880 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
18890 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
188a0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
188b0 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
188c0 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
188d0 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
188e0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
188f0 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
18900 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f    return a;.}../
18910 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61  *.** Set the sta
18920 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20  tement rollback 
18930 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  point..**.** Thi
18940 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64  s routine should
18950 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20   be called with 
18960 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
18970 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a  journal already.
18980 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20  ** open.  A new 
18990 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
189a0 6c 20 69 73 20 63 72 65 61 74 65 64 20 74 68 61  l is created tha
189b0 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  t can be used to
189c0 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61   rollback.** cha
189d0 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65  nges of a single
189e0 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74   SQL command wit
189f0 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61  hin a larger tra
18a00 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  nsaction..*/.int
18a10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74   sqlite3pager_st
18a20 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a  mt_begin(Pager *
18a30 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
18a40 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b  c;.  char zTemp[
18a50 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f  SQLITE_TEMPNAME_
18a60 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28  SIZE];.  assert(
18a70 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e   !pPager->stmtIn
18a80 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  Use );.  assert(
18a90 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
18aa0 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22  =0 );.  TRACE2("
18ab0 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22  STMT-BEGIN %d\n"
18ac0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
18ad0 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20  ));.  if( MEMDB 
18ae0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  ){.    pPager->s
18af0 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20  tmtInUse = 1;.  
18b00 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69    pPager->stmtSi
18b10 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
18b20 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ize;.    return 
18b30 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
18b40 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
18b50 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
18b60 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
18b70 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72  oopen = 1;.    r
18b80 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
18b90 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
18ba0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
18bb0 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  en );.  pPager->
18bc0 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65  aInStmt = sqlite
18bd0 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e  Malloc( pPager->
18be0 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a  dbSize/8 + 1 );.
18bf0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
18c00 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nStmt==0 ){.    
18c10 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70  sqlite3OsLock(&p
18c20 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
18c30 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74  D_LOCK);.    ret
18c40 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
18c50 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44  ;.  }.#ifndef ND
18c60 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69  EBUG.  rc = sqli
18c70 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
18c80 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61  Pager->jfd, &pPa
18c90 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b  ger->stmtJSize);
18ca0 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f  .  if( rc ) goto
18cb0 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c   stmt_begin_fail
18cc0 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  ed;.  assert( pP
18cd0 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20  ager->stmtJSize 
18ce0 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  == pPager->journ
18cf0 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a  alOff );.#endif.
18d00 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
18d10 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ize = pPager->jo
18d20 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67  urnalOff;.  pPag
18d30 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70  er->stmtSize = p
18d40 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20  Pager->dbSize;. 
18d50 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
18d60 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
18d70 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70  r->stmtCksum = p
18d80 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
18d90 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  ;.  if( !pPager-
18da0 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20  >stmtOpen ){.   
18db0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
18dc0 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d  er_opentemp(zTem
18dd0 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64  p, &pPager->stfd
18de0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
18df0 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f  goto stmt_begin_
18e00 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67  failed;.    pPag
18e10 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31  er->stmtOpen = 1
18e20 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ;.    pPager->st
18e30 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a  mtNRec = 0;.  }.
18e40 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
18e50 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  Use = 1;.  retur
18e60 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73  n SQLITE_OK;. .s
18e70 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
18e80 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  :.  if( pPager->
18e90 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  aInStmt ){.    s
18ea0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
18eb0 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20  ->aInStmt);.    
18ec0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20  pPager->aInStmt 
18ed0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18ee0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
18ef0 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e  ommit a statemen
18f00 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
18f10 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
18f20 69 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  it(Pager *pPager
18f30 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ){.  if( pPager-
18f40 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20  >stmtInUse ){.  
18f50 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70    PgHdr *pPg, *p
18f60 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32  Next;.    TRACE2
18f70 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64  ("STMT-COMMIT %d
18f80 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18f90 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21  ger));.    if( !
18fa0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73  MEMDB ){.      s
18fb0 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
18fc0 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a  ager->stfd, 0);.
18fd0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
18fe0 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50 61 67  OsTruncate(&pPag
18ff0 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f  er->stfd, 0); */
19000 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
19010 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  e( pPager->aInSt
19020 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67  mt );.      pPag
19030 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b  er->aInStmt = 0;
19040 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70  .    }.    for(p
19050 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  Pg=pPager->pStmt
19060 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74  ; pPg; pPg=pNext
19070 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d  ){.      pNext =
19080 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
19090 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
190a0 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20  Pg->inStmt );.  
190b0 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20      pPg->inStmt 
190c0 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
190d0 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d  pPrevStmt = pPg-
190e0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
190f0 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20        if( MEMDB 
19100 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48 69 73  ){.        PgHis
19110 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47  tory *pHist = PG
19120 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c  HDR_TO_HIST(pPg,
19130 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20   pPager);.      
19140 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48 69    sqliteFree(pHi
19150 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20  st->pStmt);.    
19160 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74      pHist->pStmt
19170 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
19180 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
19190 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
191a0 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e    pPager->stmtIn
191b0 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  Use = 0;.    pPa
191c0 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
191d0 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74    }.  pPager->st
191e0 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a  mtAutoopen = 0;.
191f0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19200 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c  OK;.}../*.** Rol
19210 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e  lback a statemen
19220 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
19230 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c  3pager_stmt_roll
19240 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
19250 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  er){.  int rc;. 
19260 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
19270 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52  tInUse ){.    TR
19280 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42  ACE2("STMT-ROLLB
19290 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
192a0 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
192b0 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
192c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
192d0 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50        for(pPg=pP
192e0 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67  ager->pStmt; pPg
192f0 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
19300 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50  Stmt){.        P
19310 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20  gHistory *pHist 
19320 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  = PGHDR_TO_HIST(
19330 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  pPg, pPager);.  
19340 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
19350 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
19360 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52      memcpy(PGHDR
19370 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
19380 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61  Hist->pStmt, pPa
19390 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
193a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
193b0 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
193c0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48  t);.          pH
193d0 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ist->pStmt = 0;.
193e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
193f0 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
19400 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
19410 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20  >stmtSize;.     
19420 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28   memoryTruncate(
19430 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
19440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19450 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19460 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
19470 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
19480 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
19490 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
194a0 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20  mmit(pPager);.  
194b0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
194c0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20  SQLITE_OK;.  }. 
194d0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74   pPager->stmtAut
194e0 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74  oopen = 0;.  ret
194f0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19500 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
19510 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
19520 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19530 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
19540 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65  qlite3pager_file
19550 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
19560 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
19570 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b  ager->zFilename;
19580 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
19590 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f   the directory o
195a0 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
195b0 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68  ile..*/.const ch
195c0 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72  ar *sqlite3pager
195d0 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a  _dirname(Pager *
195e0 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72  pPager){.  retur
195f0 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63  n pPager->zDirec
19600 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  tory;.}../*.** R
19610 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
19620 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a  athname of the j
19630 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a  ournal file..*/.
19640 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69  const char *sqli
19650 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c  te3pager_journal
19660 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
19670 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
19680 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a  ager->zJournal;.
19690 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
196a0 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20   codec for this 
196b0 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71  pager.*/.void sq
196c0 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63  lite3pager_set_c
196d0 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70  odec(.  Pager *p
196e0 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a  Pager,.  void (*
196f0 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f  xCodec)(void*,vo
19700 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20  id*,Pgno,int),. 
19710 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67   void *pCodecArg
19720 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43  .){.  pPager->xC
19730 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20  odec = xCodec;. 
19740 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41   pPager->pCodecA
19750 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a  rg = pCodecArg;.
19760 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
19770 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20  utine is called 
19780 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65  to increment the
19790 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 63   database file c
197a0 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a  hange-counter,.*
197b0 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74 65  * stored at byte
197c0 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65 72   24 of the pager
197d0 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   file..*/.static
197e0 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f   int pager_incr_
197f0 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61  changecounter(Pa
19800 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19810 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50  void *pPage;.  P
19820 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20  gHdr *pPgHdr;.  
19830 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74  u32 change_count
19840 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20  er;.  int rc;.. 
19850 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20   /* Open page 1 
19860 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20  of the file for 
19870 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63  writing. */.  rc
19880 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
19890 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26  get(pPager, 1, &
198a0 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63  pPage);.  if( rc
198b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
198c0 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20  turn rc;.  rc = 
198d0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69  sqlite3pager_wri
198e0 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28  te(pPage);.  if(
198f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
19900 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
19910 2a 20 52 65 61 64 20 74 68 65 20 63 75 72 72 65  * Read the curre
19920 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79 74 65  nt value at byte
19930 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72   24. */.  pPgHdr
19940 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
19950 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67  (pPage);.  chang
19960 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72  e_counter = retr
19970 69 65 76 65 33 32 62 69 74 73 28 70 50 67 48 64  ieve32bits(pPgHd
19980 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e  r, 24);..  /* In
19990 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75  crement the valu
199a0 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20  e just read and 
199b0 77 72 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f  write it back to
199c0 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63   byte 24. */.  c
199d0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b  hange_counter++;
199e0 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73 28 63  .  store32bits(c
199f0 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70  hange_counter, p
19a00 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f  PgHdr, 24);..  /
19a10 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70 61  * Release the pa
19a20 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f  ge reference. */
19a30 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  .  sqlite3pager_
19a40 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
19a50 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19a60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20  ;.}../*.** Sync 
19a70 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19a80 65 20 66 6f 72 20 74 68 65 20 70 61 67 65 72 20  e for the pager 
19a90 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20  pPager. zMaster 
19aa0 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61  points to the na
19ab0 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65  me.** of a maste
19ac0 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74  r journal file t
19ad0 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72  hat should be wr
19ae0 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69  itten into the i
19af0 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75  ndividual.** jou
19b00 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74  rnal file. zMast
19b10 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20  er may be NULL, 
19b20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72 70 72  which is interpr
19b30 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65  eted as no maste
19b40 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20  r.** journal (a 
19b50 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20  single database 
19b60 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a  transaction)..**
19b70 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
19b80 20 65 6e 73 75 72 65 73 20 74 68 61 74 20 74 68   ensures that th
19b90 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
19ba0 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70  ced, all dirty p
19bb0 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20  ages written.** 
19bc0 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
19bd0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74  file and the dat
19be0 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65  abase file synce
19bf0 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e  d. The only thin
19c00 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e  g that.** remain
19c10 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20  s to commit the 
19c20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74  transaction is t
19c30 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75  o delete the jou
19c40 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a  rnal file (or.**
19c50 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19c60 66 69 6c 65 20 69 66 20 73 70 65 63 69 66 69 65  file if specifie
19c70 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  d)..**.** Note t
19c80 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d  hat if zMaster==
19c90 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20  NULL, this does 
19ca0 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20 61 20  not overwrite a 
19cb0 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a  previous value.*
19cc0 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73  * passed to an s
19cd0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
19ce0 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49  () call..**.** I
19cf0 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75  f parameter nTru
19d00 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20  nc is non-zero, 
19d10 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20 66  then the pager f
19d20 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65 64  ile is truncated
19d30 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61   to.** nTrunc pa
19d40 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73 65  ges (this is use
19d50 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d  d by auto-vacuum
19d60 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a   databases)..*/.
19d70 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
19d80 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61  _sync(Pager *pPa
19d90 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  ger, const char 
19da0 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e  *zMaster, Pgno n
19db0 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63  Trunc){.  int rc
19dc0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
19dd0 20 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53   TRACE4("DATABAS
19de0 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20  E SYNC: File=%s 
19df0 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e  zMaster=%s nTrun
19e00 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20  c=%d\n", .      
19e10 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
19e20 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75  e, zMaster, nTru
19e30 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  nc);..  /* If th
19e40 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f  is is an in-memo
19e50 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67  ry db, or no pag
19e60 65 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69  es have been wri
19e70 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73  tten to, or this
19e80 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68  .  ** function h
19e90 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  as already been 
19ea0 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20  called, it is a 
19eb0 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66  no-op..  */.  if
19ec0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21  ( pPager->state!
19ed0 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26  =PAGER_SYNCED &&
19ee0 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
19ef0 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b  r->dirtyCache ){
19f00 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b  .    PgHdr *pPg;
19f10 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
19f20 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19f30 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61   );..    /* If a
19f40 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
19f50 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c  file name has al
19f60 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74  ready been writt
19f70 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a  en to the.    **
19f80 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74   journal file, t
19f90 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72  hen no sync is r
19fa0 65 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61  equired. This ha
19fb0 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73  ppens when it is
19fc0 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c  .    ** written,
19fd0 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73   then the proces
19fe0 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61  s fails to upgra
19ff0 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56  de from a RESERV
1a000 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20  ED to an.    ** 
1a010 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20  EXCLUSIVE lock. 
1a020 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68  The next time th
1a030 65 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20  e process tries 
1a040 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20  to commit the.  
1a050 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e    ** transaction
1a060 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69   the m-j name wi
1a070 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ll have already 
1a080 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20  been written..  
1a090 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50    */.    if( !pP
1a0a0 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20  ager->setMaster 
1a0b0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
1a0c0 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
1a0d0 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a  ounter(pPager);.
1a0e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1a0f0 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73  LITE_OK ) goto s
1a100 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65  ync_exit;.#ifnde
1a110 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
1a120 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69  TOVACUUM.      i
1a130 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
1a140 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
1a150 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68  is transaction h
1a160 61 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61  as made the data
1a170 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68  base smaller, th
1a180 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20  en all pages.   
1a190 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69       ** being di
1a1a0 73 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74  scarded by the t
1a1b0 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62  runcation must b
1a1c0 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65  e written to the
1a1d0 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20   journal.       
1a1e0 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20   ** file..      
1a1f0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e    */.        Pgn
1a200 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  o i;.        voi
1a210 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20  d *pPage;.      
1a220 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b    for( i=nTrunc+
1a230 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72  1; i<=pPager->or
1a240 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b  igDbSize; i++ ){
1a250 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1a260 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1a270 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28  nal[i/8] & (1<<(
1a280 69 26 37 29 29 29 20 29 7b 0a 20 20 20 20 20 20  i&7))) ){.      
1a290 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1a2a0 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1a2b0 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a  er, i, &pPage);.
1a2c0 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
1a2d0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a2e0 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1a300 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72   sqlite3pager_wr
1a310 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20  ite(pPage);.    
1a320 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70          sqlite3p
1a330 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65  ager_unref(pPage
1a340 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1a350 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a360 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a370 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
1a380 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20         } .      
1a390 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72  }.#endif.      r
1a3a0 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a  c = writeMasterJ
1a3b0 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a  ournal(pPager, z
1a3c0 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69  Master);.      i
1a3d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a3e0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a3f0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79  t;.      rc = sy
1a400 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
1a410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a420 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a430 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20  o sync_exit;.   
1a440 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
1a450 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55  TE_OMIT_AUTOVACU
1a460 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e  UM.    if( nTrun
1a470 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63  c!=0 ){.      rc
1a480 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1a490 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
1a4a0 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20   nTrunc);.      
1a4b0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1a4c0 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78  K ) goto sync_ex
1a4d0 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66  it;.    }.#endif
1a4e0 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61  ..    /* Write a
1a4f0 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 74  ll dirty pages t
1a500 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
1a510 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  ile */.    pPg =
1a520 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64   pager_get_all_d
1a530 69 72 74 79 5f 70 61 67 65 73 28 70 50 61 67 65  irty_pages(pPage
1a540 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  r);.    rc = pag
1a550 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
1a560 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20  t(pPg);.    if( 
1a570 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a580 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a590 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  .    /* Sync the
1a5a0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
1a5b0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1a5c0 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20  er->noSync ){.  
1a5d0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1a5e0 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e  OsSync(&pPager->
1a5f0 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  fd);.    }..    
1a600 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1a610 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20  PAGER_SYNCED;.  
1a620 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20  }..sync_exit:.  
1a630 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69  return rc;.}..#i
1a640 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1a650 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a  T_AUTOVACUUM./*.
1a660 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65  ** Move the page
1a670 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 70   identified by p
1a680 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e  Data to location
1a690 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c   pgno in the fil
1a6a0 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20  e. .**.** There 
1a6b0 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72  must be no refer
1a6c0 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63 75 72  ences to the cur
1a6d0 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20  rent page pgno. 
1a6e0 49 66 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a  If current page.
1a6f0 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61  ** pgno is not a
1a700 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f  lready in the ro
1a710 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20  llback journal, 
1a720 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65  it is not writte
1a730 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79  n there by.** by
1a740 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54   this routine. T
1a750 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20  he same applies 
1a760 74 6f 20 74 68 65 20 70 61 67 65 20 70 44 61 74  to the page pDat
1a770 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65  a refers to on e
1a780 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20  ntry to.** this 
1a790 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  routine..**.** R
1a7a0 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65  eferences to the
1a7b0 20 70 61 67 65 20 72 65 66 65 72 65 64 20 74 6f   page refered to
1a7c0 20 62 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e   by pData remain
1a7d0 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67   valid. Updating
1a7e0 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74   any.** meta-dat
1a7f0 61 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  a associated wit
1a800 68 20 70 61 67 65 20 70 44 61 74 61 20 28 69 2e  h page pData (i.
1a810 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64 20 69  e. data stored i
1a820 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62 79 74  n the nExtra byt
1a830 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20  es.** allocated 
1a840 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70  along with the p
1a850 61 67 65 29 20 69 73 20 74 68 65 20 72 65 73 70  age) is the resp
1a860 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
1a870 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20  e caller..**.** 
1a880 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75  A transaction mu
1a890 73 74 20 62 65 20 61 63 74 69 76 65 20 77 68 65  st be active whe
1a8a0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
1a8b0 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77 65 76 65  s called, howeve
1a8c0 72 20 69 74 20 69 73 20 0a 2a 2a 20 69 6c 6c 65  r it is .** ille
1a8d0 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73  gal to call this
1a8e0 20 72 6f 75 74 69 6e 65 20 69 66 20 61 20 73 74   routine if a st
1a8f0 61 74 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69  atment transacti
1a900 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f  on is active..*/
1a910 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
1a920 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67 65 72  r_movepage(Pager
1a930 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 2a   *pPager, void *
1a940 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f  pData, Pgno pgno
1a950 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20  ){.  PgHdr *pPg 
1a960 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28  = DATA_TO_PGHDR(
1a970 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64 72 20  pData);.  PgHdr 
1a980 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20  *pPgOld; .  int 
1a990 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79  h;.  Pgno needSy
1a9a0 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61  ncPgno = 0;..  a
1a9b0 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e  ssert( !pPager->
1a9c0 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61  stmtInUse );.  a
1a9d0 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66  ssert( pPg->nRef
1a9e0 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28  >0 );..  TRACE5(
1a9f0 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20 25 64  "MOVE %d page %d
1aa00 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d   (needSync=%d) m
1aa10 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a  oves to %d\n", .
1aa20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
1aa30 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
1aa40 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c  , pPg->needSync,
1aa50 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70   pgno);..  if( p
1aa60 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  Pg->needSync ){.
1aa70 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f      needSyncPgno
1aa80 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20   = pPg->pgno;.  
1aa90 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69    assert( pPg->i
1aaa0 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
1aab0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72  assert( pPg->dir
1aac0 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  ty );.    assert
1aad0 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1aae0 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nc );.  }..  /* 
1aaf0 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20  Unlink pPg from 
1ab00 69 74 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20  it's hash-chain 
1ab10 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43  */.  unlinkHashC
1ab20 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67  hain(pPager, pPg
1ab30 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20  );..  /* If the 
1ab40 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61  cache contains a
1ab50 20 70 61 67 65 20 77 69 74 68 20 70 61 67 65 2d   page with page-
1ab60 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d  number pgno, rem
1ab70 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d  ove it.  ** from
1ab80 20 69 74 27 73 20 68 61 73 68 20 63 68 61 69 6e   it's hash chain
1ab90 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50  . Also, if the P
1aba0 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61  gHdr.needSync wa
1abb0 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20  s set for .  ** 
1abc0 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65  page pgno before
1abd0 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72   the 'move' oper
1abe0 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20  ation, it needs 
1abf0 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a  to be retained .
1ac00 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67    ** for the pag
1ac10 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20  e moved there.. 
1ac20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70   */.  pPgOld = p
1ac30 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67  ager_lookup(pPag
1ac40 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28  er, pgno);.  if(
1ac50 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61   pPgOld ){.    a
1ac60 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e  ssert( pPgOld->n
1ac70 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e  Ref==0 );.    un
1ac80 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50  linkHashChain(pP
1ac90 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20  ager, pPgOld);. 
1aca0 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79     pPgOld->dirty
1acb0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50   = 0;.    if( pP
1acc0 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29  gOld->needSync )
1acd0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
1ace0 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61  pPgOld->inJourna
1acf0 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  l );.      pPg->
1ad00 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20  inJournal = 1;. 
1ad10 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79       pPg->needSy
1ad20 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73  nc = 1;.      as
1ad30 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65  sert( pPager->ne
1ad40 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a  edSync );.    }.
1ad50 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65    }..  /* Change
1ad60 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
1ad70 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73   for pPg and ins
1ad80 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
1ad90 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20  new hash-chain. 
1ada0 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  */.  pPg->pgno =
1adb0 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67   pgno;.  h = pag
1adc0 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20  er_hash(pgno);. 
1add0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61   if( pPager->aHa
1ade0 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73  sh[h] ){.    ass
1adf0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61  ert( pPager->aHa
1ae00 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68  sh[h]->pPrevHash
1ae10 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65  ==0 );.    pPage
1ae20 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72  r->aHash[h]->pPr
1ae30 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
1ae40 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  }.  pPg->pNextHa
1ae50 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1ae60 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d  sh[h];.  pPager-
1ae70 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
1ae80 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73  .  pPg->pPrevHas
1ae90 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64  h = 0;..  pPg->d
1aea0 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50 61 67  irty = 1;.  pPag
1aeb0 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
1aec0 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53   1;..  if( needS
1aed0 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f  yncPgno ){.    /
1aee0 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e  * If needSyncPgn
1aef0 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  o is non-zero, t
1af00 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  hen the journal 
1af10 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65  file needs to be
1af20 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65   .    ** sync()e
1af30 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74  d before any dat
1af40 61 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  a is written to 
1af50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61  database file pa
1af60 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e  ge needSyncPgno.
1af70 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c  .    ** Currentl
1af80 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20  y, no such page 
1af90 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 70 61  exists in the pa
1afa0 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65  ge-cache and the
1afb0 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61   .    ** Pager.a
1afc0 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61  InJournal bit ha
1afd0 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73  s been set. This
1afe0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d   needs to be rem
1aff0 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67  edied by loading
1b000 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65  .    ** the page
1b010 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d   into the pager-
1b020 63 61 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e  cache and settin
1b030 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64  g the PgHdr.need
1b040 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a  Sync flag..    *
1b050 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c  *.    ** The sql
1b060 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29 20  ite3pager_get() 
1b070 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74  call may cause t
1b080 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79  he journal to sy
1b090 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20  nc. So make.    
1b0a0 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61 67 65  ** sure the Page
1b0b0 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  r.needSync flag 
1b0c0 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20  is set too..    
1b0d0 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20  */.    int rc;. 
1b0e0 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64 53 79     void *pNeedSy
1b0f0 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  nc;.    assert( 
1b100 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b110 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
1b120 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1b130 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67  ager, needSyncPg
1b140 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63 29 3b  no, &pNeedSync);
1b150 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1b160 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
1b170 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  rc;.    pPager->
1b180 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20  needSync = 1;.  
1b190 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28    DATA_TO_PGHDR(
1b1a0 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64  pNeedSync)->need
1b1b0 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41  Sync = 1;.    DA
1b1c0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1b1d0 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61  dSync)->inJourna
1b1e0 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f  l = 1;.    DATA_
1b1f0 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79  TO_PGHDR(pNeedSy
1b200 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a  nc)->dirty = 1;.
1b210 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
1b220 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79 6e 63  _unref(pNeedSync
1b230 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
1b240 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
1b250 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
1b260 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20  d(SQLITE_DEBUG) 
1b270 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  || defined(SQLIT
1b280 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65  E_TEST)./*.** Re
1b290 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
1b2a0 20 73 74 61 74 65 20 6f 66 20 74 68 65 20 66 69   state of the fi
1b2b0 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20  le lock for the 
1b2c0 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20  given pager..** 
1b2d0 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
1b2e0 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f   is one of NO_LO
1b2f0 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c  CK, SHARED_LOCK,
1b300 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a   RESERVED_LOCK,.
1b310 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c  ** PENDING_LOCK,
1b320 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   or EXCLUSIVE_LO
1b330 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  CK..*/.int sqlit
1b340 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74  e3pager_lockstat
1b350 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
1b360 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54  {.#ifdef OS_TEST
1b370 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
1b380 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70  ->fd->fd.locktyp
1b390 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72  e;.#else.  retur
1b3a0 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63  n pPager->fd.loc
1b3b0 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  ktype;.#endif.}.
1b3c0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
1b3d0 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a 0a 2a 2a  QLITE_TEST./*.**
1b3e0 20 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67   Print a listing
1b3f0 20 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63   of all referenc
1b400 65 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65  ed pages and the
1b410 69 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f  ir ref count..*/
1b420 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
1b430 65 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72  er_refdump(Pager
1b440 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48   *pPager){.  PgH
1b450 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70  dr *pPg;.  for(p
1b460 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
1b470 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70   pPg; pPg=pPg->p
1b480 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66  NextAll){.    if
1b490 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29  ( pPg->nRef<=0 )
1b4a0 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73   continue;.    s
1b4b0 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
1b4c0 66 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72  f("PAGE %3d addr
1b4d0 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20  =%p nRef=%d\n", 
1b4e0 0a 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e  .       pPg->pgn
1b4f0 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
1b500 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66  (pPg), pPg->nRef
1b510 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a  );.  }.}.#endif.