/ Hex Artifact Content
Login

Artifact 835028769569971c7dbd63d11d3517392f1cdae0:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 39  : pager.c,v 1.19
0350: 30 20 32 30 30 35 2f 30 32 2f 31 35 20 30 33 3a  0 2005/02/15 03:
0360: 33 38 3a 30 36 20 64 61 6e 69 65 6c 6b 31 39 37  38:06 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35  ).#define TRACE5
04f0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69  (X,Y,Z,W,V) sqli
0500: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0510: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a  ,Y,Z,W,V).#else.
0520: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
0530: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0540: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0550: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0560: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0570: 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,W).#define TRAC
0580: 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65  E5(X,Y,Z,W,V).#e
0590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
05a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
05b0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
05c0: 74 68 69 6e 20 74 68 65 20 54 52 41 43 45 58 28  thin the TRACEX(
05d0: 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a  ) macros above.*
05e0: 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66  * to print out f
05f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e  ile-descriptors.
0600: 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
0610: 65 64 20 73 6f 20 74 68 61 74 20 74 72 61 63 69  ed so that traci
0620: 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20 74 75 72  ng.** can be tur
0630: 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75 73 69 6e  ned on when usin
0640: 67 20 62 6f 74 68 20 74 68 65 20 72 65 67 75 6c  g both the regul
0650: 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6e 64  ar os_unix.c and
0660: 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a 20 62 61   os_test.c.** ba
0670: 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 50 41  ckends..**.** PA
0680: 47 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20  GERID() takes a 
0690: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
06a0: 65 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27  er struct as it'
06b0: 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a  s argument. The.
06c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  ** associated fi
06d0: 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73  le-descriptor is
06e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48   returned. FILEH
06f0: 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20  ANDLEID() takes 
0700: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72  an OsFile.** str
0710: 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75  uct as it's argu
0720: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ment..*/.#ifdef 
0730: 4f 53 5f 54 45 53 54 0a 23 64 65 66 69 6e 65 20  OS_TEST.#define 
0740: 50 41 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66  PAGERID(p) (p->f
0750: 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65  d->fd.h).#define
0760: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0770: 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a 23 65 6c  ) (fd->fd.h).#el
0780: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0790: 49 44 28 70 29 20 28 70 2d 3e 66 64 2e 68 29 0a  ID(p) (p->fd.h).
07a0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
07b0: 4c 45 49 44 28 66 64 29 20 28 66 64 2e 68 29 0a  LEID(fd) (fd.h).
07c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
07e0: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
07f0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0800: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0810: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
0820: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
0830: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0840: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0880: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0890: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
08c0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
08d0: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0900: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0910: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
0920: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0930: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0940: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
0960: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
0970: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0980: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
09a0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
09b0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
09c0: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
09f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0a00: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0a10: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
0a20: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
0a30: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
0a40: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
0a70: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a80: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a90: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0ac0: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0ad0: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0ae0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b00: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0b10: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0b20: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0b50: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0b60: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0ba0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0bb0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0bc0: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0bd0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0c00: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0c10: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0c40: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0c50: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0c60: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c80: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c90: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0ca0: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0cb0: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0cc0: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0cd0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0ce0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cf0: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0d00: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0d10: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0d20: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0d50: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0d60: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d90: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0da0: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0db0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
0dd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74  urnal file and t
0de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
0df0: 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ill be.**       
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0e20: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0e30: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0e40: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0e50: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0e60: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
0e70: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0e80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e90: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0ea0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
0eb0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
0ec0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0ed0: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0ee0: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0ef0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0f00: 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  to PAGER_UNLOCK.
0f10: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0f20: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33  .** that sqlite3
0f30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
0f40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f60: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f70: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f80: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69   sqlite_page_wri
0f90: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0fa0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0fc0: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0fd0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0fe0: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0ff0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
1000: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
1010: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1020: 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ).** The transit
1030: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1040: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 77 68  LUSIVE occurs wh
1050: 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  en before any ch
1060: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
1070: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1080: 65 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61  e file.  After a
1090: 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  n sqlite3pager_r
10a0: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
10b0: 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d  sqlite_pager_com
10c0: 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61 74 65  mit(), the state
10d0: 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41   goes back to PA
10e0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23  GER_SHARED..*/.#
10f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c  define PAGER_UNL
1100: 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69  OCK      0.#defi
1110: 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ne PAGER_SHARED 
1120: 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65       1   /* same
1130: 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   as SHARED_LOCK 
1140: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1150: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20  _RESERVED    2  
1160: 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45   /* same as RESE
1170: 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  RVED_LOCK */.#de
1180: 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55  fine PAGER_EXCLU
1190: 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61  SIVE   4   /* sa
11a0: 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f  me as EXCLUSIVE_
11b0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
11c0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
11d0: 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68    5../*.** If th
11e0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
11f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72  SERVED_LOCK macr
1200: 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  o is set to true
1210: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1220: 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64  ,.** then failed
1230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74   attempts to get
1240: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1250: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
1260: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a   busy callback..
1270: 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62  ** This is off b
1280: 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73  y default.  To s
1290: 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72  ee why, consider
12a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
12b0: 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20  cenario:.** .** 
12c0: 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41  Suppose thread A
12d0: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73   already has a s
12e0: 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  hared lock and w
12f0: 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20  ants a reserved 
1300: 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20  lock..** Thread 
1310: 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  B already has a 
1320: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e  reserved lock an
1330: 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75  d wants an exclu
1340: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a  sive lock.  If.*
1350: 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61  * both threads a
1360: 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62  re using their b
1370: 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69  usy callbacks, i
1380: 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e  t might be a lon
1390: 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72  g time.** be for
13a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65   one of the thre
13b0: 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20  ads give up and 
13c0: 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72  allows the other
13d0: 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20   to proceed..** 
13e0: 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61  But if the threa
13f0: 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20  d trying to get 
1400: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
1410: 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b  k gives up quick
1420: 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76  ly.** (if it nev
1430: 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62  er invokes its b
1440: 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68  usy callback) th
1450: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f  en the contentio
1460: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73  n will be.** res
1470: 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a  olved quickly..*
1480: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1490: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14a0: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
14b0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14c0: 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a  D_LOCK 0.#endif.
14d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
14e0: 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20  o rounds values 
14f0: 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  up so that if th
1500: 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64  e value is an ad
1510: 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67  dress it.** is g
1520: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1530: 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20  an address that 
1540: 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e  is aligned to an
1550: 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
1560: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52  ..*/.#define FOR
1570: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20  CE_ALIGNMENT(X) 
1580: 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a    (((X)+7)&~7)..
1590: 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65  /*.** Each in-me
15a0: 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20  mory image of a 
15b0: 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68  page begins with
15c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
15d0: 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68  eader..** This h
15e0: 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69  eader is only vi
15f0: 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61  sible to this pa
1600: 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65  ger module.  The
1610: 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20   client.** code 
1620: 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72  that calls pager
1630: 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64   sees only the d
1640: 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1650: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1660: 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73  ** Client code s
1670: 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74  hould call sqlit
1680: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1690: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
16a0: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
16b0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
16c0: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
16d0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
16e0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16f0: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
1700: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
1710: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
1720: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1730: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1740: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
1750: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1760: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1770: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1780: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1790: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
17a0: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
17b0: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
17c0: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
17d0: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
17e0: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
17f0: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
1800: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1810: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
1820: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
1830: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
1840: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1850: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1860: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1870: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1880: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1890: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
18a0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67   when sqlite3pag
18b0: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
18c0: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
18d0: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
18e0: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
18f0: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1900: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1910: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1920: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
1930: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
1940: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
1950: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
1960: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1970: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1980: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
1990: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
19a0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
19d0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
1a00: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
1a10: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
1a20: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
1a30: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
1a40: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
1a50: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
1a60: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
1a70: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
1a80: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
1aa0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
1ab0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53  .  PgHdr *pNextS
1ac0: 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b  tmt, *pPrevStmt;
1ad0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
1ae0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
1af0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ent journal */. 
1b00: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
1b30: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
1b40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b50: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b70: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
1b80: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1b90: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1bd0: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1be0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1c10: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1c20: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1c30: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1c40: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1c50: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1c60: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1c70: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68  his page */.  sh
1c80: 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ort int nRef;   
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  Number of users 
1cb0: 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  of this page */.
1cc0: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20   /* Dirty pages 
1cf0: 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72 2e  sorted by PgHdr.
1d00: 70 67 6e 6f 20 2a 2f 0a 23 69 66 64 65 66 20 53  pgno */.#ifdef S
1d10: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
1d20: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
1d30: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
1d40: 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20  ager->psAligned 
1d50: 62 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61  bytes of page da
1d60: 74 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68  ta follow this h
1d70: 65 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61  eader */.  /* Pa
1d80: 67 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73  ger.nExtra bytes
1d90: 20 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66   of local data f
1da0: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64  ollow the page d
1db0: 61 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ata */.};../*.**
1dc0: 20 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72   For an in-memor
1dd0: 79 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c  y only database,
1de0: 20 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f   some extra info
1df0: 72 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72  rmation is recor
1e00: 64 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63  ded about.** eac
1e10: 68 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63  h page so that c
1e20: 68 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f  hanges can be ro
1e30: 6c 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75  lled back.  (Jou
1e40: 72 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e  rnal files are n
1e50: 6f 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69  ot.** used for i
1e60: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1e70: 65 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77  es.)  The follow
1e80: 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  ing information 
1e90: 69 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74  is added to.** t
1ea0: 68 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20  he end of every 
1eb0: 45 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20  EXTRA block for 
1ec0: 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
1ed0: 73 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ses..**.** This 
1ee0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c  information coul
1ef0: 64 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65  d have been adde
1f00: 64 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  d directly to th
1f10: 65 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  e PgHdr structur
1f20: 65 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69  e..** But then i
1f30: 74 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20  t would take up 
1f40: 61 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73  an extra 8 bytes
1f50: 20 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65   of storage on e
1f60: 76 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76  very PgHdr.** ev
1f70: 65 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65  en for disk-base
1f80: 64 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70  d databases.  Sp
1f90: 6c 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73  litting it out s
1fa0: 61 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54  aves 8 bytes.  T
1fb0: 68 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61  his.** is only a
1fc0: 20 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25   savings of 0.8%
1fd0: 20 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65   but those perce
1fe0: 6e 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a  ntages add up..*
1ff0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2000: 20 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73   PgHistory PgHis
2010: 74 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48  tory;.struct PgH
2020: 69 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70  istory {.  u8 *p
2030: 4f 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69  Orig;     /* Ori
2040: 67 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e  ginal page text.
2050: 20 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69    Restore to thi
2060: 73 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c  s on a full roll
2070: 62 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53  back */.  u8 *pS
2080: 74 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74  tmt;     /* Text
2090: 20 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68   as it was at th
20a0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
20b0: 68 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65  he current state
20c0: 6d 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  ment */.};../*.*
20d0: 2a 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66  * A macro used f
20e0: 6f 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20  or invoking the 
20f0: 63 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69  codec if there i
2100: 73 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20  s one.*/.#ifdef 
2110: 53 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43  SQLITE_HAS_CODEC
2120: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
2130: 50 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e  P,D,N,X) if( P->
2140: 78 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f  xCodec ){ P->xCo
2150: 64 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67  dec(P->pCodecArg
2160: 2c 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65  ,D,N,X); }.#else
2170: 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28  .# define CODEC(
2180: 50 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a  P,D,N,X).#endif.
2190: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
21a0: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67   pointer to a Pg
21b0: 48 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74  Hdr into a point
21c0: 65 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a  er to its data.*
21d0: 2a 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e  * and back again
21e0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48  ..*/.#define PGH
21f0: 44 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28  DR_TO_DATA(P)  (
2200: 28 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29  (void*)(&(P)[1])
2210: 29 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54  ).#define DATA_T
2220: 4f 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28  O_PGHDR(D)  (&((
2230: 50 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29  PgHdr*)(D))[-1])
2240: 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54  .#define PGHDR_T
2250: 4f 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76  O_EXTRA(G,P) ((v
2260: 6f 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26  oid*)&((char*)(&
2270: 28 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73  (G)[1]))[(P)->ps
2280: 41 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e  Aligned]).#defin
2290: 65 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  e PGHDR_TO_HIST(
22a0: 50 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20  P,PGR)  \.      
22b0: 20 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72        ((PgHistor
22c0: 79 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50  y*)&((char*)(&(P
22d0: 29 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73  )[1]))[(PGR)->ps
22e0: 41 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e  Aligned+(PGR)->n
22f0: 45 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48  Extra])../*.** H
2300: 6f 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74  ow big to make t
2310: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73  he hash table us
2320: 65 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20  ed for locating 
2330: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a  in-memory pages.
2340: 2a 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65  ** by page numbe
2350: 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f  r..*/.#define N_
2360: 50 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a  PG_HASH 2048../*
2370: 0a 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20  .** Hash a page 
2380: 6e 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e  number.*/.#defin
2390: 65 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29  e pager_hash(PN)
23a0: 20 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41    ((PN)&(N_PG_HA
23b0: 53 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20  SH-1))../*.** A 
23c0: 6f 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20  open page cache 
23d0: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
23e0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
23f0: 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74  structure..*/.st
2400: 72 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63  ruct Pager {.  c
2410: 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20  har *zFilename; 
2420: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2430: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2440: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
2450: 72 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  r *zJournal;    
2460: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
2470: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
2480: 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  file */.  char *
2490: 7a 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20  zDirectory;     
24a0: 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
24b0: 72 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65  ry hold database
24c0: 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   and journal fil
24d0: 65 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66  es */.  OsFile f
24e0: 64 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20  d, jfd;         
24f0: 20 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63      /* File desc
2500: 72 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61  riptors for data
2510: 62 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c  base and journal
2520: 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66   */.  OsFile stf
2530: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2540: 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69    /* File descri
2550: 70 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61  ptor for the sta
2560: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
2570: 6c 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65  l*/.  int dbSize
2580: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2590: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70    /* Number of p
25a0: 61 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65  ages in the file
25b0: 20 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62   */.  int origDb
25c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
25d0: 20 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f    /* dbSize befo
25e0: 72 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  re the current c
25f0: 68 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73  hange */.  int s
2600: 74 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20  tmtSize;        
2610: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2620: 66 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70  f database (in p
2630: 61 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65  ages) at stmt_be
2640: 67 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73  gin() */.  i64 s
2650: 74 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20  tmtJSize;       
2660: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
2670: 66 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d  f journal at stm
2680: 74 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69  t_begin() */.  i
2690: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
26a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
26b0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72  mber of pages wr
26c0: 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75  itten to the jou
26d0: 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b  rnal */.  u32 ck
26e0: 73 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20  sumInit;        
26f0: 20 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72        /* Quasi-r
2700: 61 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65  andom value adde
2710: 64 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b  d to every check
2720: 73 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d  sum */.  int stm
2730: 74 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20  tNRec;          
2740: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2750: 66 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d  f records in stm
2760: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
2770: 20 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20    int nExtra;   
2780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2790: 20 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62   Add this many b
27a0: 79 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d  ytes to each in-
27b0: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
27c0: 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63   void (*xDestruc
27d0: 74 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b  tor)(void*,int);
27e0: 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f   /* Call this ro
27f0: 75 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69  utine when freei
2800: 6e 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f  ng pages */.  vo
2810: 69 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28  id (*xReiniter)(
2820: 76 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a  void*,int);   /*
2830: 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69   Call this routi
2840: 6e 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e  ne when reloadin
2850: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74  g pages */.  int
2860: 20 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20   pageSize;      
2870: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2880: 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61  er of bytes in a
2890: 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70   page */.  int p
28a0: 73 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20  sAligned;       
28b0: 20 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69         /* pageSi
28c0: 7a 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f  ze rounded up to
28d0: 20 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38   a multiple of 8
28e0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b   */.  int nPage;
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2900: 20 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65    /* Total numbe
2910: 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  r of in-memory p
2920: 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52  ages */.  int nR
2930: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
2940: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2950: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
2960: 65 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52  es with PgHdr.nR
2970: 65 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ef>0 */.  int mx
2980: 50 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20  Page;           
2990: 20 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d        /* Maximum
29a0: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
29b0: 20 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68   to hold in cach
29c0: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c  e */.  int nHit,
29d0: 20 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20   nMiss, nOvfl;  
29e0: 20 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73     /* Cache hits
29f0: 2c 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c  , missing, and L
2a00: 52 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a  RU overflows */.
2a10: 20 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69    int nRead,nWri
2a20: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  te;           /*
2a30: 20 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20   Database pages 
2a40: 72 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a  read/written */.
2a50: 20 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29    void (*xCodec)
2a60: 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e  (void*,void*,Pgn
2a70: 6f 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69  o,int); /* Routi
2a80: 6e 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69  ne for en/decodi
2a90: 6e 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69  ng data */.  voi
2aa0: 64 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20  d *pCodecArg;   
2ab0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73           /* Firs
2ac0: 74 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43  t argument to xC
2ad0: 6f 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a  odec() */.  u8 j
2ae0: 6f 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20  ournalOpen;     
2af0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2b00: 69 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  if journal file 
2b10: 64 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76  descriptors is v
2b20: 61 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75  alid */.  u8 jou
2b30: 72 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20  rnalStarted;    
2b40: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
2b50: 20 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e   header of journ
2b60: 61 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a  al is synced */.
2b70: 20 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b    u8 useJournal;
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b90: 20 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20   Use a rollback 
2ba0: 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20  journal on this 
2bb0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52  file */.  u8 noR
2bc0: 65 61 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20  eadlock;        
2bd0: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
2be0: 62 6f 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e  bother to obtain
2bf0: 20 72 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20   readlocks */.  
2c00: 75 38 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20  u8 stmtOpen;    
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
2c20: 72 75 65 20 69 66 20 74 68 65 20 73 74 61 74 65  rue if the state
2c30: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
2c40: 69 73 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20  is open */.  u8 
2c50: 73 74 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20  stmtInUse;      
2c60: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
2c70: 20 77 65 20 61 72 65 20 69 6e 20 61 20 73 74 61   we are in a sta
2c80: 74 65 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61  tement subtransa
2c90: 63 74 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74  ction */.  u8 st
2ca0: 6d 74 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20  mtAutoopen;     
2cb0: 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73         /* Open s
2cc0: 74 6d 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  tmt journal when
2cd0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73   main journal is
2ce0: 20 6f 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e   opened*/.  u8 n
2cf0: 6f 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20  oSync;          
2d00: 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f          /* Do no
2d10: 74 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  t sync the journ
2d20: 61 6c 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20  al if true */.  
2d30: 75 38 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20  u8 fullSync;    
2d40: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2d50: 6f 20 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66  o extra syncs of
2d60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72   the journal for
2d70: 20 72 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20   robustness */. 
2d80: 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20 20   u8 state;      
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2da0: 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f 53  PAGER_UNLOCK, _S
2db0: 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45 44  HARED, _RESERVED
2dc0: 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20 65  , etc. */.  u8 e
2dd0: 72 72 4d 61 73 6b 3b 20 20 20 20 20 20 20 20 20  rrMask;         
2de0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
2df0: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
2e00: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 75  of errors */.  u
2e10: 38 20 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20  8 tempFile;     
2e20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46             /* zF
2e30: 69 6c 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d  ilename is a tem
2e40: 70 6f 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20  porary file */. 
2e50: 20 75 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20   u8 readOnly;   
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2e70: 54 72 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d  True for a read-
2e80: 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f  only database */
2e90: 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20  .  u8 needSync; 
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2eb0: 2a 20 54 72 75 65 20 69 66 20 61 6e 20 66 73 79  * True if an fsy
2ec0: 6e 63 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f  nc() is needed o
2ed0: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f  n the journal */
2ee0: 0a 20 20 75 38 20 64 69 72 74 79 43 61 63 68 65  .  u8 dirtyCache
2ef0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
2f00: 2a 20 54 72 75 65 20 69 66 20 63 61 63 68 65 64  * True if cached
2f10: 20 70 61 67 65 73 20 68 61 76 65 20 63 68 61 6e   pages have chan
2f20: 67 65 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61  ged */.  u8 alwa
2f30: 79 73 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20  ysRollback;     
2f40: 20 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20       /* Disable 
2f50: 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
2f60: 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f  for all pages */
2f70: 0a 20 20 75 38 20 6d 65 6d 44 62 3b 20 20 20 20  .  u8 memDb;    
2f80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2f90: 2a 20 54 72 75 65 20 74 6f 20 69 6e 68 69 62 69  * True to inhibi
2fa0: 74 20 61 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a  t all file I/O *
2fb0: 2f 0a 20 20 75 38 20 2a 61 49 6e 4a 6f 75 72 6e  /.  u8 *aInJourn
2fc0: 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  al;             
2fd0: 2f 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65  /* One bit for e
2fe0: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
2ff0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
3000: 0a 20 20 75 38 20 2a 61 49 6e 53 74 6d 74 3b 20  .  u8 *aInStmt; 
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
3020: 2a 20 4f 6e 65 20 62 69 74 20 66 6f 72 20 65 61  * One bit for ea
3030: 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 64  ch page in the d
3040: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20  atabase */.  u8 
3050: 73 65 74 4d 61 73 74 65 72 3b 20 20 20 20 20 20  setMaster;      
3060: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
3070: 20 69 66 20 61 20 6d 2d 6a 20 6e 61 6d 65 20 68   if a m-j name h
3080: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
3090: 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20 20 42 75 73  to jrnl */.  Bus
30a0: 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48  yHandler *pBusyH
30b0: 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69 6e  andler;  /* Poin
30c0: 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62 75  ter to sqlite.bu
30d0: 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20 50  syHandler */.  P
30e0: 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a 70  gHdr *pFirst, *p
30f0: 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 69  Last;      /* Li
3100: 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65 73  st of free pages
3110: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46 69   */.  PgHdr *pFi
3120: 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20 20  rstSynced;      
3130: 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65 20    /* First free 
3140: 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72 2e  page with PgHdr.
3150: 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a 20  needSync==0 */. 
3160: 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20 20   PgHdr *pAll;   
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3180: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  List of all page
3190: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 53  s */.  PgHdr *pS
31a0: 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  tmt;            
31b0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61     /* List of pa
31c0: 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65  ges in the state
31d0: 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20  ment subjournal 
31e0: 2a 2f 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  */.  i64 journal
31f0: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3200: 20 2f 2a 20 43 75 72 72 65 6e 74 20 62 79 74 65   /* Current byte
3210: 20 6f 66 66 73 65 74 20 69 6e 20 74 68 65 20 6a   offset in the j
3220: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20  ournal file */. 
3230: 20 69 36 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b   i64 journalHdr;
3240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3250: 42 79 74 65 20 6f 66 66 73 65 74 20 74 6f 20 70  Byte offset to p
3260: 72 65 76 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20  revious journal 
3270: 68 65 61 64 65 72 20 2a 2f 0a 20 20 69 36 34 20  header */.  i64 
3280: 73 74 6d 74 48 64 72 4f 66 66 3b 20 20 20 20 20  stmtHdrOff;     
3290: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
32a0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
32b0: 77 72 69 74 74 65 6e 20 74 68 69 73 20 73 74 61  written this sta
32c0: 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20  tement */.  i64 
32d0: 73 74 6d 74 43 6b 73 75 6d 3b 20 20 20 20 20 20  stmtCksum;      
32e0: 20 20 20 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d          /* cksum
32f0: 49 6e 69 74 20 77 68 65 6e 20 73 74 61 74 65 6d  Init when statem
3300: 65 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 20  ent was started 
3310: 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72 53  */.  int sectorS
3320: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
3330: 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63 74   /* Assumed sect
3340: 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20 72  or size during r
3350: 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 50 67 48  ollback */.  PgH
3360: 64 72 20 2a 61 48 61 73 68 5b 4e 5f 50 47 5f 48  dr *aHash[N_PG_H
3370: 41 53 48 5d 3b 20 20 20 20 2f 2a 20 48 61 73 68  ASH];    /* Hash
3380: 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70 61   table to map pa
3390: 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67 48  ge number to PgH
33a0: 64 72 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  dr */.};../*.** 
33b0: 54 68 65 73 65 20 61 72 65 20 62 69 74 73 20 74  These are bits t
33c0: 68 61 74 20 63 61 6e 20 62 65 20 73 65 74 20 69  hat can be set i
33d0: 6e 20 50 61 67 65 72 2e 65 72 72 4d 61 73 6b 2e  n Pager.errMask.
33e0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45  .*/.#define PAGE
33f0: 52 5f 45 52 52 5f 46 55 4c 4c 20 20 20 20 20 30  R_ERR_FULL     0
3400: 78 30 31 20 20 2f 2a 20 61 20 77 72 69 74 65 28  x01  /* a write(
3410: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
3420: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  ine PAGER_ERR_ME
3430: 4d 20 20 20 20 20 20 30 78 30 32 20 20 2f 2a 20  M      0x02  /* 
3440: 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64 20  malloc() failed 
3450: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
3460: 5f 45 52 52 5f 4c 4f 43 4b 20 20 20 20 20 30 78  _ERR_LOCK     0x
3470: 30 34 20 20 2f 2a 20 65 72 72 6f 72 20 69 6e 20  04  /* error in 
3480: 74 68 65 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74  the locking prot
3490: 6f 63 6f 6c 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ocol */.#define 
34a0: 50 41 47 45 52 5f 45 52 52 5f 43 4f 52 52 55 50  PAGER_ERR_CORRUP
34b0: 54 20 20 30 78 30 38 20 20 2f 2a 20 64 61 74 61  T  0x08  /* data
34c0: 62 61 73 65 20 6f 72 20 6a 6f 75 72 6e 61 6c 20  base or journal 
34d0: 63 6f 72 72 75 70 74 69 6f 6e 20 2a 2f 0a 23 64  corruption */.#d
34e0: 65 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f  efine PAGER_ERR_
34f0: 44 49 53 4b 20 20 20 20 20 30 78 31 30 20 20 2f  DISK     0x10  /
3500: 2a 20 67 65 6e 65 72 61 6c 20 64 69 73 6b 20 49  * general disk I
3510: 2f 4f 20 65 72 72 6f 72 20 2d 20 62 61 64 20 68  /O error - bad h
3520: 61 72 64 20 64 72 69 76 65 3f 20 2a 2f 0a 0a 2f  ard drive? */../
3530: 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66 69 6c  *.** Journal fil
3540: 65 73 20 62 65 67 69 6e 20 77 69 74 68 20 74 68  es begin with th
3550: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 67 69  e following magi
3560: 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65 20 64  c string.  The d
3570: 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74 61 69  ata.** was obtai
3580: 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f 72 61  ned from /dev/ra
3590: 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75 73 65  ndom.  It is use
35a0: 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61 6e 69  d only as a sani
35b0: 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a 2a 20  ty check..**.** 
35c0: 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20 32 2e  Since version 2.
35d0: 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  8.0, the journal
35e0: 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69 6e 73   format contains
35f0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61 6e 69   additional sani
3600: 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 69  ty.** checking i
3610: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49 66 20  nformation.  If 
3620: 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c 73 20  the power fails 
3630: 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61  while the journa
3640: 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20 77 72  l is begin.** wr
3650: 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61 6e 64  itten, semi-rand
3660: 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74 61 20  om garbage data 
3670: 6d 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20  might appear in 
3680: 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66  the journal.** f
3690: 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65 72 20  ile after power 
36a0: 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20 49 66  is restored.  If
36b0: 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73 20 74   an attempt is t
36c0: 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 72  hen made.** to r
36d0: 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  oll the journal 
36e0: 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61 62 61  back, the databa
36f0: 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f 72 72  se could be corr
3700: 75 70 74 65 64 2e 20 20 54 68 65 20 61 64 64 69  upted.  The addi
3710: 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69 74 79  tional.** sanity
3720: 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61 20 69   checking data i
3730: 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74 6f 20  s an attempt to 
3740: 64 69 73 63 6f 76 65 72 20 74 68 65 20 67 61 72  discover the gar
3750: 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  bage in the.** j
3760: 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e 6f 72  ournal and ignor
3770: 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  e it..**.** The 
3780: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
3790: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
37a0: 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  the new journal 
37b0: 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74 73 0a  format consists.
37c0: 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74 20 63  ** of a 32-bit c
37d0: 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63 68 20  hecksum on each 
37e0: 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20 20 54  page of data.  T
37f0: 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f 76 65  he checksum cove
3800: 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65 20 70  rs both.** the p
3810: 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64 20 74  age number and t
3820: 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  he pPager->pageS
3830: 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64 61 74  ize bytes of dat
3840: 61 20 66 6f 72 20 74 68 65 20 70 61 67 65 2e 0a  a for the page..
3850: 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20 69 73  ** This cksum is
3860: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20   initialized to 
3870: 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f 6d 20  a 32-bit random 
3880: 76 61 6c 75 65 20 74 68 61 74 20 61 70 70 65 61  value that appea
3890: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a 6f 75  rs in the.** jou
38a0: 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68 74 20  rnal file right 
38b0: 61 66 74 65 72 20 74 68 65 20 68 65 61 64 65 72  after the header
38c0: 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20 69 6e  .  The random in
38d0: 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69 6d 70  itializer is imp
38e0: 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63 61 75  ortant,.** becau
38f0: 73 65 20 67 61 72 62 61 67 65 20 64 61 74 61 20  se garbage data 
3900: 74 68 61 74 20 61 70 70 65 61 72 73 20 61 74 20  that appears at 
3910: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a 6f 75  the end of a jou
3920: 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79 0a 2a  rnal is likely.*
3930: 2a 20 64 61 74 61 20 74 68 61 74 20 77 61 73 20  * data that was 
3940: 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20 66 69  once in other fi
3950: 6c 65 73 20 74 68 61 74 20 68 61 76 65 20 6e 6f  les that have no
3960: 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64 2e 20  w been deleted. 
3970: 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72 62 61   If the.** garba
3980: 67 65 20 64 61 74 61 20 63 61 6d 65 20 66 72 6f  ge data came fro
3990: 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20 6a 6f  m an obsolete jo
39a0: 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65 20  urnal file, the 
39b0: 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68 74 0a  checksums might.
39c0: 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e 20 20  ** be correct.  
39d0: 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c 69 7a  But by initializ
39e0: 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75 6d  ing the checksum
39f0: 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65   to random value
3a00: 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64 69 66   which.** is dif
3a10: 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65 72 79  ferent for every
3a20: 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d 69 6e   journal, we min
3a30: 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73 6b 2e  imize that risk.
3a40: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73 74  .*/.static const
3a50: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61   unsigned char a
3a60: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 20 3d  JournalMagic[] =
3a70: 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64 35 2c   {.  0xd9, 0xd5,
3a80: 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30 78 32   0x05, 0xf9, 0x2
3a90: 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c 20 30  0, 0xa1, 0x63, 0
3aa0: 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54  xd7,.};../*.** T
3ab0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 68  he size of the h
3ac0: 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65 61 63  eader and of eac
3ad0: 68 20 70 61 67 65 20 69 6e 20 74 68 65 20 6a 6f  h page in the jo
3ae0: 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72 6d 69  urnal is determi
3af0: 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 66 6f  ned.** by the fo
3b00: 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73 2e 0a  llowing macros..
3b10: 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55 52 4e  */.#define JOURN
3b20: 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65 72 29  AL_PG_SZ(pPager)
3b30: 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61 67 65    ((pPager->page
3b40: 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a 0a 2a  Size) + 8)../*.*
3b50: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  * The journal he
3b60: 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20 74 68  ader size for th
3b70: 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74 68 65  is pager. In the
3b80: 20 66 75 74 75 72 65 2c 20 74 68 69 73 20 63 6f   future, this co
3b90: 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20 74 6f  uld be.** set to
3ba0: 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65 61 64   some value read
3bb0: 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b 20 63   from the disk c
3bc0: 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65 20 69  ontroller. The i
3bd0: 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68 61 72  mportant.** char
3be0: 61 63 74 65 72 69 73 74 69 63 20 69 73 20 74 68  acteristic is th
3bf0: 61 74 20 69 74 20 69 73 20 74 68 65 20 73 61 6d  at it is the sam
3c00: 65 20 73 69 7a 65 20 61 73 20 61 20 64 69 73 6b  e size as a disk
3c10: 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64 65 66   sector..*/.#def
3c20: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ine JOURNAL_HDR_
3c30: 53 5a 28 70 50 61 67 65 72 29 20 28 70 50 61 67  SZ(pPager) (pPag
3c40: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29 0a  er->sectorSize).
3c50: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63 72 6f  ./*.** The macro
3c60: 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65 20 69   MEMDB is true i
3c70: 66 20 77 65 20 61 72 65 20 64 65 61 6c 69 6e 67  f we are dealing
3c80: 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65 6d 6f   with an in-memo
3c90: 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  ry database..** 
3ca0: 57 65 20 64 6f 20 74 68 69 73 20 61 73 20 61 20  We do this as a 
3cb0: 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20 69 66  macro so that if
3cc0: 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54   the SQLITE_OMIT
3cd0: 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72 6f 20  _MEMORYDB macro 
3ce0: 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65 20 76  is set,.** the v
3cf0: 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20 77 69  alue of MEMDB wi
3d00: 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61 6e 74  ll be a constant
3d10: 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69 6c 65   and the compile
3d20: 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a 65 0a  r will optimize.
3d30: 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68 61 74  ** out code that
3d40: 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65 78 65   would never exe
3d50: 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  cute..*/.#ifdef 
3d60: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
3d70: 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20 4d 45  RYDB.# define ME
3d80: 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20 64 65  MDB 0.#else.# de
3d90: 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61 67 65  fine MEMDB pPage
3da0: 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69 66 0a  r->memDb.#endif.
3db0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 64 65 66 61 75  ./*.** The defau
3dc0: 6c 74 20 73 69 7a 65 20 6f 66 20 61 20 64 69 73  lt size of a dis
3dd0: 6b 20 73 65 63 74 6f 72 0a 2a 2f 0a 23 64 65 66  k sector.*/.#def
3de0: 69 6e 65 20 50 41 47 45 52 5f 53 45 43 54 4f 52  ine PAGER_SECTOR
3df0: 5f 53 49 5a 45 20 35 31 32 0a 0a 2f 2a 0a 2a 2a  _SIZE 512../*.**
3e00: 20 50 61 67 65 20 6e 75 6d 62 65 72 20 50 41 47   Page number PAG
3e10: 45 52 5f 4d 4a 5f 50 47 4e 4f 20 69 73 20 6e 65  ER_MJ_PGNO is ne
3e20: 76 65 72 20 75 73 65 64 20 69 6e 20 61 6e 20 53  ver used in an S
3e30: 51 4c 69 74 65 20 64 61 74 61 62 61 73 65 20 28  QLite database (
3e40: 69 74 20 69 73 0a 2a 2a 20 72 65 73 65 72 76 65  it is.** reserve
3e50: 64 20 66 6f 72 20 77 6f 72 6b 69 6e 67 20 61 72  d for working ar
3e60: 6f 75 6e 64 20 61 20 77 69 6e 64 6f 77 73 2f 70  ound a windows/p
3e70: 6f 73 69 78 20 69 6e 63 6f 6d 70 61 74 69 62 69  osix incompatibi
3e80: 6c 69 74 79 29 2e 20 49 74 20 69 73 0a 2a 2a 20  lity). It is.** 
3e90: 75 73 65 64 20 69 6e 20 74 68 65 20 6a 6f 75 72  used in the jour
3ea0: 6e 61 6c 20 74 6f 20 73 69 67 6e 69 66 79 20 74  nal to signify t
3eb0: 68 61 74 20 74 68 65 20 72 65 6d 61 69 6e 64 65  hat the remainde
3ec0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
3ed0: 20 66 69 6c 65 20 0a 2a 2a 20 69 73 20 64 65 76   file .** is dev
3ee0: 6f 74 65 64 20 74 6f 20 73 74 6f 72 69 6e 67 20  oted to storing 
3ef0: 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  a master journal
3f00: 20 6e 61 6d 65 20 2d 20 74 68 65 72 65 20 61 72   name - there ar
3f10: 65 20 6e 6f 20 6d 6f 72 65 20 70 61 67 65 73 20  e no more pages 
3f20: 74 6f 0a 2a 2a 20 72 6f 6c 6c 20 62 61 63 6b 2e  to.** roll back.
3f30: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 66 6f   See comments fo
3f40: 72 20 66 75 6e 63 74 69 6f 6e 20 77 72 69 74 65  r function write
3f50: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 29 20  MasterJournal() 
3f60: 66 6f 72 20 64 65 74 61 69 6c 73 2e 0a 2a 2f 0a  for details..*/.
3f70: 2f 2a 20 23 64 65 66 69 6e 65 20 50 41 47 45 52  /* #define PAGER
3f80: 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28 50 45 4e  _MJ_PGNO(x) (PEN
3f90: 44 49 4e 47 5f 42 59 54 45 2f 28 28 78 29 2d 3e  DING_BYTE/((x)->
3fa0: 70 61 67 65 53 69 7a 65 29 29 20 2a 2f 0a 23 64  pageSize)) */.#d
3fb0: 65 66 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50  efine PAGER_MJ_P
3fc0: 47 4e 4f 28 78 29 20 28 28 50 45 4e 44 49 4e 47  GNO(x) ((PENDING
3fd0: 5f 42 59 54 45 2f 28 28 78 29 2d 3e 70 61 67 65  _BYTE/((x)->page
3fe0: 53 69 7a 65 29 29 2b 31 29 0a 0a 2f 2a 0a 2a 2a  Size))+1)../*.**
3ff0: 20 54 68 65 20 6d 61 78 69 6d 75 6d 20 6c 65 67   The maximum leg
4000: 61 6c 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69  al page number i
4010: 73 20 28 32 5e 33 31 20 2d 20 31 29 2e 0a 2a 2f  s (2^31 - 1)..*/
4020: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 4d  .#define PAGER_M
4030: 41 58 5f 50 47 4e 4f 20 32 31 34 37 34 38 33 36  AX_PGNO 21474836
4040: 34 37 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  47../*.** Enable
4050: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
4060: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
4070: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
4080: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4090: 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67  _DEBUG.  int pag
40a0: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
40b0: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
40c0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
40d0: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
40e0: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
40f0: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
4100: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
4110: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
4120: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4130: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4140: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4150: 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  =%p nRef=%d\n",.
4160: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
4170: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
4180: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
4190: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
41a0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
41b0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
41c0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
41d0: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
41e0: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
41f0: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
4200: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4210: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
4220: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
4230: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
4240: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
4250: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
4260: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
4270: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
4280: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
4290: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
42a0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
42b0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
42c0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
42d0: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
42e0: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
42f0: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
4300: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4310: 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c  read32bits(OsFil
4320: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
4330: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
4340: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
4350: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4360: 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65   &res, sizeof(re
4370: 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  s));.  if( rc==S
4380: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
4390: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
43a0: 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [4];.    memcpy(
43b0: 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20  ac, &res, 4);.  
43c0: 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c    res = (ac[0]<<
43d0: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
43e0: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
43f0: 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70   ac[3];.  }.  *p
4400: 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74  Res = res;.  ret
4410: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4420: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4430: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
4440: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4450: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
4460: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
4470: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
4480: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
4490: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
44a0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
44b0: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
44c0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
44d0: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
44e0: 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d  r ac[4];.  ac[0]
44f0: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
4500: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
4510: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
4520: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
4530: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
4540: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
4550: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4560: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
4570: 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 4);.}../*.** W
4580: 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20  rite the 32-bit 
4590: 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e  integer 'val' in
45a0: 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  to the page iden
45b0: 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68  tified by page h
45c0: 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20  eader.** 'p' at 
45d0: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e  offset 'offset'.
45e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
45f0: 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20  store32bits(u32 
4600: 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69  val, PgHdr *p, i
4610: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
4620: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
4630: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
4640: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
4650: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
4660: 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  et];.  ac[0] = (
4670: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
4680: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
4690: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
46a0: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
46b0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
46c0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a  = val & 0xff;.}.
46d0: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
46e0: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20  -bit integer at 
46f0: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20  offset 'offset' 
4700: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64  from the page id
4710: 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
4720: 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a  age header 'p'..
4730: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65  */.static u32 re
4740: 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48  trieve32bits(PgH
4750: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
4760: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
4770: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
4780: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
4790: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
47a0: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72  p))[offset];.  r
47b0: 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34  eturn (ac[0]<<24
47c0: 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20  ) | (ac[1]<<16) 
47d0: 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61  | (ac[2]<<8) | a
47e0: 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  c[3];.}.../*.** 
47f0: 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73  Convert the bits
4800: 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e   in the pPager->
4810: 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20  errMask into an 
4820: 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65  approprate.** re
4830: 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  turn code..*/.st
4840: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4850: 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50  rrcode(Pager *pP
4860: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
4870: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
4880: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
4890: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c  sk & PAGER_ERR_L
48a0: 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  OCK )    rc = SQ
48b0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20  LITE_PROTOCOL;. 
48c0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
48d0: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
48e0: 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20  _DISK )    rc = 
48f0: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
4900: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
4910: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
4920: 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53  FULL )    rc = S
4930: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66  QLITE_FULL;.  if
4940: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4950: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  k & PAGER_ERR_ME
4960: 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c  M )     rc = SQL
4970: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
4980: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
4990: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52   & PAGER_ERR_COR
49a0: 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49  RUPT ) rc = SQLI
49b0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65  TE_CORRUPT;.  re
49c0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 64  turn rc;.}..#ifd
49d0: 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
49e0: 50 41 47 45 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75  PAGES./*.** Retu
49f0: 72 6e 20 61 20 33 32 2d 62 69 74 20 68 61 73 68  rn a 32-bit hash
4a00: 20 6f 66 20 74 68 65 20 70 61 67 65 20 64 61 74   of the page dat
4a10: 61 20 66 6f 72 20 70 50 61 67 65 2e 0a 2a 2f 0a  a for pPage..*/.
4a20: 73 74 61 74 69 63 20 75 33 32 20 70 61 67 65 72  static u32 pager
4a30: 5f 70 61 67 65 68 61 73 68 28 50 67 48 64 72 20  _pagehash(PgHdr 
4a40: 2a 70 50 61 67 65 29 7b 0a 20 20 75 33 32 20 68  *pPage){.  u32 h
4a50: 61 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  ash = 0;.  int i
4a60: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
4a70: 72 20 2a 70 44 61 74 61 20 3d 20 28 75 6e 73 69  r *pData = (unsi
4a80: 67 6e 65 64 20 63 68 61 72 20 2a 29 50 47 48 44  gned char *)PGHD
4a90: 52 5f 54 4f 5f 44 41 54 41 28 70 50 61 67 65 29  R_TO_DATA(pPage)
4aa0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4ab0: 50 61 67 65 2d 3e 70 50 61 67 65 72 2d 3e 70 61  Page->pPager->pa
4ac0: 67 65 53 69 7a 65 3b 20 69 2b 2b 29 7b 0a 20 20  geSize; i++){.  
4ad0: 20 20 68 61 73 68 20 3d 20 28 68 61 73 68 2b 69    hash = (hash+i
4ae0: 29 5e 70 44 61 74 61 5b 69 5d 3b 0a 20 20 7d 0a  )^pData[i];.  }.
4af0: 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b 0a 7d    return hash;.}
4b00: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43  ../*.** The CHEC
4b10: 4b 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b  K_PAGE macro tak
4b20: 65 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61  es a PgHdr* as a
4b30: 6e 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53  n argument. If S
4b40: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
4b50: 53 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c  S.** is defined,
4b60: 20 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e   and NDEBUG is n
4b70: 6f 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61  ot defined, an a
4b80: 73 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e  ssert() statemen
4b90: 74 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74  t checks.** that
4ba0: 20 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74   the page is eit
4bb0: 68 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69  her dirty or sti
4bc0: 6c 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63  ll matches the c
4bd0: 61 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68  alculated page-h
4be0: 61 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ash..*/.#define 
4bf0: 43 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68  CHECK_PAGE(x) ch
4c00: 65 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69  eckPage(x).stati
4c10: 63 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65  c void checkPage
4c20: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
4c30: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
4c40: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61  pPg->pPager;.  a
4c50: 73 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67  ssert( !pPg->pag
4c60: 65 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d  eHash || pPager-
4c70: 3e 65 72 72 4d 61 73 6b 20 7c 7c 20 4d 45 4d 44  >errMask || MEMD
4c80: 42 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20  B || pPg->dirty 
4c90: 7c 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  || .      pPg->p
4ca0: 61 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70  ageHash==pager_p
4cb0: 61 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a  agehash(pPg) );.
4cc0: 7d 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  }..#else.#define
4cd0: 20 43 48 45 43 4b 5f 50 41 47 45 28 78 29 0a 23   CHECK_PAGE(x).#
4ce0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 57 68 65  endif../*.** Whe
4cf0: 6e 20 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64  n this is called
4d00: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
4d10: 65 20 66 6f 72 20 70 61 67 65 72 20 70 50 61 67  e for pager pPag
4d20: 65 72 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e  er must be open.
4d30: 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a  .** The master j
4d40: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65  ournal file name
4d50: 20 69 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68   is read from th
4d60: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c  e end of the fil
4d70: 65 20 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65  e and .** writte
4d80: 6e 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62  n into memory ob
4d90: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
4da0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d  teMalloc(). *pzM
4db0: 61 73 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20  aster is.** set 
4dc0: 74 6f 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20  to point at the 
4dd0: 6d 65 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54  memory and SQLIT
4de0: 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54  E_OK returned. T
4df0: 68 65 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a  he caller must.*
4e00: 2a 20 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a  * sqliteFree() *
4e10: 70 7a 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  pzMaster..**.** 
4e20: 49 66 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75  If no master jou
4e30: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
4e40: 73 20 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73  s present *pzMas
4e50: 74 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20  ter is set to 0 
4e60: 61 6e 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b  and.** SQLITE_OK
4e70: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74   returned..*/.st
4e80: 61 74 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73  atic int readMas
4e90: 74 65 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c  terJournal(OsFil
4ea0: 65 20 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a  e *pJrnl, char *
4eb0: 2a 70 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e  *pzMaster){.  in
4ec0: 74 20 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b  t rc;.  u32 len;
4ed0: 0a 20 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33  .  i64 szJ;.  u3
4ee0: 32 20 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69  2 cksum;.  int i
4ef0: 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
4f00: 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20  r aMagic[8]; /* 
4f10: 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64  A buffer to hold
4f20: 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65   the magic heade
4f30: 72 20 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65  r */..  *pzMaste
4f40: 72 20 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73  r = 0;..  rc = s
4f50: 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
4f60: 28 70 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20  (pJrnl, &szJ);. 
4f70: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4f80: 4f 4b 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72  OK || szJ<16 ) r
4f90: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20  eturn rc;..  rc 
4fa0: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
4fb0: 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a  pJrnl, szJ-16);.
4fc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4fd0: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
4fe0: 0a 20 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  . .  rc = read32
4ff0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e  bits(pJrnl, &len
5000: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
5010: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
5020: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
5030: 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63  32bits(pJrnl, &c
5040: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
5050: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
5060: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
5070: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
5080: 72 6e 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b  rnl, aMagic, 8);
5090: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
50a0: 45 5f 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61  E_OK || memcmp(a
50b0: 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d  Magic, aJournalM
50c0: 61 67 69 63 2c 20 38 29 20 29 20 72 65 74 75 72  agic, 8) ) retur
50d0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
50e0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e  lite3OsSeek(pJrn
50f0: 6c 2c 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a  l, szJ-16-len);.
5100: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
5110: 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b  _OK ) return rc;
5120: 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20  ..  *pzMaster = 
5130: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
5140: 6c 6c 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69  lloc(len+1);.  i
5150: 66 28 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b  f( !*pzMaster ){
5160: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
5170: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20  TE_NOMEM;.  }.  
5180: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
5190: 61 64 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73  ad(pJrnl, *pzMas
51a0: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
51b0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
51c0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
51d0: 28 2a 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  (*pzMaster);.   
51e0: 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a   *pzMaster = 0;.
51f0: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
5200: 20 7d 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20   }..  /* See if 
5210: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74  the checksum mat
5220: 63 68 65 73 20 74 68 65 20 6d 61 73 74 65 72 20  ches the master 
5230: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a  journal name */.
5240: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
5250: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
5260: 6d 20 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29  m -= (*pzMaster)
5270: 5b 69 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  [i];.  }.  if( c
5280: 6b 73 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49  ksum ){.    /* I
5290: 66 20 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64  f the checksum d
52a0: 6f 65 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74  oesn't add up, t
52b0: 68 65 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  hen one or more 
52c0: 6f 66 20 74 68 65 20 64 69 73 6b 20 73 65 63 74  of the disk sect
52d0: 6f 72 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61  ors.    ** conta
52e0: 69 6e 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72  ining the master
52f0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d   journal filenam
5300: 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20  e is corrupted. 
5310: 54 68 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a  This means.    *
5320: 2a 20 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c  * definitely rol
5330: 6c 20 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20  l back, so just 
5340: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
5350: 20 61 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e   and report a (n
5360: 75 6c 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65  ul).    ** maste
5370: 72 2d 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61  r-journal filena
5380: 6d 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  me..    */.    s
5390: 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73  qliteFree(*pzMas
53a0: 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73  ter);.    *pzMas
53b0: 74 65 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65  ter = 0;.  }else
53c0: 7b 0a 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72  {.    (*pzMaster
53d0: 29 5b 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20  )[len] = '\0';. 
53e0: 20 7d 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20   }.   .  return 
53f0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
5400: 0a 2a 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75  .** Seek the jou
5410: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
5420: 70 74 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74  ptor to the next
5430: 20 73 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79   sector boundary
5440: 20 77 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72   where a.** jour
5450: 6e 61 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62  nal header may b
5460: 65 20 72 65 61 64 20 6f 72 20 77 72 69 74 74 65  e read or writte
5470: 6e 2e 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c  n. Pager.journal
5480: 4f 66 66 20 69 73 20 75 70 64 61 74 65 64 20 77  Off is updated w
5490: 69 74 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73  ith.** the new s
54a0: 65 65 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a  eek offset..**.*
54b0: 2a 20 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74  * i.e for a sect
54c0: 6f 72 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a  or size of 512:.
54d0: 2a 2a 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73  **.** Input Offs
54e0: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
54f0: 4f 75 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a  Output Offset.**
5500: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
5510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5520: 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20  --------.** 0   
5530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5540: 20 20 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20        0.** 512  
5550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5560: 20 20 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20       512.** 100 
5570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5580: 20 20 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30        512.** 200
5590: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0               
55a0: 20 20 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a         2048.** .
55b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65  */.static int se
55c0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67  ekJournalHdr(Pag
55d0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
55e0: 36 34 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20  64 offset = 0;. 
55f0: 20 69 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d   i64 c = pPager-
5600: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69  >journalOff;.  i
5610: 66 28 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73  f( c ){.    offs
5620: 65 74 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52  et = ((c-1)/JOUR
5630: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
5640: 72 29 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41  r) + 1) * JOURNA
5650: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5660: 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
5670: 6f 66 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48  offset%JOURNAL_H
5680: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30  DR_SZ(pPager)==0
5690: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66   );.  assert( of
56a0: 66 73 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73  fset>=c );.  ass
56b0: 65 72 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c  ert( (offset-c)<
56c0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
56d0: 50 61 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67  Pager) );.  pPag
56e0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
56f0: 20 6f 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72   offset;.  retur
5700: 6e 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  n sqlite3OsSeek(
5710: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
5720: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5730: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  );.}../*.** The 
5740: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
5750: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
5760: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5770: 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c  alled. A journal
5780: 0a 2a 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52  .** header (JOUR
5790: 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73  NAL_HDR_SZ bytes
57a0: 29 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  ) is written int
57b0: 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
57c0: 6c 65 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72  le at the.** cur
57d0: 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  rent location..*
57e0: 2a 0a 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20  *.** The format 
57f0: 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  for the journal 
5800: 68 65 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c  header is as fol
5810: 6c 6f 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74  lows:.** - 8 byt
5820: 65 73 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69  es: Magic identi
5830: 66 79 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f  fying journal fo
5840: 72 6d 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  rmat..** - 4 byt
5850: 65 73 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65  es: Number of re
5860: 63 6f 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c  cords in journal
5870: 2c 20 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20  , or -1 no-sync 
5880: 6d 6f 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d  mode is on..** -
5890: 20 34 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d   4 bytes: Random
58a0: 20 6e 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72   number used for
58b0: 20 70 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d   page hash..** -
58c0: 20 34 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61   4 bytes: Initia
58d0: 6c 20 64 61 74 61 62 61 73 65 20 70 61 67 65 20  l database page 
58e0: 63 6f 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79  count..** - 4 by
58f0: 74 65 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65  tes: Sector size
5900: 20 75 73 65 64 20 62 79 20 74 68 65 20 70 72 6f   used by the pro
5910: 63 65 73 73 20 74 68 61 74 20 77 72 6f 74 65 20  cess that wrote 
5920: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a  this journal..**
5930: 20 0a 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79   .** Followed by
5940: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5950: 20 2d 20 32 34 29 20 62 79 74 65 73 20 6f 66 20   - 24) bytes of 
5960: 75 6e 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f  unused space..*/
5970: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 72 69 74  .static int writ
5980: 65 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65  eJournalHdr(Page
5990: 72 20 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69  r *pPager){..  i
59a0: 6e 74 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72  nt rc = seekJour
59b0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
59c0: 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
59d0: 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d  n rc;..  pPager-
59e0: 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50  >journalHdr = pP
59f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5a00: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
5a10: 73 74 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b  stmtHdrOff==0 ){
5a20: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
5a30: 74 48 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72  tHdrOff = pPager
5a40: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20  ->journalHdr;.  
5a50: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
5a60: 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41  nalOff += JOURNA
5a70: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
5a80: 3b 0a 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20  ;..  /* FIX ME: 
5a90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69  .  **.  ** Possi
5aa0: 62 6c 79 20 66 6f 72 20 61 20 70 61 67 65 72 20  bly for a pager 
5ab0: 6e 6f 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  not in no-sync m
5ac0: 6f 64 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ode, the journal
5ad0: 20 6d 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f   magic should no
5ae0: 74 0a 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65  t.  ** be writte
5af0: 6e 20 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20  n until nRec is 
5b00: 66 69 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72  filled in as par
5b10: 74 20 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f  t of next syncJo
5b20: 75 72 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20  urnal(). .  **. 
5b30: 20 2a 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79   ** Actually may
5b40: 62 65 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75  be the whole jou
5b50: 72 6e 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75  rnal header shou
5b60: 6c 64 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e  ld be delayed un
5b70: 74 69 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f  til that.  ** po
5b80: 69 6e 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74  int. Think about
5b90: 20 74 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63   this..  */.  rc
5ba0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74   = sqlite3OsWrit
5bb0: 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  e(&pPager->jfd, 
5bc0: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73  aJournalMagic, s
5bd0: 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
5be0: 67 69 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63  gic));..  if( rc
5bf0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5c00: 20 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46     /* The nRec F
5c10: 69 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46  ield. 0xFFFFFFFF
5c20: 20 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75   for no-sync jou
5c30: 72 6e 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63  rnals. */.    rc
5c40: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
5c50: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5c60: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78  ger->noSync ? 0x
5c70: 66 66 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20  ffffffff : 0);. 
5c80: 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
5c90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a  ITE_OK ){.    /*
5ca0: 20 54 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63   The random chec
5cb0: 6b 2d 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73  k-hash initialis
5cc0: 65 72 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74  er */ .    sqlit
5cd0: 65 33 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  e3Randomness(siz
5ce0: 65 6f 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75  eof(pPager->cksu
5cf0: 6d 49 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d  mInit), &pPager-
5d00: 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20  >cksumInit);.   
5d10: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
5d20: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
5d30: 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69  pPager->cksumIni
5d40: 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  t);.  }.  if( rc
5d50: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
5d60: 20 20 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61     /* The initia
5d70: 6c 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  l database size 
5d80: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
5d90: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5da0: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62  >jfd, pPager->db
5db0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Size);.  }.  if(
5dc0: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5dd0: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73  {.    /* The ass
5de0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
5df0: 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73   for this proces
5e00: 73 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72  s */.    rc = wr
5e10: 69 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65  ite32bits(&pPage
5e20: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
5e30: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d  sectorSize);.  }
5e40: 0a 0a 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e  ..  /* The journ
5e50: 61 6c 20 68 65 61 64 65 72 20 68 61 73 20 62 65  al header has be
5e60: 65 6e 20 77 72 69 74 74 65 6e 20 73 75 63 63 65  en written succe
5e70: 73 73 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68  ssfully. Seek th
5e80: 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66  e journal.  ** f
5e90: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 74  ile descriptor t
5ea0: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  o the end of the
5eb0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5ec0: 73 65 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69  sector..  */.  i
5ed0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5ee0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
5ef0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a  sSeek(&pPager->j
5f00: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
5f10: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72  nalOff-1);.    r
5f20: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
5f30: 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
5f40: 20 22 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d   "\000", 1);.  }
5f50: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
5f60: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
5f70: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
5f80: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
5f90: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
5fa0: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
5fb0: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
5fc0: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
5fd0: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
5fe0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
5ff0: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
6000: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
6010: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
6020: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
6030: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
6040: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
6050: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
6060: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
6070: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
6080: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
6090: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
60a0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
60b0: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
60c0: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
60d0: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
60e0: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
60f0: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
6100: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
6110: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
6120: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
6130: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
6140: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
6150: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
6160: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
6170: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
6180: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
6190: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
61a0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
61b0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
61c0: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
61d0: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
61e0: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
61f0: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
6200: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
6210: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
6220: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
6230: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
6240: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
6250: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
6260: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
6270: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
6280: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
6290: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
62a0: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
62b0: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
62c0: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
62d0: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
62e0: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
62f0: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
6300: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
6310: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
6320: 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65  er */..  rc = se
6330: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
6340: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
6350: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
6360: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
6370: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
6380: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
6390: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
63a0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
63b0: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
63c0: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
63d0: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d  &pPager->jfd, aM
63e0: 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61  agic, sizeof(aMa
63f0: 67 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20  gic));.  if( rc 
6400: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6410: 69 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69  if( memcmp(aMagi
6420: 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  c, aJournalMagic
6430: 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29  , sizeof(aMagic)
6440: 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  )!=0 ){.    retu
6450: 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a  rn SQLITE_DONE;.
6460: 20 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64    }..  rc = read
6470: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
6480: 6a 66 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69  jfd, pNRec);.  i
6490: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
64a0: 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33  c;..  rc = read3
64b0: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
64c0: 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73  fd, &pPager->cks
64d0: 75 6d 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72  umInit);.  if( r
64e0: 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  c ) return rc;..
64f0: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6500: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
6510: 70 44 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  pDbSize);.  if( 
6520: 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
6530: 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65  .  /* Update the
6540: 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d   assumed sector-
6550: 73 69 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68  size to match th
6560: 65 20 76 61 6c 75 65 20 75 73 65 64 20 62 79 20  e value used by 
6570: 0a 20 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73  .  ** the proces
6580: 73 20 74 68 61 74 20 63 72 65 61 74 65 64 20 74  s that created t
6590: 68 69 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20  his journal. If 
65a0: 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73  this journal was
65b0: 0a 20 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79  .  ** created by
65c0: 20 61 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72   a process other
65d0: 20 74 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20   than this one, 
65e0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
65f0: 65 0a 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20  e.  ** is being 
6600: 63 61 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68  called from with
6610: 69 6e 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  in pager_playbac
6620: 6b 28 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76  k(). The local v
6630: 61 6c 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67  alue.  ** of Pag
6640: 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73  er.sectorSize is
6650: 20 72 65 73 74 6f 72 65 64 20 61 74 20 74 68 65   restored at the
6660: 20 65 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75   end of that rou
6670: 74 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20  tine..  */.  rc 
6680: 3d 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50  = read32bits(&pP
6690: 61 67 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20  ager->jfd, (u32 
66a0: 2a 29 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f  *)&pPager->secto
66b0: 72 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  rSize);.  if( rc
66c0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
66d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
66e0: 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48  Off += JOURNAL_H
66f0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20  DR_SZ(pPager);. 
6700: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
6710: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
6720: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
6730: 6c 4f 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  lOff);.  return 
6740: 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72  rc;.}.../*.** Wr
6750: 69 74 65 20 74 68 65 20 73 75 70 70 6c 69 65 64  ite the supplied
6760: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6770: 6e 61 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f  name into the jo
6780: 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70  urnal file for p
6790: 61 67 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61  ager.** pPager a
67a0: 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f  t the current lo
67b0: 63 61 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74  cation. The mast
67c0: 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20  er journal name 
67d0: 6d 75 73 74 20 62 65 20 74 68 65 20 6c 61 73 74  must be the last
67e0: 0a 2a 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65  .** thing writte
67f0: 6e 20 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66  n to a journal f
6800: 69 6c 65 2e 20 49 66 20 74 68 65 20 70 61 67 65  ile. If the page
6810: 72 20 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e  r is in full-syn
6820: 63 20 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a  c mode, the.** j
6830: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63  ournal file desc
6840: 72 69 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63  riptor is advanc
6850: 65 64 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  ed to the next s
6860: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62  ector boundary b
6870: 65 66 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e  efore.** anythin
6880: 67 20 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68  g is written. Th
6890: 65 20 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a  e format is:.**.
68a0: 2a 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41  ** + 4 bytes: PA
68b0: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20  GER_MJ_PGNO..** 
68c0: 2b 20 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74  + N bytes: lengt
68d0: 68 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72  h of master jour
68e0: 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34  nal name..** + 4
68f0: 20 62 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34   bytes: N.** + 4
6900: 20 62 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a   bytes: Master j
6910: 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63  ournal name chec
6920: 6b 73 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74  ksum..** + 8 byt
6930: 65 73 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  es: aJournalMagi
6940: 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d  c[]..**.** The m
6950: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61  aster journal pa
6960: 67 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74  ge checksum is t
6970: 68 65 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79  he sum of the by
6980: 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65  tes in the maste
6990: 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  r.** journal nam
69a0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
69b0: 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72   writeMasterJour
69c0: 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
69d0: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
69e0: 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72  Master){.  int r
69f0: 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20  c;.  int len; . 
6a00: 20 69 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63   int i; .  u32 c
6a10: 6b 73 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66  ksum = 0; ..  if
6a20: 28 20 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50  ( !zMaster || pP
6a30: 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29  ager->setMaster)
6a40: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
6a50: 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  K;.  pPager->set
6a60: 4d 61 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c  Master = 1;..  l
6a70: 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73  en = strlen(zMas
6a80: 74 65 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  ter);.  for(i=0;
6a90: 20 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20   i<len; i++){.  
6aa0: 20 20 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74    cksum += zMast
6ab0: 65 72 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  er[i];.  }..  /*
6ac0: 20 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63   If in full-sync
6ad0: 20 6d 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74   mode, advance t
6ae0: 6f 20 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20  o the next disk 
6af0: 73 65 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72  sector before wr
6b00: 69 74 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d  iting.  ** the m
6b10: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
6b20: 6d 65 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63  me. This is in c
6b30: 61 73 65 20 74 68 65 20 70 72 65 76 69 6f 75 73  ase the previous
6b40: 20 70 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f   page written to
6b50: 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61  .  ** the journa
6b60: 6c 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  l has already be
6b70: 65 6e 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a  en synced..  */.
6b80: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
6b90: 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63  llSync ){.    rc
6ba0: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
6bb0: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  r(pPager);.    i
6bc0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
6bd0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
6be0: 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  }.  pPager->jour
6bf0: 6e 61 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32  nalOff += (len+2
6c00: 30 29 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  0);..  rc = writ
6c10: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
6c20: 3e 6a 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50  >jfd, PAGER_MJ_P
6c30: 47 4e 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20  GNO(pPager));.  
6c40: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
6c50: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6c60: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
6c70: 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a  Write(&pPager->j
6c80: 66 64 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e  fd, zMaster, len
6c90: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6ca0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6cb0: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74  rc;..  rc = writ
6cc0: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
6cd0: 3e 6a 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66  >jfd, len);.  if
6ce0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6cf0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6d00: 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73  rc = write32bits
6d10: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63  (&pPager->jfd, c
6d20: 6b 73 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21  ksum);.  if( rc!
6d30: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
6d40: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
6d50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26  sqlite3OsWrite(&
6d60: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f  pPager->jfd, aJo
6d70: 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65  urnalMagic, size
6d80: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
6d90: 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ));.  pPager->ne
6da0: 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65  edSync = 1;.  re
6db0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
6dc0: 2a 20 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20  * Add or remove 
6dd0: 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  a page from the 
6de0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
6df0: 73 20 74 68 61 74 20 61 72 65 20 69 6e 20 74 68  s that are in th
6e00: 65 0a 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a  e.** statement j
6e10: 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  ournal..**.** Th
6e20: 65 20 50 61 67 65 72 20 6b 65 65 70 73 20 61 20  e Pager keeps a 
6e30: 73 65 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66  separate list of
6e40: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
6e50: 63 75 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20  currently in.** 
6e60: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  the statement jo
6e70: 75 72 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c  urnal.  This hel
6e80: 70 73 20 74 68 65 20 73 71 6c 69 74 65 33 70 61  ps the sqlite3pa
6e90: 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28  ger_stmt_commit(
6ea0: 29 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e  ).** routine run
6eb0: 20 4d 55 43 48 20 66 61 73 74 65 72 20 66 6f 72   MUCH faster for
6ec0: 20 74 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65   the common case
6ed0: 20 77 68 65 72 65 20 74 68 65 72 65 20 61 72 65   where there are
6ee0: 20 6d 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69   many.** pages i
6ef0: 6e 20 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c  n memory but onl
6f00: 79 20 61 20 66 65 77 20 61 72 65 20 69 6e 20 74  y a few are in t
6f10: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
6f20: 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rnal..*/.static 
6f30: 76 6f 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f  void page_add_to
6f40: 5f 73 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72  _stmt_list(PgHdr
6f50: 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20   *pPg){.  Pager 
6f60: 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70  *pPager = pPg->p
6f70: 50 61 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67  Pager;.  if( pPg
6f80: 2d 3e 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72  ->inStmt ) retur
6f90: 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  n;.  assert( pPg
6fa0: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26  ->pPrevStmt==0 &
6fb0: 26 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  & pPg->pNextStmt
6fc0: 3d 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50  ==0 );.  pPg->pP
6fd0: 72 65 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  revStmt = 0;.  i
6fe0: 66 28 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74  f( pPager->pStmt
6ff0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
7000: 70 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  pStmt->pPrevStmt
7010: 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50   = pPg;.  }.  pP
7020: 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  g->pNextStmt = p
7030: 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20  Pager->pStmt;.  
7040: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
7050: 70 50 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74  pPg;.  pPg->inSt
7060: 6d 74 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63  mt = 1;.}.static
7070: 20 76 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76   void page_remov
7080: 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74  e_from_stmt_list
7090: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
70a0: 69 66 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74  if( !pPg->inStmt
70b0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
70c0: 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20   pPg->pPrevStmt 
70d0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
70e0: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70  Pg->pPrevStmt->p
70f0: 4e 65 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b  NextStmt==pPg );
7100: 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53  .    pPg->pPrevS
7110: 74 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  tmt->pNextStmt =
7120: 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b   pPg->pNextStmt;
7130: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
7140: 73 65 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65  sert( pPg->pPage
7150: 72 2d 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b  r->pStmt==pPg );
7160: 0a 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72  .    pPg->pPager
7170: 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  ->pStmt = pPg->p
7180: 4e 65 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20  NextStmt;.  }.  
7190: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  if( pPg->pNextSt
71a0: 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  mt ){.    assert
71b0: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
71c0: 2d 3e 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67  ->pPrevStmt==pPg
71d0: 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65   );.    pPg->pNe
71e0: 78 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d  xtStmt->pPrevStm
71f0: 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74  t = pPg->pPrevSt
7200: 6d 74 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  mt;.  }.  pPg->p
7210: 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
7220: 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  pPg->pPrevStmt =
7230: 20 30 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d   0;.  pPg->inStm
7240: 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
7250: 46 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74  Find a page in t
7260: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 67 69  he hash table gi
7270: 76 65 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d  ven its page num
7280: 62 65 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ber.  Return.** 
7290: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
72a0: 20 70 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66   page or NULL if
72b0: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73   not found..*/.s
72c0: 74 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67  tatic PgHdr *pag
72d0: 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20  er_lookup(Pager 
72e0: 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67  *pPager, Pgno pg
72f0: 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20  no){.  PgHdr *p 
7300: 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  = pPager->aHash[
7310: 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
7320: 5d 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26  ];.  while( p &&
7330: 20 70 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29   p->pgno!=pgno )
7340: 7b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65  {.    p = p->pNe
7350: 78 74 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65  xtHash;.  }.  re
7360: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
7370: 20 55 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61   Unlock the data
7380: 62 61 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74  base and clear t
7390: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
73a0: 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  he.  This routin
73b0: 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74  e.** sets the st
73c0: 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ate of the pager
73d0: 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74   back to what it
73e0: 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61 73   was when it was
73f0: 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64   first.** opened
7400: 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69  .  Any outstandi
7410: 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76  ng pages are inv
7420: 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75 62  alidated and sub
7430: 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73  sequent attempts
7440: 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68  .** to access th
7450: 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c  ose pages will l
7460: 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20  ikely result in 
7470: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73  a coredump..*/.s
7480: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72  tatic void pager
7490: 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70 50  _reset(Pager *pP
74a0: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
74b0: 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66  pPg, *pNext;.  f
74c0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
74d0: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  All; pPg; pPg=pN
74e0: 65 78 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20  ext){.    pNext 
74f0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b  = pPg->pNextAll;
7500: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
7510: 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67  pPg);.  }.  pPag
7520: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a  er->pFirst = 0;.
7530: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
7540: 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50  Synced = 0;.  pP
7550: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b  ager->pLast = 0;
7560: 0a 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20  .  pPager->pAll 
7570: 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50  = 0;.  memset(pP
7580: 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20  ager->aHash, 0, 
7590: 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61  sizeof(pPager->a
75a0: 48 61 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72  Hash));.  pPager
75b0: 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69  ->nPage = 0;.  i
75c0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
75d0: 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  >=PAGER_RESERVED
75e0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70   ){.    sqlite3p
75f0: 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50  ager_rollback(pP
7600: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  ager);.  }.  sql
7610: 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
7620: 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
7630: 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  K);.  pPager->st
7640: 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f  ate = PAGER_UNLO
7650: 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  CK;.  pPager->db
7660: 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61  Size = -1;.  pPa
7670: 67 65 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20  ger->nRef = 0;. 
7680: 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
7690: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20  >journalOpen==0 
76a0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e  );.}../*.** When
76b0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
76c0: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67   called, the pag
76d0: 65 72 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e  er has the journ
76e0: 61 6c 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64  al file open and
76f0: 0a 2a 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f  .** a RESERVED o
7700: 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  r EXCLUSIVE lock
7710: 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
7720: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
7730: 72 65 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20  releases.** the 
7740: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
7750: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
7760: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
7770: 70 6c 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72  place.  The jour
7780: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64  nal.** file is d
7790: 65 6c 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65  eleted and close
77a0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
77b0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
77c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
77d0: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
77e0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
77f0: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
7800: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
7810: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
7820: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
7830: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
7840: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
7850: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
7860: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e  tic int pager_un
7870: 77 72 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20  writelock(Pager 
7880: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
7890: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
78a0: 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
78b0: 44 42 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  DB );.  if( pPag
78c0: 65 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f  er->state<PAGER_
78d0: 52 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20  RESERVED ){.    
78e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
78f0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70  ;.  }.  sqlite3p
7900: 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
7910: 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20  (pPager);.  if( 
7920: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
7930: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f   ){.    sqlite3O
7940: 73 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e  sClose(&pPager->
7950: 73 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65  stfd);.    pPage
7960: 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b  r->stmtOpen = 0;
7970: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
7980: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
7990: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
79a0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  lose(&pPager->jf
79b0: 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  d);.    pPager->
79c0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b  journalOpen = 0;
79d0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65  .    sqlite3OsDe
79e0: 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  lete(pPager->zJo
79f0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69  urnal);.    sqli
7a00: 74 65 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e  teFree( pPager->
7a10: 61 49 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  aInJournal );.  
7a20: 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75    pPager->aInJou
7a30: 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f  rnal = 0;.    fo
7a40: 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
7a50: 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
7a60: 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
7a70: 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
7a80: 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
7a90: 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
7aa0: 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
7ab0: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
7ac0: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
7ad0: 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48        pPg->pageH
7ae0: 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
7af0: 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69  hash(pPg);.#endi
7b00: 66 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  f.    }.    pPag
7b10: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
7b20: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
7b30: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
7b40: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
7b50: 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
7b60: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
7b70: 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b  useJournal==0 );
7b80: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
7b90: 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
7ba0: 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
7bb0: 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65 72 2d  LOCK);.  pPager-
7bc0: 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 53  >state = PAGER_S
7bd0: 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65 72 2d  HARED;.  pPager-
7be0: 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b  >origDbSize = 0;
7bf0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
7c00: 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65 74 75  ster = 0;.  retu
7c10: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
7c20: 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65 74 75  Compute and retu
7c30: 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20 66 6f  rn a checksum fo
7c40: 72 20 74 68 65 20 70 61 67 65 20 6f 66 20 64 61  r the page of da
7c50: 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ta..**.** This i
7c60: 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63 68 65  s not a real che
7c70: 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20 72 65  cksum.  It is re
7c80: 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20 73 75  ally just the su
7c90: 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72 61 6e  m of the .** ran
7ca0: 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61 6c 75  dom initial valu
7cb0: 65 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 6e  e and the page n
7cc0: 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70 65 72  umber.  We exper
7cd0: 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a 2a 20  imented with.** 
7ce0: 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20 74 68  a checksum of th
7cf0: 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c 20 62  e entire data, b
7d00: 75 74 20 74 68 61 74 20 77 61 73 20 66 6f 75 6e  ut that was foun
7d10: 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c 6f 77  d to be too slow
7d20: 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
7d30: 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65  t the page numbe
7d40: 72 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  r is stored at t
7d50: 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  he beginning of 
7d60: 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68 65 20  data and.** the 
7d70: 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74 6f 72  checksum is stor
7d80: 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e 20 20  ed at the end.  
7d90: 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74 61 6e  This is importan
7da0: 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c 0a 2a  t.  If journal.*
7db0: 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f 63 63  * corruption occ
7dc0: 75 72 73 20 64 75 65 20 74 6f 20 61 20 70 6f 77  urs due to a pow
7dd0: 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20  er failure, the 
7de0: 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63 65 6e  most likely scen
7df0: 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61 74 20  ario.** is that 
7e00: 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65 20 6f  one end or the o
7e10: 74 68 65 72 20 6f 66 20 74 68 65 20 72 65 63 6f  ther of the reco
7e20: 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61 6e 67  rd will be chang
7e30: 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20 6d 75  ed.  It is.** mu
7e40: 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79 20 74  ch less likely t
7e50: 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e 64 73  hat the two ends
7e60: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
7e70: 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65 0a 2a  record will be.*
7e80: 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20 74 68  * correct and th
7e90: 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f 72 72  e middle be corr
7ea0: 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68 69 73  upt.  Thus, this
7eb0: 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63 68 65   "checksum" sche
7ec0: 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20 66 61  me,.** though fa
7ed0: 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c 20 63  st and simple, c
7ee0: 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73 74 6c  atches the mostl
7ef0: 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20 6f 66  y likely kind of
7f00: 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a 2a 0a   corruption..**.
7f10: 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6e 73  ** FIX ME:  Cons
7f20: 69 64 65 72 20 61 64 64 69 6e 67 20 65 76 65 72  ider adding ever
7f30: 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f 29 20  y 200th (or so) 
7f40: 62 79 74 65 20 6f 66 20 74 68 65 20 64 61 74 61  byte of the data
7f50: 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65 63 6b   to the.** check
7f60: 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79 20 69  sum.  That way i
7f70: 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
7f80: 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72 65 20  spans 3 or more 
7f90: 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61 6e 64  disk sectors and
7fa0: 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d 69 64  .** only the mid
7fb0: 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20 63 6f  dle sector is co
7fc0: 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c 20 73  rrupt, we will s
7fd0: 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65 61 73  till have a reas
7fe0: 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e 63 65  onable.** chance
7ff0: 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68 65 20   of failing the 
8000: 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74 68 75  checksum and thu
8010: 73 20 64 65 74 65 63 74 69 6e 67 20 74 68 65 20  s detecting the 
8020: 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74 61 74  problem..*/.stat
8030: 69 63 20 75 33 32 20 70 61 67 65 72 5f 63 6b 73  ic u32 pager_cks
8040: 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  um(Pager *pPager
8050: 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63 6f 6e  , Pgno pgno, con
8060: 73 74 20 63 68 61 72 20 2a 61 44 61 74 61 29 7b  st char *aData){
8070: 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70  .  u32 cksum = p
8080: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
8090: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67  ;.  int i = pPag
80a0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30  er->pageSize-200
80b0: 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29  ;.  while( i>0 )
80c0: 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61  {.    cksum += a
80d0: 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d  Data[i];.    i -
80e0: 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74  = 200;.  }.  ret
80f0: 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a  urn cksum;.}../*
8100: 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c  .** Read a singl
8110: 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  e page from the 
8120: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
8130: 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65 73 63  ned on file desc
8140: 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e 20 20  riptor.** jfd.  
8150: 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20 6f 6e  Playback this on
8160: 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66  e page..**.** If
8170: 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69 74 20   useCksum==0 it 
8180: 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75 72 6e  means this journ
8190: 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  al does not use 
81a0: 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68 65 63  checksums.  Chec
81b0: 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e 6f 74  ksums.** are not
81c0: 20 75 73 65 64 20 69 6e 20 73 74 61 74 65 6d 65   used in stateme
81d0: 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65 63 61  nt journals beca
81e0: 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f  use statement jo
81f0: 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a 2a 2a  urnals do not.**
8200: 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69 76 65   need to survive
8210: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73 2e   power failures.
8220: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
8230: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
8240: 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a 70 50  e_page(Pager *pP
8250: 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a 6a 66  ager, OsFile *jf
8260: 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75 6d 29  d, int useCksum)
8270: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
8280: 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20 20 20  Hdr *pPg;       
8290: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
82a0: 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67 65 20  n existing page 
82b0: 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a  in the cache */.
82c0: 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20    Pgno pgno;    
82d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
82e0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
82f0: 65 72 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20  er of a page in 
8300: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 33 32  journal */.  u32
8310: 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20   cksum;         
8320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68             /* Ch
8330: 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f 72 20  ecksum used for 
8340: 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20  sanity checking 
8350: 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b 53 51  */.  u8 aData[SQ
8360: 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49  LITE_MAX_PAGE_SI
8370: 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20 73 74  ZE];  /* Temp st
8380: 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61 67 65  orage for a page
8390: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65 61 64   */..  rc = read
83a0: 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67 6e  32bits(jfd, &pgn
83b0: 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  o);.  if( rc!=SQ
83c0: 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e  LITE_OK ) return
83d0: 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69   rc;.  rc = sqli
83e0: 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20 26  te3OsRead(jfd, &
83f0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
8400: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
8410: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8420: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
8430: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
8440: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
8450: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
8460: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
8470: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
8480: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
8490: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
84a0: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
84b0: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
84c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
84d0: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
84e0: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
84f0: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
8500: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
8510: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
8520: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
8530: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
8540: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
8550: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
8560: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
8570: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
8580: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
8590: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
85a0: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
85b0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
85c0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
85d0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
85e0: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
85f0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
8600: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
8610: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
8620: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
8630: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
8640: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
8650: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
8660: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
8670: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
8680: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
8690: 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  sum(pPager, pgno
86a0: 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75 6d 20  , aData)!=cksum 
86b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
86c0: 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 20  SQLITE_DONE;.   
86d0: 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74   }.  }..  assert
86e0: 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3d  ( pPager->state=
86f0: 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  =PAGER_RESERVED 
8700: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  || pPager->state
8710: 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56  >=PAGER_EXCLUSIV
8720: 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  E );..  /* If th
8730: 65 20 70 61 67 65 72 20 69 73 20 69 6e 20 52 45  e pager is in RE
8740: 53 45 52 56 45 44 20 73 74 61 74 65 2c 20 74 68  SERVED state, th
8750: 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65  en there must be
8760: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69 73 0a   a copy of this.
8770: 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74 68 65    ** page in the
8780: 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 49 6e   pager cache. In
8790: 20 74 68 69 73 20 63 61 73 65 20 6a 75 73 74 20   this case just 
87a0: 75 70 64 61 74 65 20 74 68 65 20 70 61 67 65 72  update the pager
87b0: 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e 6f 74   cache,.  ** not
87c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
87d0: 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73 20  le. The page is 
87e0: 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69 72 74  left marked dirt
87f0: 79 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a  y in this case..
8800: 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 6e 20    **.  ** If in 
8810: 45 58 43 4c 55 53 49 56 45 20 73 74 61 74 65 2c  EXCLUSIVE state,
8820: 20 74 68 65 6e 20 77 65 20 75 70 64 61 74 65 20   then we update 
8830: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 20  the pager cache 
8840: 69 66 20 69 74 20 65 78 69 73 74 73 0a 20 20 2a  if it exists.  *
8850: 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e 20 66  * and the main f
8860: 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69 73  ile. The page is
8870: 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e 6f 74   then marked not
8880: 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 70   dirty..  */.  p
8890: 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75  Pg = pager_looku
88a0: 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b  p(pPager, pgno);
88b0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
88c0: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
88d0: 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 67  EXCLUSIVE || pPg
88e0: 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22 50 4c   );.  TRACE3("PL
88f0: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
8900: 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
8910: 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a 20 20  ager), pgno);.  
8920: 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
8930: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
8940: 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  VE ){.    sqlite
8950: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
8960: 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69  >fd, (pgno-1)*(i
8970: 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53  64)pPager->pageS
8980: 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ize);.    rc = s
8990: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
89a0: 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74 61  Pager->fd, aData
89b0: 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
89c0: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ze);.  }.  if( p
89d0: 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 6f 20  Pg ){.    /* No 
89e0: 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76 65 72  page should ever
89f0: 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79 20 72   be explicitly r
8a00: 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61 74 20  olled back that 
8a10: 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63 65 70  is in use, excep
8a20: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70 61 67  t.    ** for pag
8a30: 65 20 31 20 77 68 69 63 68 20 69 73 20 68 65 6c  e 1 which is hel
8a40: 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72 64 65  d in use in orde
8a50: 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6c 6f  r to keep the lo
8a60: 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20 2a 2a  ck on the.    **
8a70: 20 64 61 74 61 62 61 73 65 20 61 63 74 69 76 65   database active
8a80: 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68 20 61  . However such a
8a90: 20 70 61 67 65 20 6d 61 79 20 62 65 20 72 6f 6c   page may be rol
8aa0: 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20 72 65  led back as a re
8ab0: 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66 20 61  sult.    ** of a
8ac0: 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72  n internal error
8ad0: 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e   resulting in an
8ae0: 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c 6c 20   automatic call 
8af0: 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65  to.    ** sqlite
8b00: 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
8b10: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76 6f  )..    */.    vo
8b20: 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20 2f  id *pData;.    /
8b30: 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e  * assert( pPg->n
8b40: 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e 70  Ref==0 || pPg->p
8b50: 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20 20  gno==1 ); */.   
8b60: 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54   pData = PGHDR_T
8b70: 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 20  O_DATA(pPg);.   
8b80: 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20 61   memcpy(pData, a
8b90: 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
8ba0: 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
8bb0: 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75   pPager->xDestru
8bc0: 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20 46 49  ctor ){  /*** FI
8bd0: 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20 74 68  X ME:  Should th
8be0: 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f 20 2a  is be xReinit? *
8bf0: 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67 65 72  **/.      pPager
8c00: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28 70 44  ->xDestructor(pD
8c10: 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  ata, pPager->pag
8c20: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
8c30: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8c40: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
8c50: 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 50  SIVE ){.      pP
8c60: 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  g->dirty = 0;.  
8c70: 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
8c80: 63 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51  c = 0;.#ifdef SQ
8c90: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
8ca0: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61 67 65  .      pPg->page
8cb0: 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
8cc0: 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
8cd0: 69 66 0a 20 20 20 20 7d 0a 20 20 20 20 43 4f 44  if.    }.    COD
8ce0: 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
8cf0: 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
8d00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
8d10: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  ;.}../*.** Param
8d20: 65 74 65 72 20 7a 4d 61 73 74 65 72 20 69 73 20  eter zMaster is 
8d30: 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61  the name of a ma
8d40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8d50: 65 2e 20 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72  e. A single jour
8d60: 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74  nal.** file that
8d70: 20 72 65 66 65 72 72 65 64 20 74 6f 20 74 68 65   referred to the
8d80: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
8d90: 66 69 6c 65 20 68 61 73 20 6a 75 73 74 20 62 65  file has just be
8da0: 65 6e 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a  en rolled back..
8db0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8dc0: 63 68 65 63 6b 73 20 69 66 20 69 74 20 69 73 20  checks if it is 
8dd0: 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65  possible to dele
8de0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
8df0: 75 72 6e 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61  urnal file,.** a
8e00: 6e 64 20 64 6f 65 73 20 73 6f 20 69 66 20 69 74  nd does so if it
8e10: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d   is..**.** The m
8e20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8e30: 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20  le contains the 
8e40: 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 63 68 69  names of all chi
8e50: 6c 64 20 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20  ld journals..** 
8e60: 54 6f 20 74 65 6c 6c 20 69 66 20 61 20 6d 61 73  To tell if a mas
8e70: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20  ter journal can 
8e80: 62 65 20 64 65 6c 65 74 65 64 2c 20 63 68 65 63  be deleted, chec
8e90: 6b 20 74 6f 20 65 61 63 68 20 6f 66 20 74 68 65  k to each of the
8ea0: 0a 2a 2a 20 63 68 69 6c 64 72 65 6e 2e 20 20 49  .** children.  I
8eb0: 66 20 61 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61  f all children a
8ec0: 72 65 20 65 69 74 68 65 72 20 6d 69 73 73 69 6e  re either missin
8ed0: 67 20 6f 72 20 64 6f 20 6e 6f 74 20 72 65 66 65  g or do not refe
8ee0: 72 20 74 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72  r to.** a differ
8ef0: 65 6e 74 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ent master journ
8f00: 61 6c 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 61  al, then this ma
8f10: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e  ster journal can
8f20: 20 62 65 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a   be deleted..*/.
8f30: 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72  static int pager
8f40: 5f 64 65 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74  _delmaster(const
8f50: 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b   char *zMaster){
8f60: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
8f70: 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30   master_open = 0
8f80: 3b 0a 20 20 4f 73 46 69 6c 65 20 6d 61 73 74 65  ;.  OsFile maste
8f90: 72 3b 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74  r;.  char *zMast
8fa0: 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f  erJournal = 0; /
8fb0: 2a 20 43 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61  * Contents of ma
8fc0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8fd0: 65 20 2a 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74  e */.  i64 nMast
8fe0: 65 72 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20  erJournal;      
8ff0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 6d 61 73 74   /* Size of mast
9000: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
9010: 2a 2f 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68  */..  /* Open th
9020: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9030: 20 66 69 6c 65 20 65 78 63 6c 75 73 69 76 65 6c   file exclusivel
9040: 79 20 69 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f  y in case some o
9050: 74 68 65 72 20 70 72 6f 63 65 73 73 0a 20 20 2a  ther process.  *
9060: 2a 20 69 73 20 72 75 6e 6e 69 6e 67 20 74 68 69  * is running thi
9070: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20  s routine also. 
9080: 4e 6f 74 20 74 68 61 74 20 69 74 20 6d 61 6b 65  Not that it make
9090: 73 20 74 6f 6f 20 6d 75 63 68 20 64 69 66 66 65  s too much diffe
90a0: 72 65 6e 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65  rence..  */.  me
90b0: 6d 73 65 74 28 26 6d 61 73 74 65 72 2c 20 30 2c  mset(&master, 0,
90c0: 20 73 69 7a 65 6f 66 28 6d 61 73 74 65 72 29 29   sizeof(master))
90d0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
90e0: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
90f0: 4d 61 73 74 65 72 2c 20 26 6d 61 73 74 65 72 29  Master, &master)
9100: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
9110: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c  TE_OK ) goto del
9120: 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61  master_out;.  ma
9130: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20  ster_open = 1;. 
9140: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
9150: 69 6c 65 53 69 7a 65 28 26 6d 61 73 74 65 72 2c  ileSize(&master,
9160: 20 26 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c   &nMasterJournal
9170: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
9180: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
9190: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
91a0: 69 66 28 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  if( nMasterJourn
91b0: 61 6c 3e 30 20 29 7b 0a 20 20 20 20 63 68 61 72  al>0 ){.    char
91c0: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20   *zJournal;.    
91d0: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 50 74 72  char *zMasterPtr
91e0: 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f   = 0;..    /* Lo
91f0: 61 64 20 74 68 65 20 65 6e 74 69 72 65 20 6d 61  ad the entire ma
9200: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9210: 65 20 69 6e 74 6f 20 73 70 61 63 65 20 6f 62 74  e into space obt
9220: 61 69 6e 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a  ained from.    *
9230: 2a 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  * sqliteMalloc()
9240: 20 61 6e 64 20 70 6f 69 6e 74 65 64 20 74 6f 20   and pointed to 
9250: 62 79 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61  by zMasterJourna
9260: 6c 2e 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a  l. .    */.    z
9270: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20  MasterJournal = 
9280: 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61  (char *)sqliteMa
9290: 6c 6c 6f 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72  lloc(nMasterJour
92a0: 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20 21 7a  nal);.    if( !z
92b0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
92c0: 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
92d0: 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
92e0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
92f0: 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  ut;.    }.    rc
9300: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
9310: 28 26 6d 61 73 74 65 72 2c 20 7a 4d 61 73 74 65  (&master, zMaste
9320: 72 4a 6f 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65  rJournal, nMaste
9330: 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69  rJournal);.    i
9340: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
9350: 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65   ) goto delmaste
9360: 72 5f 6f 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75  r_out;..    zJou
9370: 72 6e 61 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f  rnal = zMasterJo
9380: 75 72 6e 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65  urnal;.    while
9390: 28 20 28 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73  ( (zJournal-zMas
93a0: 74 65 72 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73  terJournal)<nMas
93b0: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
93c0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4f      if( sqlite3O
93d0: 73 46 69 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75  sFileExists(zJou
93e0: 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  rnal) ){.       
93f0: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a   /* One of the j
9400: 6f 75 72 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20  ournals pointed 
9410: 74 6f 20 62 79 20 74 68 65 20 6d 61 73 74 65 72  to by the master
9420: 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74 73 2e   journal exists.
9430: 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e  .        ** Open
9440: 20 69 74 20 61 6e 64 20 63 68 65 63 6b 20 69 66   it and check if
9450: 20 69 74 20 70 6f 69 6e 74 73 20 61 74 20 74 68   it points at th
9460: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
9470: 2e 20 49 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  . If.        ** 
9480: 73 6f 2c 20 72 65 74 75 72 6e 20 77 69 74 68 6f  so, return witho
9490: 75 74 20 64 65 6c 65 74 69 6e 67 20 74 68 65 20  ut deleting the 
94a0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
94b0: 69 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ile..        */.
94c0: 20 20 20 20 20 20 20 20 4f 73 46 69 6c 65 20 6a          OsFile j
94d0: 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20  ournal;.        
94e0: 69 6e 74 20 63 3b 0a 0a 20 20 20 20 20 20 20 20  int c;..        
94f0: 6d 65 6d 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c  memset(&journal,
9500: 20 30 2c 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e   0, sizeof(journ
9510: 61 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 72 63  al));.        rc
9520: 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
9530: 52 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61  ReadOnly(zJourna
9540: 6c 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20  l, &journal);.  
9550: 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
9560: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
9570: 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73       goto delmas
9580: 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20  ter_out;.       
9590: 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d   }..        rc =
95a0: 20 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e   readMasterJourn
95b0: 61 6c 28 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d  al(&journal, &zM
95c0: 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20  asterPtr);.     
95d0: 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73     sqlite3OsClos
95e0: 65 28 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  e(&journal);.   
95f0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
9600: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
9610: 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74      goto delmast
9620: 65 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  er_out;.        
9630: 7d 0a 0a 20 20 20 20 20 20 20 20 63 20 3d 20 7a  }..        c = z
9640: 4d 61 73 74 65 72 50 74 72 21 3d 30 20 26 26 20  MasterPtr!=0 && 
9650: 73 74 72 63 6d 70 28 7a 4d 61 73 74 65 72 50 74  strcmp(zMasterPt
9660: 72 2c 20 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a  r, zMaster)==0;.
9670: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
9680: 65 65 28 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a  ee(zMasterPtr);.
9690: 20 20 20 20 20 20 20 20 69 66 28 20 63 20 29 7b          if( c ){
96a0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 65  .          /* We
96b0: 20 68 61 76 65 20 61 20 6d 61 74 63 68 2e 20 44   have a match. D
96c0: 6f 20 6e 6f 74 20 64 65 6c 65 74 65 20 74 68 65  o not delete the
96d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
96e0: 66 69 6c 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  file. */.       
96f0: 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65     goto delmaste
9700: 72 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d  r_out;.        }
9710: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
9720: 4a 6f 75 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c  Journal += (strl
9730: 65 6e 28 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b  en(zJournal)+1);
9740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20  .    }.  }.  .  
9750: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9760: 7a 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61  zMaster);..delma
9770: 73 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20  ster_out:.  if( 
9780: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29  zMasterJournal )
9790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
97a0: 28 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29  (zMasterJournal)
97b0: 3b 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61  ;.  }  .  if( ma
97c0: 73 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20  ster_open ){.   
97d0: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
97e0: 26 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20  &master);.  }.  
97f0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
9800: 0a 2a 2a 20 4d 61 6b 65 20 65 76 65 72 79 20 70  .** Make every p
9810: 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
9820: 20 61 67 72 65 65 20 77 69 74 68 20 77 68 61 74   agree with what
9830: 20 69 73 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e   is on disk.  In
9840: 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a   other words,.**
9850: 20 72 65 72 65 61 64 20 74 68 65 20 64 69 73 6b   reread the disk
9860: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
9870: 61 74 65 20 6f 66 20 74 68 65 20 63 61 63 68 65  ate of the cache
9880: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9890: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 61  tine is called a
98a0: 66 74 65 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20  fter a rollback 
98b0: 69 6e 20 77 68 69 63 68 20 73 6f 6d 65 20 6f 66  in which some of
98c0: 20 74 68 65 20 64 69 72 74 79 20 63 61 63 68 65   the dirty cache
98d0: 0a 2a 2a 20 70 61 67 65 73 20 68 61 64 20 6e 65  .** pages had ne
98e0: 76 65 72 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ver been written
98f0: 20 6f 75 74 20 74 6f 20 64 69 73 6b 2e 20 20 57   out to disk.  W
9900: 65 20 6e 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62  e need to roll b
9910: 61 63 6b 20 74 68 65 0a 2a 2a 20 63 61 63 68 65  ack the.** cache
9920: 20 63 6f 6e 74 65 6e 74 20 61 6e 64 20 74 68 65   content and the
9930: 20 65 61 73 69 65 73 74 20 77 61 79 20 74 6f 20   easiest way to 
9940: 64 6f 20 74 68 61 74 20 69 73 20 74 6f 20 72 65  do that is to re
9950: 72 65 61 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e  read the old con
9960: 74 65 6e 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f  tent.** back fro
9970: 6d 20 74 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73  m the disk..*/.s
9980: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9990: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 50 61 67  reload_cache(Pag
99a0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
99b0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74  gHdr *pPg;.  int
99c0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
99d0: 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65  .  for(pPg=pPage
99e0: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
99f0: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
9a00: 7b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 5b  {.    char zBuf[
9a10: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
9a20: 53 49 5a 45 5d 3b 0a 20 20 20 20 69 66 28 20 21  SIZE];.    if( !
9a30: 70 50 67 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e  pPg->dirty ) con
9a40: 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 28  tinue;.    if( (
9a50: 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d  int)pPg->pgno <=
9a60: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
9a70: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ize ){.      sql
9a80: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
9a90: 65 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e  er->fd, pPager->
9aa0: 70 61 67 65 53 69 7a 65 2a 28 69 36 34 29 28 70  pageSize*(i64)(p
9ab0: 50 67 2d 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20  Pg->pgno-1));.  
9ac0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9ad0: 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e  OsRead(&pPager->
9ae0: 66 64 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  fd, zBuf, pPager
9af0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9b00: 20 20 20 54 52 41 43 45 33 28 22 52 45 46 45 54     TRACE3("REFET
9b10: 43 48 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  CH %d page %d\n"
9b20: 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
9b30: 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
9b40: 20 20 20 20 20 69 66 28 20 72 63 20 29 20 62 72       if( rc ) br
9b50: 65 61 6b 3b 0a 20 20 20 20 20 20 43 4f 44 45 43  eak;.      CODEC
9b60: 28 70 50 61 67 65 72 2c 20 7a 42 75 66 2c 20 70  (pPager, zBuf, p
9b70: 50 67 2d 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20  Pg->pgno, 2);.  
9b80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d    }else{.      m
9b90: 65 6d 73 65 74 28 7a 42 75 66 2c 20 30 2c 20 70  emset(zBuf, 0, p
9ba0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
9bb0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9bc0: 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20  pPg->nRef==0 || 
9bd0: 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 50 47 48  memcmp(zBuf, PGH
9be0: 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
9bf0: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
9c00: 65 29 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  e) ){.      memc
9c10: 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  py(PGHDR_TO_DATA
9c20: 28 70 50 67 29 2c 20 7a 42 75 66 2c 20 70 50 61  (pPg), zBuf, pPa
9c30: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9c40: 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
9c50: 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a 20  ->xReiniter ){. 
9c60: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 78         pPager->x
9c70: 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f 54  Reiniter(PGHDR_T
9c80: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
9c90: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
9ca0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
9cb0: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
9cc0: 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20  R_TO_EXTRA(pPg, 
9cd0: 70 50 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67  pPager), 0, pPag
9ce0: 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20  er->nExtra);.   
9cf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70     }.    }.    p
9d00: 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
9d10: 3b 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  ;.    pPg->dirty
9d20: 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
9d30: 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
9d40: 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
9d50: 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
9d60: 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
9d70: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
9d80: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61  .}../*.** Trunca
9d90: 74 65 20 74 68 65 20 6d 61 69 6e 20 66 69 6c 65  te the main file
9da0: 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 70 61   of the given pa
9db0: 67 65 72 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ger to the numbe
9dc0: 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a 20 69 6e  r of pages.** in
9dd0: 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73 74 61 74  dicated..*/.stat
9de0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72 75  ic int pager_tru
9df0: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
9e00: 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29 7b  ger, int nPage){
9e10: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
9e20: 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
9e30: 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 20 20 72  EXCLUSIVE );.  r
9e40: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54  eturn sqlite3OsT
9e50: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
9e60: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
9e70: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
9e80: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
9e90: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
9ea0: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
9eb0: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
9ec0: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
9ed0: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
9ee0: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
9ef0: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
9f00: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
9f10: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
9f20: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
9f30: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
9f40: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
9f50: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
9f60: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
9f70: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
9f80: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
9f90: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9fa0: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9fb0: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
9fc0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
9fd0: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
9fe0: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
9ff0: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
a000: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
a010: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
a020: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
a030: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
a040: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
a050: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
a060: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
a070: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
a080: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
a090: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
a0a0: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
a0b0: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
a0c0: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
a0d0: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
a0e0: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
a0f0: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
a100: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
a110: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
a120: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
a130: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
a140: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
a150: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
a160: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
a170: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
a180: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
a190: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
a1a0: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
a1b0: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
a1c0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
a1d0: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
a1e0: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
a1f0: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
a200: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
a210: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
a220: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
a230: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
a240: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
a250: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
a260: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
a270: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
a280: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
a290: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
a2a0: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
a2b0: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
a2c0: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
a2d0: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
a2e0: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
a2f0: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
a300: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
a310: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
a320: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
a330: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
a340: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
a350: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
a360: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
a370: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
a380: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
a390: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
a3a0: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
a3b0: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
a3c0: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
a3d0: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
a3e0: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
a3f0: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
a400: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
a410: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
a420: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
a430: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
a440: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
a450: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
a460: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
a470: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
a480: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
a490: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
a4a0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
a4b0: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
a4c0: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
a4d0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a4e0: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
a4f0: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
a500: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
a510: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
a520: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a530: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
a540: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
a550: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
a560: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
a570: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
a580: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
a590: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
a5a0: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
a5b0: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a5c0: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
a5d0: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
a5e0: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
a5f0: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
a600: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
a610: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
a620: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
a630: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
a640: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
a650: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
a660: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
a670: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
a680: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
a690: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
a6a0: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
a6b0: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
a6c0: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
a6d0: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
a6e0: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
a6f0: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
a700: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
a710: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
a720: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
a730: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
a740: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
a750: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
a760: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
a770: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
a780: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
a790: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
a7a0: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
a7b0: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
a7c0: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
a7d0: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
a7e0: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
a7f0: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
a800: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
a810: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
a820: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a830: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
a840: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
a850: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
a860: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
a870: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
a880: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
a890: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
a8a0: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
a8b0: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
a8c0: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
a8d0: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
a8e0: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
a8f0: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
a900: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a910: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
a920: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
a930: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
a940: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
a970: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
a980: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
a990: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
a9a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a9b0: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
a9c0: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
a9d0: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a9e0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a9f0: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
aa00: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
aa10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
aa20: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
aa30: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
aa40: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
aa50: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
aa60: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
aa70: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
aa80: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
aa90: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
aaa0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
aab0: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
aac0: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
aad0: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
aae0: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
aaf0: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
ab00: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
ab10: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
ab20: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
ab30: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
ab40: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
ab50: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
ab60: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
ab70: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ab80: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
ab90: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
aba0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
abb0: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
abc0: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
abd0: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
abe0: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
abf0: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
ac00: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
ac10: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
ac20: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
ac30: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
ac40: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
ac50: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
ac60: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
ac70: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
ac80: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
ac90: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
aca0: 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67  terJournal(&pPag
acb0: 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65  er->jfd, &zMaste
acc0: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  r);.  assert( rc
acd0: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
ace0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
acf0: 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72  E_OK || (zMaster
ad00: 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69   && !sqlite3OsFi
ad10: 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72  leExists(zMaster
ad20: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
ad30: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
ad40: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
ad50: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
ad60: 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
ad70: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
ad80: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
ad90: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
ada0: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
adb0: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
adc0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
add0: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
ade0: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
adf0: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
ae00: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
ae10: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
ae20: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
ae30: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
ae40: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
ae50: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
ae60: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
ae70: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
ae80: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
ae90: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
aea0: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
aeb0: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
aec0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
aed0: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
aee0: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
aef0: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
af00: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
af10: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
af20: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
af30: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
af40: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
af50: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
af60: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
af70: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
af80: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
af90: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
afa0: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
afb0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
afc0: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
afd0: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
afe0: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
aff0: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
b000: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
b010: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
b020: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
b030: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
b040: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
b050: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
b060: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
b070: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
b080: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
b090: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
b0a0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
b0b0: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
b0c0: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
b0d0: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
b0e0: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
b0f0: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
b100: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
b110: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
b120: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
b130: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
b140: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
b150: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
b160: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
b170: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
b180: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
b190: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
b1a0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
b1b0: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
b1c0: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
b1d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
b1e0: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
b1f0: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
b200: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
b210: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
b220: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
b230: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
b240: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
b250: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
b260: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
b270: 5f 45 58 43 4c 55 53 49 56 45 20 26 26 20 0a 20  _EXCLUSIVE && . 
b280: 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
b290: 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e  ournalOff==JOURN
b2a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
b2b0: 29 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ) ){.      asser
b2c0: 74 28 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44  t( pPager->origD
b2d0: 62 53 69 7a 65 3d 3d 30 20 7c 7c 20 70 50 61 67  bSize==0 || pPag
b2e0: 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3d 3d  er->origDbSize==
b2f0: 6d 78 50 67 20 29 3b 0a 20 20 20 20 20 20 72 63  mxPg );.      rc
b300: 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74   = pager_truncat
b310: 65 28 70 50 61 67 65 72 2c 20 6d 78 50 67 29 3b  e(pPager, mxPg);
b320: 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
b330: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b340: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
b350: 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  yback;.      }. 
b360: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53       pPager->dbS
b370: 69 7a 65 20 3d 20 6d 78 50 67 3b 0a 20 20 20 20  ize = mxPg;.    
b380: 7d 0a 0a 20 20 20 20 2f 2a 20 72 63 20 3d 20 73  }..    /* rc = s
b390: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
b3a0: 61 67 65 72 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e  ager->jfd, JOURN
b3b0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
b3c0: 29 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  )); */.    if( r
b3d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
b3e0: 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b  oto end_playback
b3f0: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 43 6f 70 79  ;.  .    /* Copy
b400: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
b410: 6f 75 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  out of the journ
b420: 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f  al and back into
b430: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
b440: 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66  le..    */.    f
b450: 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 65 63 3b 20  or(i=0; i<nRec; 
b460: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  i++){.      rc =
b470: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
b480: 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c  one_page(pPager,
b490: 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31   &pPager->jfd, 1
b4a0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
b4b0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b4c0: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
b4d0: 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
b4e0: 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
b4f0: 54 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 20 20 20  TE_OK;.         
b500: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b510: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 20  Off = szJ;.     
b520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b530: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
b540: 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c       goto end_pl
b550: 61 79 62 61 63 6b 3b 0a 20 20 20 20 20 20 20 20  ayback;.        
b560: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
b570: 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 67 65 73 20    }..  /* Pages 
b580: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 77  that have been w
b590: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
b5a0: 75 72 6e 61 6c 20 62 75 74 20 6e 65 76 65 72 20  urnal but never 
b5b0: 73 79 6e 63 65 64 0a 20 20 2a 2a 20 77 68 65 72  synced.  ** wher
b5c0: 65 20 6e 6f 74 20 72 65 73 74 6f 72 65 64 20 62  e not restored b
b5d0: 79 20 74 68 65 20 6c 6f 6f 70 20 61 62 6f 76 65  y the loop above
b5e0: 2e 20 20 57 65 20 68 61 76 65 20 74 6f 20 72 65  .  We have to re
b5f0: 73 74 6f 72 65 20 74 68 6f 73 65 0a 20 20 2a 2a  store those.  **
b600: 20 70 61 67 65 73 20 62 79 20 72 65 61 64 69 6e   pages by readin
b610: 67 20 74 68 65 6d 20 62 61 63 6b 20 66 72 6f 6d  g them back from
b620: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61   the original da
b630: 74 61 62 61 73 65 2e 0a 20 20 2a 2f 0a 20 20 61  tabase..  */.  a
b640: 73 73 65 72 74 28 20 72 63 3d 3d 53 51 4c 49 54  ssert( rc==SQLIT
b650: 45 5f 4f 4b 20 29 3b 0a 20 20 70 61 67 65 72 5f  E_OK );.  pager_
b660: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
b670: 67 65 72 29 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62  ger);..end_playb
b680: 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  ack:.  if( rc==S
b690: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
b6a0: 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  rc = pager_unwri
b6b0: 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
b6c0: 20 20 7d 0a 20 20 69 66 28 20 7a 4d 61 73 74 65    }.  if( zMaste
b6d0: 72 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74  r ){.    /* If t
b6e0: 68 65 72 65 20 77 61 73 20 61 20 6d 61 73 74 65  here was a maste
b6f0: 72 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68  r journal and th
b700: 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c 20  is routine will 
b710: 72 65 74 75 72 6e 20 74 72 75 65 2c 0a 20 20 20  return true,.   
b720: 20 2a 2a 20 73 65 65 20 69 66 20 69 74 20 69 73   ** see if it is
b730: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 64 65 6c   possible to del
b740: 65 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ete the master j
b750: 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20  ournal..    */. 
b760: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
b770: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
b780: 20 3d 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74   = pager_delmast
b790: 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20  er(zMaster);.   
b7a0: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65   }.    sqliteFre
b7b0: 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a  e(zMaster);.  }.
b7c0: 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72 2e  .  /* The Pager.
b7d0: 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69 61  sectorSize varia
b7e0: 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65 65  ble may have bee
b7f0: 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65 20  n updated while 
b800: 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63  rolling.  ** bac
b810: 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61  k a journal crea
b820: 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73  ted by a process
b830: 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65 6e   with a differen
b840: 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53  t PAGER_SECTOR_S
b850: 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e 20  IZE.  ** value. 
b860: 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65 20  Reset it to the 
b870: 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66 6f  correct value fo
b880: 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e 0a  r this process..
b890: 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 73    */.  pPager->s
b8a0: 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45  ectorSize = PAGE
b8b0: 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20  R_SECTOR_SIZE;. 
b8c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
b8d0: 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68  *.** Playback th
b8e0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
b8f0: 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  nal..**.** This 
b900: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 6c  is similar to pl
b910: 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20 74  aying back the t
b920: 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
b930: 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20 61  al but with.** a
b940: 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73 74   few extra twist
b950: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29 20  s..**.**    (1) 
b960: 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   The number of p
b970: 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74 61  ages in the data
b980: 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68 65  base file at the
b990: 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20 20   start of.**    
b9a0: 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d 65       the stateme
b9b0: 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  nt is stored in 
b9c0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
b9d0: 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a 20  , not in the.** 
b9e0: 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20          journal 
b9f0: 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a 0a  file itself..**.
ba00: 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61 64  **    (2)  In ad
ba10: 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69 6e  dition to playin
ba20: 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74 65  g back the state
ba30: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61 6c  ment journal, al
ba40: 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70 6c  so.**         pl
ba50: 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65 73  ayback all pages
ba60: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
ba70: 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67 69  ion journal begi
ba80: 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20  nning.**        
ba90: 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67 65   at offset pPage
baa0: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a 2f  r->stmtJSize..*/
bab0: 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67 65  .static int page
bac0: 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 28  r_stmt_playback(
bad0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
bae0: 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20 20    i64 szJ;      
baf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
bb00: 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20 6a  ze of the full j
bb10: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34 20  ournal */.  i64 
bb20: 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e 52  hdrOff;.  int nR
bb30: 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ec;             
bb40: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
bb50: 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e 74  Records */.  int
bb60: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
bb70: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bb80: 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20 72  unter */.  int r
bb90: 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61 67  c;..  szJ = pPag
bba0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
bbb0: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20 0a  #ifndef NDEBUG .
bbc0: 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f 73    {.    i64 os_s
bbd0: 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  zJ;.    rc = sql
bbe0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26  ite3OsFileSize(&
bbf0: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f 73  pPager->jfd, &os
bc00: 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20 72  _szJ);.    if( r
bc10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
bc20: 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61 73  eturn rc;.    as
bc30: 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73 7a  sert( szJ==os_sz
bc40: 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  J );.  }.#endif.
bc50: 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66 66  .  /* Set hdrOff
bc60: 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73 65   to be the offse
bc70: 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20 6a  t to the first j
bc80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72  ournal header wr
bc90: 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73 20  itten.  ** this 
bca0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
bcb0: 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65 6e  ction, or the en
bcc0: 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 66  d of the file if
bcd0: 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a   no journal.  **
bce0: 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69 74   header was writ
bcf0: 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72 4f  ten..  */.  hdrO
bd00: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
bd10: 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65 72  tHdrOff;.  asser
bd20: 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  t( pPager->fullS
bd30: 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20 29  ync || !hdrOff )
bd40: 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66 20  ;.  if( !hdrOff 
bd50: 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d 20  ){.    hdrOff = 
bd60: 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 20 20 2f 2a  szJ;.  }.  .  /*
bd70: 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 64 61   Truncate the da
bd80: 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f 20 69  tabase back to i
bd90: 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a 65  ts original size
bda0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61  ..  */.  if( pPa
bdb0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
bdc0: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
bdd0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
bde0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
bdf0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
be00: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
be10: 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  dbSize = pPager-
be20: 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a 20 20 2f 2a  >stmtSize;..  /*
be30: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
be40: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
be50: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
be60: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
be70: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
be80: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
be90: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
bea0: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  en );.  sqlite3O
beb0: 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 73  sSeek(&pPager->s
bec0: 74 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20  tfd, 0);.  nRec 
bed0: 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52  = pPager->stmtNR
bee0: 65 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79  ec;.  .  /* Copy
bef0: 20 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20   original pages 
bf00: 6f 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65  out of the state
bf10: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64  ment journal and
bf20: 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20   back into the. 
bf30: 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
bf40: 65 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68  e.  Note that th
bf50: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
bf60: 6e 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73  nal omits checks
bf70: 75 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61  ums from.  ** ea
bf80: 63 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20  ch record since 
bf90: 70 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65  power-failure re
bfa0: 63 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d  covery is not im
bfb0: 70 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65  portant to state
bfc0: 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61  ment.  ** journa
bfd0: 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69  ls..  */.  for(i
bfe0: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69  =nRec-1; i>=0; i
bff0: 2d 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61  --){.    rc = pa
c000: 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65  ger_playback_one
c010: 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70  _page(pPager, &p
c020: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
c030: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
c040: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
c050: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
c060: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
c070: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
c080: 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f    }..  /* Now ro
c090: 6c 6c 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61  ll some pages ba
c0a0: 63 6b 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e  ck from the tran
c0b0: 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e  saction journal.
c0c0: 20 50 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65   Pager.stmtJSize
c0d0: 0a 20 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69  .  ** was the si
c0e0: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
c0f0: 6c 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  l file when this
c100: 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73   statement was s
c110: 74 61 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20  tarted, so.  ** 
c120: 65 76 65 72 79 74 68 69 6e 67 20 61 66 74 65 72  everything after
c130: 20 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62   that needs to b
c140: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65  e rolled back, e
c150: 69 74 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20  ither into the. 
c160: 20 2a 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68   ** database, th
c170: 65 20 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20  e memory cache, 
c180: 6f 72 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20  or both..  **.  
c190: 2a 2a 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20  ** If it is not 
c1a0: 7a 65 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72  zero, then Pager
c1b0: 2e 73 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74  .stmtHdrOff is t
c1c0: 68 65 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65  he offset to the
c1d0: 20 73 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74   start.  ** of t
c1e0: 68 65 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c  he first journal
c1f0: 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e 20   header written 
c200: 64 75 72 69 6e 67 20 74 68 69 73 20 73 74 61 74  during this stat
c210: 65 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  ement transactio
c220: 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  n..  */.  rc = s
c230: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
c240: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
c250: 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
c260: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c270: 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65  OK ){.    goto e
c280: 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  nd_stmt_playback
c290: 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
c2a0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61  journalOff = pPa
c2b0: 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a  ger->stmtJSize;.
c2c0: 20 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49    pPager->cksumI
c2d0: 6e 69 74 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  nit = pPager->st
c2e0: 6d 74 43 6b 73 75 6d 3b 0a 20 20 61 73 73 65 72  mtCksum;.  asser
c2f0: 74 28 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53  t( JOURNAL_HDR_S
c300: 5a 28 70 50 61 67 65 72 29 3c 28 70 50 61 67 65  Z(pPager)<(pPage
c310: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 20 29  r->pageSize+8) )
c320: 3b 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65  ;.  while( pPage
c330: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 3d  r->journalOff <=
c340: 20 28 68 64 72 4f 66 66 2d 28 70 50 61 67 65 72   (hdrOff-(pPager
c350: 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 29 20 29  ->pageSize+8)) )
c360: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
c370: 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61  _playback_one_pa
c380: 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61 67  ge(pPager, &pPag
c390: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
c3a0: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
c3b0: 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20  ITE_DONE );.    
c3c0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c3d0: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d  K ) goto end_stm
c3e0: 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a  t_playback;.  }.
c3f0: 0a 20 20 77 68 69 6c 65 28 20 70 50 61 67 65 72  .  while( pPager
c400: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73  ->journalOff < s
c410: 7a 4a 20 29 7b 0a 20 20 20 20 75 33 32 20 6e 52  zJ ){.    u32 nR
c420: 65 63 3b 0a 20 20 20 20 75 33 32 20 64 75 6d 6d  ec;.    u32 dumm
c430: 79 3b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  y;.    rc = read
c440: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
c450: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
c460: 64 75 6d 6d 79 29 3b 0a 20 20 20 20 69 66 28 20  dummy);.    if( 
c470: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c480: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 72  .      assert( r
c490: 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c!=SQLITE_DONE )
c4a0: 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64  ;.      goto end
c4b0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
c4c0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 52      }.    if( nR
c4d0: 65 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e  ec==0 ){.      n
c4e0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 70 50 61  Rec = (szJ - pPa
c4f0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  ger->journalOff)
c500: 20 2f 20 28 70 50 61 67 65 72 2d 3e 70 61 67 65   / (pPager->page
c510: 53 69 7a 65 2b 38 29 3b 0a 20 20 20 20 7d 0a 20  Size+8);.    }. 
c520: 20 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b     for(i=nRec-1;
c530: 20 69 3e 3d 30 20 26 26 20 70 50 61 67 65 72 2d   i>=0 && pPager-
c540: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3c 20 73 7a  >journalOff < sz
c550: 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 20 20 72  J; i--){.      r
c560: 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61  c = pager_playba
c570: 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67  ck_one_page(pPag
c580: 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  er, &pPager->jfd
c590: 2c 20 31 29 3b 0a 20 20 20 20 20 20 61 73 73 65  , 1);.      asse
c5a0: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
c5b0: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ONE );.      if(
c5c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
c5d0: 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70   goto end_stmt_p
c5e0: 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20  layback;.    }. 
c5f0: 20 7d 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f   }..  pPager->jo
c600: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
c610: 20 20 0a 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79    .end_stmt_play
c620: 62 61 63 6b 3a 0a 20 20 69 66 28 20 72 63 21 3d  back:.  if( rc!=
c630: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
c640: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
c650: 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 43 4f   |= PAGER_ERR_CO
c660: 52 52 55 50 54 3b 0a 20 20 20 20 72 63 20 3d 20  RRUPT;.    rc = 
c670: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 20  SQLITE_CORRUPT; 
c680: 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50 54   /* bkpt-CORRUPT
c690: 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   */.  }else{.   
c6a0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c6b0: 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 20 20 2f  Off = szJ;.    /
c6c0: 2a 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63  * pager_reload_c
c6d0: 61 63 68 65 28 70 50 61 67 65 72 29 3b 20 2a 2f  ache(pPager); */
c6e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
c6f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e 67  ;.}../*.** Chang
c700: 65 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75  e the maximum nu
c710: 6d 62 65 72 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72  mber of in-memor
c720: 79 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65  y pages that are
c730: 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a 0a 2a 2a 20   allowed..**.** 
c740: 54 68 65 20 6d 61 78 69 6d 75 6d 20 6e 75 6d 62  The maximum numb
c750: 65 72 20 69 73 20 74 68 65 20 61 62 73 6f 6c 75  er is the absolu
c760: 74 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  te value of the 
c770: 6d 78 50 61 67 65 20 70 61 72 61 6d 65 74 65 72  mxPage parameter
c780: 2e 0a 2a 2a 20 49 66 20 6d 78 50 61 67 65 20 69  ..** If mxPage i
c790: 73 20 6e 65 67 61 74 69 76 65 2c 20 74 68 65 20  s negative, the 
c7a0: 6e 6f 53 79 6e 63 20 66 6c 61 67 20 69 73 20 61  noSync flag is a
c7b0: 6c 73 6f 20 73 65 74 2e 20 20 6e 6f 53 79 6e 63  lso set.  noSync
c7c0: 20 62 79 70 61 73 73 65 73 0a 2a 2a 20 63 61 6c   bypasses.** cal
c7d0: 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 53  ls to sqlite3OsS
c7e0: 79 6e 63 28 29 2e 20 20 54 68 65 20 70 61 67 65  ync().  The page
c7f0: 72 20 72 75 6e 73 20 6d 75 63 68 20 66 61 73 74  r runs much fast
c800: 65 72 20 77 69 74 68 20 6e 6f 53 79 6e 63 20 6f  er with noSync o
c810: 6e 2c 0a 2a 2a 20 62 75 74 20 69 66 20 74 68 65  n,.** but if the
c820: 20 6f 70 65 72 61 74 69 6e 67 20 73 79 73 74 65   operating syste
c830: 6d 20 63 72 61 73 68 65 73 20 6f 72 20 74 68 65  m crashes or the
c840: 72 65 20 69 73 20 61 6e 20 61 62 72 75 70 74 20  re is an abrupt 
c850: 70 6f 77 65 72 20 0a 2a 2a 20 66 61 69 6c 75 72  power .** failur
c860: 65 2c 20 74 68 65 20 64 61 74 61 62 61 73 65 20  e, the database 
c870: 66 69 6c 65 20 6d 69 67 68 74 20 62 65 20 6c 65  file might be le
c880: 66 74 20 69 6e 20 61 6e 20 69 6e 63 6f 6e 73 69  ft in an inconsi
c890: 73 74 65 6e 74 20 61 6e 64 0a 2a 2a 20 75 6e 72  stent and.** unr
c8a0: 65 70 61 69 72 61 62 6c 65 20 73 74 61 74 65 2e  epairable state.
c8b0: 20 20 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74    .*/.void sqlit
c8c0: 65 33 70 61 67 65 72 5f 73 65 74 5f 63 61 63 68  e3pager_set_cach
c8d0: 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61  esize(Pager *pPa
c8e0: 67 65 72 2c 20 69 6e 74 20 6d 78 50 61 67 65 29  ger, int mxPage)
c8f0: 7b 0a 20 20 69 66 28 20 6d 78 50 61 67 65 3e 3d  {.  if( mxPage>=
c900: 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 ){.    pPager-
c910: 3e 6e 6f 53 79 6e 63 20 3d 20 70 50 61 67 65 72  >noSync = pPager
c920: 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  ->tempFile;.    
c930: 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79  if( pPager->noSy
c940: 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65  nc ) pPager->nee
c950: 64 53 79 6e 63 20 3d 20 30 3b 20 0a 20 20 7d 65  dSync = 0; .  }e
c960: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
c970: 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  >noSync = 1;.   
c980: 20 6d 78 50 61 67 65 20 3d 20 2d 6d 78 50 61 67   mxPage = -mxPag
c990: 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6d 78 50  e;.  }.  if( mxP
c9a0: 61 67 65 3e 31 30 20 29 7b 0a 20 20 20 20 70 50  age>10 ){.    pP
c9b0: 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 6d  ager->mxPage = m
c9c0: 78 50 61 67 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a  xPage;.  }else{.
c9d0: 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61      pPager->mxPa
c9e0: 67 65 20 3d 20 31 30 3b 0a 20 20 7d 0a 7d 0a 0a  ge = 10;.  }.}..
c9f0: 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74 20 74 68 65  /*.** Adjust the
ca00: 20 72 6f 62 75 73 74 6e 65 73 73 20 6f 66 20 74   robustness of t
ca10: 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20 64  he database to d
ca20: 61 6d 61 67 65 20 64 75 65 20 74 6f 20 4f 53 20  amage due to OS 
ca30: 63 72 61 73 68 65 73 0a 2a 2a 20 6f 72 20 70 6f  crashes.** or po
ca40: 77 65 72 20 66 61 69 6c 75 72 65 73 20 62 79 20  wer failures by 
ca50: 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6e 75 6d  changing the num
ca60: 62 65 72 20 6f 66 20 73 79 6e 63 73 28 29 73 20  ber of syncs()s 
ca70: 77 68 65 6e 20 77 72 69 74 69 6e 67 0a 2a 2a 20  when writing.** 
ca80: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75  the rollback jou
ca90: 72 6e 61 6c 2e 20 20 54 68 65 72 65 20 61 72 65  rnal.  There are
caa0: 20 74 68 72 65 65 20 6c 65 76 65 6c 73 3a 0a 2a   three levels:.*
cab0: 2a 0a 2a 2a 20 20 20 20 4f 46 46 20 20 20 20 20  *.**    OFF     
cac0: 20 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28    sqlite3OsSync(
cad0: 29 20 69 73 20 6e 65 76 65 72 20 63 61 6c 6c 65  ) is never calle
cae0: 64 2e 20 20 54 68 69 73 20 69 73 20 74 68 65 20  d.  This is the 
caf0: 64 65 66 61 75 6c 74 0a 2a 2a 20 20 20 20 20 20  default.**      
cb00: 20 20 20 20 20 20 20 20 66 6f 72 20 74 65 6d 70          for temp
cb10: 6f 72 61 72 79 20 61 6e 64 20 74 72 61 6e 73 69  orary and transi
cb20: 65 6e 74 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a  ent files..**.**
cb30: 20 20 20 20 4e 4f 52 4d 41 4c 20 20 20 20 54 68      NORMAL    Th
cb40: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
cb50: 63 65 64 20 6f 6e 63 65 20 62 65 66 6f 72 65 20  ced once before 
cb60: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
cb70: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
cb80: 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 20 54      database.  T
cb90: 68 69 73 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20  his is normally 
cba0: 61 64 65 71 75 61 74 65 20 70 72 6f 74 65 63 74  adequate protect
cbb0: 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 20 20 20 20  ion, but.**     
cbc0: 20 20 20 20 20 20 20 20 20 69 74 20 69 73 20 74           it is t
cbd0: 68 65 6f 72 65 74 69 63 61 6c 6c 79 20 70 6f 73  heoretically pos
cbe0: 73 69 62 6c 65 2c 20 74 68 6f 75 67 68 20 76 65  sible, though ve
cbf0: 72 79 20 75 6e 6c 69 6b 65 6c 79 2c 0a 2a 2a 20  ry unlikely,.** 
cc00: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 61               tha
cc10: 74 20 61 6e 20 69 6e 6f 70 65 72 74 75 6e 65 20  t an inopertune 
cc20: 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 63 6f  power failure co
cc30: 75 6c 64 20 6c 65 61 76 65 20 74 68 65 20 6a 6f  uld leave the jo
cc40: 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20  urnal.**        
cc50: 20 20 20 20 20 20 69 6e 20 61 20 73 74 61 74 65        in a state
cc60: 20 77 68 69 63 68 20 77 6f 75 6c 64 20 63 61 75   which would cau
cc70: 73 65 20 64 61 6d 61 67 65 20 74 6f 20 74 68 65  se damage to the
cc80: 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20   database.**    
cc90: 20 20 20 20 20 20 20 20 20 20 77 68 65 6e 20 69            when i
cca0: 74 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b  t is rolled back
ccb0: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46 55 4c 4c 20  ..**.**    FULL 
ccc0: 20 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c       The journal
ccd0: 20 69 73 20 73 79 6e 63 65 64 20 74 77 69 63 65   is synced twice
cce0: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
ccf0: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
cd00: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
cd10: 62 61 73 65 20 28 77 69 74 68 20 73 6f 6d 65 20  base (with some 
cd20: 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72  additional infor
cd30: 6d 61 74 69 6f 6e 20 2d 20 74 68 65 20 6e 52 65  mation - the nRe
cd40: 63 20 66 69 65 6c 64 0a 2a 2a 20 20 20 20 20 20  c field.**      
cd50: 20 20 20 20 20 20 20 20 6f 66 20 74 68 65 20 6a          of the j
cd60: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 2d 20  ournal header - 
cd70: 62 65 69 6e 67 20 77 72 69 74 74 65 6e 20 69 6e  being written in
cd80: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
cd90: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
cda0: 20 73 79 6e 63 73 29 2e 20 20 49 66 20 77 65 20   syncs).  If we 
cdb0: 61 73 73 75 6d 65 20 74 68 61 74 20 77 72 69 74  assume that writ
cdc0: 69 6e 67 20 61 0a 2a 2a 20 20 20 20 20 20 20 20  ing a.**        
cdd0: 20 20 20 20 20 20 73 69 6e 67 6c 65 20 64 69 73        single dis
cde0: 6b 20 73 65 63 74 6f 72 20 69 73 20 61 74 6f 6d  k sector is atom
cdf0: 69 63 2c 20 74 68 65 6e 20 74 68 69 73 20 6d 6f  ic, then this mo
ce00: 64 65 20 70 72 6f 76 69 64 65 73 0a 2a 2a 20 20  de provides.**  
ce10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 75              assu
ce20: 72 61 6e 63 65 20 74 68 61 74 20 74 68 65 20 6a  rance that the j
ce30: 6f 75 72 6e 61 6c 20 77 69 6c 6c 20 6e 6f 74 20  ournal will not 
ce40: 62 65 20 63 6f 72 72 75 70 74 65 64 20 74 6f 20  be corrupted to 
ce50: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
ce60: 20 20 20 20 70 6f 69 6e 74 20 6f 66 20 63 61 75      point of cau
ce70: 73 69 6e 67 20 64 61 6d 61 67 65 20 74 6f 20 74  sing damage to t
ce80: 68 65 20 64 61 74 61 62 61 73 65 20 64 75 72 69  he database duri
ce90: 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a  ng rollback..**.
cea0: 2a 2a 20 4e 75 6d 65 72 69 63 20 76 61 6c 75 65  ** Numeric value
ceb0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
cec0: 68 20 74 68 65 73 65 20 73 74 61 74 65 73 20 61  h these states a
ced0: 72 65 20 4f 46 46 3d 3d 31 2c 20 4e 4f 52 4d 41  re OFF==1, NORMA
cee0: 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20 46 55 4c 4c  L=2,.** and FULL
cef0: 3d 33 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53  =3..*/.#ifndef S
cf00: 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 41 47 45 52  QLITE_OMIT_PAGER
cf10: 5f 50 52 41 47 4d 41 53 0a 76 6f 69 64 20 73 71  _PRAGMAS.void sq
cf20: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 73  lite3pager_set_s
cf30: 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61 67 65  afety_level(Page
cf40: 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6c  r *pPager, int l
cf50: 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65 72 2d  evel){.  pPager-
cf60: 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76 65 6c  >noSync =  level
cf70: 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d 3e 74  ==1 || pPager->t
cf80: 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61 67 65  empFile;.  pPage
cf90: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20 6c 65  r->fullSync = le
cfa0: 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61 67 65  vel==3 && !pPage
cfb0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 69  r->tempFile;.  i
cfc0: 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  f( pPager->noSyn
cfd0: 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  c ) pPager->need
cfe0: 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 23 65 6e 64  Sync = 0;.}.#end
cff0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  if../*.** Open a
d000: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
d010: 20 20 57 72 69 74 65 20 74 68 65 20 6e 61 6d 65    Write the name
d020: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
d030: 6f 20 7a 4e 61 6d 65 0a 2a 2a 20 28 7a 4e 61 6d  o zName.** (zNam
d040: 65 20 6d 75 73 74 20 62 65 20 61 74 20 6c 65 61  e must be at lea
d050: 73 74 20 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  st SQLITE_TEMPNA
d060: 4d 45 5f 53 49 5a 45 20 62 79 74 65 73 20 6c 6f  ME_SIZE bytes lo
d070: 6e 67 2e 29 20 20 57 72 69 74 65 0a 2a 2a 20 74  ng.)  Write.** t
d080: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
d090: 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
d0a0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
d0b0: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
d0c0: 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
d0d0: 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
d0e0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77  ..**.** The OS w
d0f0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
d100: 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  y delete the tem
d110: 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
d120: 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64   it is.** closed
d130: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
d140: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65  sqlite3pager_ope
d150: 6e 74 65 6d 70 28 63 68 61 72 20 2a 7a 46 69 6c  ntemp(char *zFil
d160: 65 2c 20 4f 73 46 69 6c 65 20 2a 66 64 29 7b 0a  e, OsFile *fd){.
d170: 20 20 69 6e 74 20 63 6e 74 20 3d 20 38 3b 0a 20    int cnt = 8;. 
d180: 20 69 6e 74 20 72 63 3b 0a 20 20 64 6f 7b 0a 20   int rc;.  do{. 
d190: 20 20 20 63 6e 74 2d 2d 3b 0a 20 20 20 20 73 71     cnt--;.    sq
d1a0: 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65 4e  lite3OsTempFileN
d1b0: 61 6d 65 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20  ame(zFile);.    
d1c0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
d1d0: 65 6e 45 78 63 6c 75 73 69 76 65 28 7a 46 69 6c  enExclusive(zFil
d1e0: 65 2c 20 66 64 2c 20 31 29 3b 0a 20 20 7d 77 68  e, fd, 1);.  }wh
d1f0: 69 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63  ile( cnt>0 && rc
d200: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  !=SQLITE_OK && r
d210: 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
d220: 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
d230: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20  }../*.** Create 
d240: 61 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65  a new page cache
d250: 20 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74   and put a point
d260: 65 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63  er to the page c
d270: 61 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72  ache in *ppPager
d280: 2e 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f  ..** The file to
d290: 20 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20   be cached need 
d2a0: 6e 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20  not exist.  The 
d2b0: 66 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b  file is not lock
d2c0: 65 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20  ed until.** the 
d2d0: 66 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71  first call to sq
d2e0: 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 29  lite3pager_get()
d2f0: 20 61 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c   and is only hel
d300: 64 20 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65  d open until the
d310: 0a 2a 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73  .** last page is
d320: 20 72 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20   released using 
d330: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72  sqlite3pager_unr
d340: 65 66 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a  ef()..**.** If z
d350: 46 69 6c 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c  Filename is NULL
d360: 20 74 68 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79   then a randomly
d370: 2d 6e 61 6d 65 64 20 74 65 6d 70 6f 72 61 72 79  -named temporary
d380: 20 66 69 6c 65 20 69 73 20 63 72 65 61 74 65 64   file is created
d390: 0a 2a 2a 20 61 6e 64 20 75 73 65 64 20 61 73 20  .** and used as 
d3a0: 74 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  the file to be c
d3b0: 61 63 68 65 64 2e 20 20 54 68 65 20 66 69 6c 65  ached.  The file
d3c0: 20 77 69 6c 6c 20 62 65 20 64 65 6c 65 74 65 64   will be deleted
d3d0: 0a 2a 2a 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  .** automaticall
d3e0: 79 20 77 68 65 6e 20 69 74 20 69 73 20 63 6c 6f  y when it is clo
d3f0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46  sed..**.** If zF
d400: 69 6c 65 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d  ilename is ":mem
d410: 6f 72 79 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69  ory:" then all i
d420: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 68 65  nformation is he
d430: 6c 64 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20  ld in cache..** 
d440: 49 74 20 69 73 20 6e 65 76 65 72 20 77 72 69 74  It is never writ
d450: 74 65 6e 20 74 6f 20 64 69 73 6b 2e 20 20 54 68  ten to disk.  Th
d460: 69 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  is can be used t
d470: 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a  o implement an.*
d480: 2a 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  * in-memory data
d490: 62 61 73 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  base..*/.int sql
d4a0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 28 0a  ite3pager_open(.
d4b0: 20 20 50 61 67 65 72 20 2a 2a 70 70 50 61 67 65    Pager **ppPage
d4c0: 72 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65  r,         /* Re
d4d0: 74 75 72 6e 20 74 68 65 20 50 61 67 65 72 20 73  turn the Pager s
d4e0: 74 72 75 63 74 75 72 65 20 68 65 72 65 20 2a 2f  tructure here */
d4f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
d500: 46 69 6c 65 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e  Filename,   /* N
d510: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
d520: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
d530: 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72 61   */.  int nExtra
d540: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ,              /
d550: 2a 20 45 78 74 72 61 20 62 79 74 65 73 20 61 70  * Extra bytes ap
d560: 70 65 6e 64 20 74 6f 20 65 61 63 68 20 69 6e 2d  pend to each in-
d570: 6d 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20  memory page */. 
d580: 20 69 6e 74 20 66 6c 61 67 73 20 20 20 20 20 20   int flags      
d590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 66 6c 61            /* fla
d5a0: 67 73 20 63 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74  gs controlling t
d5b0: 68 69 73 20 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20  his file */.){. 
d5c0: 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a   Pager *pPager;.
d5d0: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
d5e0: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
d5f0: 20 6e 61 6d 65 4c 65 6e 3b 0a 20 20 4f 73 46 69   nameLen;.  OsFi
d600: 6c 65 20 66 64 3b 0a 20 20 69 6e 74 20 72 63 20  le fd;.  int rc 
d610: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
d620: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 74 65 6d 70  nt i;.  int temp
d630: 46 69 6c 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  File = 0;.  int 
d640: 6d 65 6d 44 62 20 3d 20 30 3b 0a 20 20 69 6e 74  memDb = 0;.  int
d650: 20 72 65 61 64 4f 6e 6c 79 20 3d 20 30 3b 0a 20   readOnly = 0;. 
d660: 20 69 6e 74 20 75 73 65 4a 6f 75 72 6e 61 6c 20   int useJournal 
d670: 3d 20 28 66 6c 61 67 73 20 26 20 50 41 47 45 52  = (flags & PAGER
d680: 5f 4f 4d 49 54 5f 4a 4f 55 52 4e 41 4c 29 3d 3d  _OMIT_JOURNAL)==
d690: 30 3b 0a 20 20 69 6e 74 20 6e 6f 52 65 61 64 6c  0;.  int noReadl
d6a0: 6f 63 6b 20 3d 20 28 66 6c 61 67 73 20 26 20 50  ock = (flags & P
d6b0: 41 47 45 52 5f 4e 4f 5f 52 45 41 44 4c 4f 43 4b  AGER_NO_READLOCK
d6c0: 29 21 3d 30 3b 0a 20 20 63 68 61 72 20 7a 54 65  )!=0;.  char zTe
d6d0: 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
d6e0: 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70 70  ME_SIZE];..  *pp
d6f0: 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d  Pager = 0;.  mem
d700: 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a 65  set(&fd, 0, size
d710: 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20 73  of(fd));.  if( s
d720: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
d730: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
d740: 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b  rn SQLITE_NOMEM;
d750: 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c 65  .  }.  if( zFile
d760: 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61 6d  name && zFilenam
d770: 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66 20  e[0] ){.#ifndef 
d780: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
d790: 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74 72  RYDB.    if( str
d7a0: 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22 3a  cmp(zFilename,":
d7b0: 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b 0a  memory:")==0 ){.
d7c0: 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31 3b        memDb = 1;
d7d0: 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74 68  .      zFullPath
d7e0: 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  name = sqliteStr
d7f0: 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20 72  Dup("");.      r
d800: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d810: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a     }else.#endif.
d820: 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75 6c      {.      zFul
d830: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
d840: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
d850: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
d860: 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74      if( zFullPat
d870: 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20  hname ){.       
d880: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
d890: 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46 75  penReadWrite(zFu
d8a0: 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64 2c  llPathname, &fd,
d8b0: 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20 20   &readOnly);.   
d8c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
d8d0: 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  se{.    rc = sql
d8e0: 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65  ite3pager_opente
d8f0: 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b 0a  mp(zTemp, &fd);.
d900: 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20      zFilename = 
d910: 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c  zTemp;.    zFull
d920: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
d930: 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65  e3OsFullPathname
d940: 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  (zFilename);.   
d950: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
d960: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d 70  OK ){.      temp
d970: 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  File = 1;.    }.
d980: 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c 6c    }.  if( !zFull
d990: 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20  Pathname ){.    
d9a0: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
d9b0: 66 64 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  fd);.    return 
d9c0: 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
d9d0: 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
d9e0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
d9f0: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29  ite3OsClose(&fd)
da00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
da10: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b  (zFullPathname);
da20: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
da30: 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d 20    }.  nameLen = 
da40: 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74 68  strlen(zFullPath
da50: 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 20  name);.  pPager 
da60: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
da70: 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29 20  sizeof(*pPager) 
da80: 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33 30  + nameLen*3 + 30
da90: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
daa0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
dab0: 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b 0a  e3OsClose(&fd);.
dac0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
dad0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20  FullPathname);. 
dae0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
daf0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54 52  _NOMEM;.  }.  TR
db00: 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73  ACE3("OPEN %d %s
db10: 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49  \n", FILEHANDLEI
db20: 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68  D(fd), zFullPath
db30: 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72 2d  name);.  pPager-
db40: 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63 68  >zFilename = (ch
db50: 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b 0a  ar*)&pPager[1];.
db60: 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63    pPager->zDirec
db70: 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d 3e  tory = &pPager->
db80: 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c 65  zFilename[nameLe
db90: 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e  n+1];.  pPager->
dba0: 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61 67  zJournal = &pPag
dbb0: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 6e  er->zDirectory[n
dbc0: 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74 72  ameLen+1];.  str
dbd0: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69 6c  cpy(pPager->zFil
dbe0: 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74 68  ename, zFullPath
dbf0: 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28  name);.  strcpy(
dc00: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
dc10: 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  ry, zFullPathnam
dc20: 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d 65  e);.  for(i=name
dc30: 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61 67  Len; i>0 && pPag
dc40: 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b 69  er->zDirectory[i
dc50: 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b 7d  -1]!='/'; i--){}
dc60: 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50 61  .  if( i>0 ) pPa
dc70: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
dc80: 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72 63  i-1] = 0;.  strc
dc90: 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  py(pPager->zJour
dca0: 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  nal, zFullPathna
dcb0: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  me);.  sqliteFre
dcc0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
dcd0: 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61 67  ;.  strcpy(&pPag
dce0: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
dcf0: 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
dd00: 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  ");.  pPager->fd
dd10: 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55 4e   = fd;.#if OS_UN
dd20: 49 58 0a 20 20 70 50 61 67 65 72 2d 3e 66 64 2e  IX.  pPager->fd.
dd30: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
dd40: 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65 72  .#endif.  pPager
dd50: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
dd60: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73 65  0;.  pPager->use
dd70: 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f 75  Journal = useJou
dd80: 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b 0a  rnal && !memDb;.
dd90: 20 20 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64    pPager->noRead
dda0: 6c 6f 63 6b 20 3d 20 6e 6f 52 65 61 64 6c 6f 63  lock = noReadloc
ddb0: 6b 20 26 26 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  k && readOnly;. 
ddc0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65   pPager->stmtOpe
ddd0: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
dde0: 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b 0a  >stmtInUse = 0;.
ddf0: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
de00: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62   0;.  pPager->db
de10: 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31 3b 0a  Size = memDb-1;.
de20: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
de30: 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45 46 41  ze = SQLITE_DEFA
de40: 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b 0a 20  ULT_PAGE_SIZE;. 
de50: 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e   pPager->psAlign
de60: 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ed = FORCE_ALIGN
de70: 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 70 61 67  MENT(pPager->pag
de80: 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67 65 72  eSize);.  pPager
de90: 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30 3b 0a  ->stmtSize = 0;.
dea0: 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53    pPager->stmtJS
deb0: 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ize = 0;.  pPage
dec0: 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20  r->nPage = 0;.  
ded0: 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 3d  pPager->mxPage =
dee0: 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   100;.  pPager->
def0: 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
df00: 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72 2d 3e  LOCK;.  pPager->
df10: 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20 20 70  errMask = 0;.  p
df20: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
df30: 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50  = tempFile;.  pP
df40: 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20 6d 65  ager->memDb = me
df50: 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 72  mDb;.  pPager->r
df60: 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64 4f 6e  eadOnly = readOn
df70: 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65  ly;.  pPager->ne
df80: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50  edSync = 0;.  pP
df90: 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70  ager->noSync = p
dfa0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
dfb0: 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b 0a  || !useJournal;.
dfc0: 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79    pPager->fullSy
dfd0: 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e 6f  nc = (pPager->no
dfe0: 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70 50 61  Sync?0:1);.  pPa
dff0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b  ger->pFirst = 0;
e000: 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73  .  pPager->pFirs
e010: 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70  tSynced = 0;.  p
e020: 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
e030: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45 78 74  ;.  pPager->nExt
e040: 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ra = FORCE_ALIGN
e050: 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a 20 20  MENT(nExtra);.  
e060: 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69  pPager->sectorSi
e070: 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43 54 4f  ze = PAGER_SECTO
e080: 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67 65 72  R_SIZE;.  pPager
e090: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
e0a0: 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61   0;.  memset(pPa
e0b0: 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73  ger->aHash, 0, s
e0c0: 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48  izeof(pPager->aH
e0d0: 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61 67 65  ash));.  *ppPage
e0e0: 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 72 65  r = pPager;.  re
e0f0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
e100: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
e110: 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
e120: 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
e130: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
e140: 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67  _busyhandler(Pag
e150: 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79  er *pPager, Busy
e160: 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61  Handler *pBusyHa
e170: 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72  ndler){.  pPager
e180: 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
e190: 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d   pBusyHandler;.}
e1a0: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
e1b0: 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74  destructor for t
e1c0: 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e  his pager.  If n
e1d0: 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73  ot NULL, the des
e1e0: 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65  tructor is calle
e1f0: 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65  d.** when the re
e200: 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e  ference count on
e210: 20 65 61 63 68 20 70 61 67 65 20 72 65 61 63 68   each page reach
e220: 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65  es zero.  The de
e230: 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20  structor can.** 
e240: 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e  be used to clean
e250: 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20   up information 
e260: 69 6e 20 74 68 65 20 65 78 74 72 61 20 73 65 67  in the extra seg
e270: 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f  ment appended to
e280: 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a   each page..**.*
e290: 2a 20 54 68 65 20 64 65 73 74 72 75 63 74 6f 72  * The destructor
e2a0: 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61   is not called a
e2b0: 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74  s a result sqlit
e2c0: 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 2e  e3pager_close().
e2d0: 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74 6f 72    .** Destructor
e2e0: 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65  s are only calle
e2f0: 64 20 62 79 20 73 71 6c 69 74 65 33 70 61 67 65  d by sqlite3page
e300: 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f  r_unref()..*/.vo
e310: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
e320: 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72 28 50  set_destructor(P
e330: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f  ager *pPager, vo
e340: 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f 69 64  id (*xDesc)(void
e350: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
e360: 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 3d  r->xDestructor =
e370: 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   xDesc;.}../*.**
e380: 20 53 65 74 20 74 68 65 20 72 65 69 6e 69 74 69   Set the reiniti
e390: 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69 73 20  alizer for this 
e3a0: 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74 20 4e  pager.  If not N
e3b0: 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69 74 69  ULL, the reiniti
e3c0: 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63 61 6c  alizer.** is cal
e3d0: 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63 6f 6e  led when the con
e3e0: 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65 20 69  tent of a page i
e3f0: 6e 20 63 61 63 68 65 20 69 73 20 72 65 73 74 6f  n cache is resto
e400: 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69 67 69  red to its origi
e410: 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61 73 20  nal.** value as 
e420: 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20 72 6f  a result of a ro
e430: 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63 61 6c  llback.  The cal
e440: 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69 67 68  lback gives high
e450: 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a 2a 2a  er-level code.**
e460: 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74 79 20   an opportunity 
e470: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65 20 45  to restore the E
e480: 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74 6f 20  XTRA section to 
e490: 61 67 72 65 65 20 77 69 74 68 20 74 68 65 20 72  agree with the r
e4a0: 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67 65 20  estored.** page 
e4b0: 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  data..*/.void sq
e4c0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 72  lite3pager_set_r
e4d0: 65 69 6e 69 74 65 72 28 50 61 67 65 72 20 2a 70  einiter(Pager *p
e4e0: 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78 52  Pager, void (*xR
e4f0: 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69 6e 74  einit)(void*,int
e500: 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 52  )){.  pPager->xR
e510: 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69 6e 69  einiter = xReini
e520: 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  t;.}../*.** Set 
e530: 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e 0a 2a  the page size..*
e540: 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20 73 69  *.** The page si
e550: 7a 65 20 6d 75 73 74 20 6f 6e 6c 79 20 62 65 20  ze must only be 
e560: 63 68 61 6e 67 65 64 20 77 68 65 6e 20 74 68 65  changed when the
e570: 20 63 61 63 68 65 20 69 73 20 65 6d 70 74 79 2e   cache is empty.
e580: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
e590: 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65 73 69  pager_set_pagesi
e5a0: 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ze(Pager *pPager
e5b0: 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65 29 7b  , int pageSize){
e5c0: 0a 20 20 61 73 73 65 72 74 28 20 70 61 67 65 53  .  assert( pageS
e5d0: 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61 67 65  ize>=512 && page
e5e0: 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d 41 58  Size<=SQLITE_MAX
e5f0: 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a 20 20  _PAGE_SIZE );.  
e600: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
e610: 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20 70   = pageSize;.  p
e620: 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64  Pager->psAligned
e630: 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e 4d 45   = FORCE_ALIGNME
e640: 4e 54 28 70 61 67 65 53 69 7a 65 29 3b 0a 7d 0a  NT(pageSize);.}.
e650: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65 20  ./*.** Read the 
e660: 66 69 72 73 74 20 4e 20 62 79 74 65 73 20 66 72  first N bytes fr
e670: 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  om the beginning
e680: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 6e 74   of the file int
e690: 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68 61 74  o memory.** that
e6a0: 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20 74 6f   pDest points to
e6b0: 2e 20 20 4e 6f 20 65 72 72 6f 72 20 63 68 65 63  .  No error chec
e6c0: 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 0a 2a 2f  king is done..*/
e6d0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
e6e0: 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65 61 64  er_read_filehead
e6f0: 65 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  er(Pager *pPager
e700: 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67 6e 65  , int N, unsigne
e710: 64 20 63 68 61 72 20 2a 70 44 65 73 74 29 7b 0a  d char *pDest){.
e720: 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74 2c 20    memset(pDest, 
e730: 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d 45 4d  0, N);.  if( MEM
e740: 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  DB==0 ){.    sql
e750: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
e760: 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20  er->fd, 0);.    
e770: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
e780: 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74  Pager->fd, pDest
e790: 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , N);.  }.}../*.
e7a0: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f  ** Return the to
e7b0: 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  tal number of pa
e7c0: 67 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20  ges in the disk 
e7d0: 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20  file associated 
e7e0: 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 0a  with.** pPager..
e7f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
e800: 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 50 61  ger_pagecount(Pa
e810: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
e820: 69 36 34 20 6e 3b 0a 20 20 61 73 73 65 72 74 28  i64 n;.  assert(
e830: 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20   pPager!=0 );.  
e840: 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  if( pPager->dbSi
e850: 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  ze>=0 ){.    ret
e860: 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  urn pPager->dbSi
e870: 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71  ze;.  }.  if( sq
e880: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
e890: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29  &pPager->fd, &n)
e8a0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
e8b0: 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61     pPager->errMa
e8c0: 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f  sk |= PAGER_ERR_
e8d0: 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75 72 6e  DISK;.    return
e8e0: 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d 20 70   0;.  }.  n /= p
e8f0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 3b  Pager->pageSize;
e900: 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20 26 26  .  if( !MEMDB &&
e910: 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45   n==PENDING_BYTE
e920: 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a  /pPager->pageSiz
e930: 65 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a 20 20  e ){.    n++;.  
e940: 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
e950: 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c  state!=PAGER_UNL
e960: 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65  OCK ){.    pPage
e970: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b 0a 20  r->dbSize = n;. 
e980: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d   }.  return n;.}
e990: 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20  ../*.** Forward 
e9a0: 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73  declaration.*/.s
e9b0: 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f  tatic int syncJo
e9c0: 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a  urnal(Pager*);..
e9d0: 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50  ./*.** Unlink pP
e9e0: 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68  g from it's hash
e9f0: 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73 65 74   chain. Also set
ea00: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
ea10: 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63 61 74   to 0 to indicat
ea20: 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20 70 61  e.** that the pa
ea30: 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74 20 6f  ge is not part o
ea40: 66 20 61 6e 79 20 68 61 73 68 20 63 68 61 69 6e  f any hash chain
ea50: 2e 20 54 68 69 73 20 69 73 20 72 65 71 75 69 72  . This is requir
ea60: 65 64 20 62 65 63 61 75 73 65 20 74 68 65 0a 2a  ed because the.*
ea70: 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6d  * sqlite3pager_m
ea80: 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74 69 6e  ovepage() routin
ea90: 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20 70 61  e can leave a pa
eaa0: 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20 70 4e  ge in the .** pN
eab0: 65 78 74 46 72 65 65 2f 70 50 72 65 76 46 72 65  extFree/pPrevFre
eac0: 65 20 6c 69 73 74 20 74 68 61 74 20 69 73 20 6e  e list that is n
ead0: 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61 6e 79  ot a part of any
eae0: 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a 2f 0a   hash-chain..*/.
eaf0: 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e 6c 69  static void unli
eb00: 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61 67 65  nkHashChain(Page
eb10: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72  r *pPager, PgHdr
eb20: 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50   *pPg){.  if( pP
eb30: 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20 20  g->pgno==0 ){.  
eb40: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
eb50: 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72 6f 2c   number is zero,
eb60: 20 74 68 65 6e 20 74 68 69 73 20 70 61 67 65 20   then this page 
eb70: 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20 68 61  is not in any ha
eb80: 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20 20 20  sh chain. */.   
eb90: 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 69   return;.  }.  i
eba0: 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73  f( pPg->pNextHas
ebb0: 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  h ){.    pPg->pN
ebc0: 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
ebd0: 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 48  sh = pPg->pPrevH
ebe0: 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  ash;.  }.  if( p
ebf0: 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 29 7b  Pg->pPrevHash ){
ec00: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
ec10: 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67 65 72  ger->aHash[pager
ec20: 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e 6f 29  _hash(pPg->pgno)
ec30: 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50  ]!=pPg );.    pP
ec40: 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e 70 4e  g->pPrevHash->pN
ec50: 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  extHash = pPg->p
ec60: 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65 6c 73  NextHash;.  }els
ec70: 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d 20 70  e{.    int h = p
ec80: 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70  ager_hash(pPg->p
ec90: 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65 72 74  gno);.    assert
eca0: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
ecb0: 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70  h]==pPg );.    p
ecc0: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20  Pager->aHash[h] 
ecd0: 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68  = pPg->pNextHash
ece0: 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e 70 67  ;.  }..  pPg->pg
ecf0: 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70  no = 0;.  pPg->p
ed00: 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d 3e  NextHash = pPg->
ed10: 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d  pPrevHash = 0;.}
ed20: 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61  ../*.** Unlink a
ed30: 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66   page from the f
ed40: 72 65 65 20 6c 69 73 74 20 28 74 68 65 20 6c 69  ree list (the li
ed50: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
ed60: 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a  where nRef==0).*
ed70: 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73 20 68  * and from its h
ed80: 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68  ash collision ch
ed90: 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ain..*/.static v
eda0: 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50  oid unlinkPage(P
edb0: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61  gHdr *pPg){.  Pa
edc0: 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
edd0: 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a  g->pPager;..  /*
ede0: 20 4b 65 65 70 20 74 68 65 20 70 46 69 72 73 74   Keep the pFirst
edf0: 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72 20 70  Synced pointer p
ee00: 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65 20 66  ointing at the f
ee10: 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65  irst synchronize
ee20: 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66 28 20  d page */.  if( 
ee30: 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69  pPg==pPager->pFi
ee40: 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20 20  rstSynced ){.   
ee50: 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d   PgHdr *p = pPg-
ee60: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20  >pNextFree;.    
ee70: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
ee80: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
ee90: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
eea0: 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
eeb0: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d  tSynced = p;.  }
eec0: 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72  ..  /* Unlink fr
eed0: 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
eee0: 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 50  */.  if( pPg->pP
eef0: 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 70  revFree ){.    p
ef00: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
ef10: 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
ef20: 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c  pNextFree;.  }el
ef30: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
ef40: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d  pPager->pFirst==
ef50: 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65  pPg );.    pPage
ef60: 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67 2d  r->pFirst = pPg-
ef70: 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a  >pNextFree;.  }.
ef80: 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74    if( pPg->pNext
ef90: 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
efa0: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
efb0: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
efc0: 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  evFree;.  }else{
efd0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
efe0: 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20  ger->pLast==pPg 
eff0: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  );.    pPager->p
f000: 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65  Last = pPg->pPre
f010: 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67  vFree;.  }.  pPg
f020: 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
f030: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 30  g->pPrevFree = 0
f040: 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66  ;..  /* Unlink f
f050: 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68 61 73  rom the pgno has
f060: 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c  h table */.  unl
f070: 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61  inkHashChain(pPa
f080: 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a 23 69  ger, pPg);.}..#i
f090: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f0a0: 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a  T_MEMORYDB./*.**
f0b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
f0c0: 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
f0d0: 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64  e an in-memory d
f0e0: 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65 74 65  atabase.  Delete
f0f0: 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20 77 68  .** all pages wh
f100: 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61 72 67  ose pgno is larg
f110: 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d 3e  er than pPager->
f120: 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75 6e  dbSize and is un
f130: 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 20 52  referenced..** R
f140: 65 66 65 72 65 6e 63 65 64 20 70 61 67 65 73 20  eferenced pages 
f150: 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50 61 67  larger than pPag
f160: 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65 20 7a  er->dbSize are z
f170: 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  eroed..*/.static
f180: 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72 75 6e   void memoryTrun
f190: 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  cate(Pager *pPag
f1a0: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
f1b0: 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70 70 50  g;.  PgHdr **ppP
f1c0: 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 20  g;.  int dbSize 
f1d0: 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
f1e0: 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70 50 61  ;..  ppPg = &pPa
f1f0: 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69  ger->pAll;.  whi
f200: 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70 50 67  le( (pPg = *ppPg
f210: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
f220: 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a  pPg->pgno<=dbSiz
f230: 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50 67 20  e ){.      ppPg 
f240: 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  = &pPg->pNextAll
f250: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
f260: 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20  pPg->nRef>0 ){. 
f270: 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44       memset(PGHD
f280: 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
f290: 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  0, pPager->pageS
f2a0: 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70 50 67  ize);.      ppPg
f2b0: 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c   = &pPg->pNextAl
f2c0: 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  l;.    }else{.  
f2d0: 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50 67 2d      *ppPg = pPg-
f2e0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20  >pNextAll;.     
f2f0: 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67 29   unlinkPage(pPg)
f300: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  ;.      sqliteFr
f310: 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20 70  ee(pPg);.      p
f320: 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d 3b 0a  Pager->nPage--;.
f330: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65 6c 73      }.  }.}.#els
f340: 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f 72 79  e.#define memory
f350: 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65 6e 64  Truncate(p).#end
f360: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  if../*.** Try to
f370: 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
f380: 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
f390: 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
f3a0: 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
f3b0: 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
f3c0: 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
f3d0: 52 65 70 65 61 74 65 20 75 6e 74 69 6c 20 74 68  Repeate until th
f3e0: 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20  e busy callback 
f3f0: 72 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65  returns.** false
f400: 20 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f   or until the lo
f410: 63 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a  ck succeeds..**.
f420: 2a 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45  ** Return SQLITE
f430: 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61  _OK on success a
f440: 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
f450: 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62   if we cannot ob
f460: 74 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b  tain.** the lock
f470: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f480: 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
f490: 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
f4a0: 2c 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b  , int locktype){
f4b0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
f4c0: 65 72 74 28 20 50 41 47 45 52 5f 53 48 41 52 45  ert( PAGER_SHARE
f4d0: 44 3d 3d 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29  D==SHARED_LOCK )
f4e0: 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
f4f0: 52 5f 52 45 53 45 52 56 45 44 3d 3d 52 45 53 45  R_RESERVED==RESE
f500: 52 56 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61  RVED_LOCK );.  a
f510: 73 73 65 72 74 28 20 50 41 47 45 52 5f 45 58 43  ssert( PAGER_EXC
f520: 4c 55 53 49 56 45 3d 3d 45 58 43 4c 55 53 49 56  LUSIVE==EXCLUSIV
f530: 45 5f 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20  E_LOCK );.  if( 
f540: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c  pPager->state>=l
f550: 6f 63 6b 74 79 70 65 20 29 7b 0a 20 20 20 20 72  ocktype ){.    r
f560: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
f570: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
f580: 62 75 73 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f  busy = 1;.    do
f590: 20 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   {.      rc = sq
f5a0: 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
f5b0: 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70  ger->fd, locktyp
f5c0: 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65 28 20  e);.    }while( 
f5d0: 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
f5e0: 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67  && .        pPag
f5f0: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
f600: 20 26 26 20 0a 20 20 20 20 20 20 20 20 70 50 61   && .        pPa
f610: 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65  ger->pBusyHandle
f620: 72 2d 3e 78 46 75 6e 63 20 26 26 20 0a 20 20 20  r->xFunc && .   
f630: 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75       pPager->pBu
f640: 73 79 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63  syHandler->xFunc
f650: 28 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61  (pPager->pBusyHa
f660: 6e 64 6c 65 72 2d 3e 70 41 72 67 2c 20 62 75 73  ndler->pArg, bus
f670: 79 2b 2b 29 0a 20 20 20 20 29 3b 0a 20 20 20 20  y++).    );.    
f680: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
f690: 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65  K ){.      pPage
f6a0: 72 2d 3e 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74  r->state = lockt
f6b0: 79 70 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ype;.    }.  }. 
f6c0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
f6d0: 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74 68  *.** Truncate th
f6e0: 65 20 66 69 6c 65 20 74 6f 20 74 68 65 20 6e 75  e file to the nu
f6f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 73 70  mber of pages sp
f700: 65 63 69 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20  ecified..*/.int 
f710: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72 75  sqlite3pager_tru
f720: 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50 61  ncate(Pager *pPa
f730: 67 65 72 2c 20 50 67 6e 6f 20 6e 50 61 67 65 29  ger, Pgno nPage)
f740: 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71  {.  int rc;.  sq
f750: 6c 69 74 65 33 70 61 67 65 72 5f 70 61 67 65 63  lite3pager_pagec
f760: 6f 75 6e 74 28 70 50 61 67 65 72 29 3b 0a 20 20  ount(pPager);.  
f770: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
f780: 61 73 6b 21 3d 30 20 29 7b 0a 20 20 20 20 72 63  ask!=0 ){.    rc
f790: 20 3d 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65   = pager_errcode
f7a0: 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72 65  (pPager);.    re
f7b0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 69  turn rc;.  }.  i
f7c0: 66 28 20 6e 50 61 67 65 3e 3d 28 75 6e 73 69 67  f( nPage>=(unsig
f7d0: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
f7e0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
f7f0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
f800: 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
f810: 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a     pPager->dbSiz
f820: 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20 6d  e = nPage;.    m
f830: 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
f840: 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
f850: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
f860: 0a 20 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72  .  rc = syncJour
f870: 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 69  nal(pPager);.  i
f880: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
f890: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72   ){.    return r
f8a0: 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 47 65 74  c;.  }..  /* Get
f8b0: 20 61 6e 20 65 78 63 6c 75 73 69 76 65 20 6c 6f   an exclusive lo
f8c0: 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
f8d0: 73 65 20 62 65 66 6f 72 65 20 74 72 75 6e 63 61  se before trunca
f8e0: 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d 20  ting. */.  rc = 
f8f0: 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
f900: 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
f910: 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
f920: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
f930: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
f940: 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20 70 61  ;.  }..  rc = pa
f950: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61  ger_truncate(pPa
f960: 67 65 72 2c 20 6e 50 61 67 65 29 3b 0a 20 20 69  ger, nPage);.  i
f970: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
f980: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
f990: 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a  dbSize = nPage;.
f9a0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
f9b0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75 74 64 6f  .}../*.** Shutdo
f9c0: 77 6e 20 74 68 65 20 70 61 67 65 20 63 61 63 68  wn the page cach
f9d0: 65 2e 20 20 46 72 65 65 20 61 6c 6c 20 6d 65 6d  e.  Free all mem
f9e0: 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65 20 61 6c  ory and close al
f9f0: 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49  l files..**.** I
fa00: 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
fa10: 77 61 73 20 69 6e 20 70 72 6f 67 72 65 73 73 20  was in progress 
fa20: 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
fa30: 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 61  e is called, tha
fa40: 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e  t.** transaction
fa50: 20 69 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e   is rolled back.
fa60: 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e 64 69 6e    All outstandin
fa70: 67 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61  g pages are inva
fa80: 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e 64 20 74  lidated.** and t
fa90: 68 65 69 72 20 6d 65 6d 6f 72 79 20 69 73 20 66  heir memory is f
faa0: 72 65 65 64 2e 20 20 41 6e 79 20 61 74 74 65 6d  reed.  Any attem
fab0: 70 74 20 74 6f 20 75 73 65 20 61 20 70 61 67 65  pt to use a page
fac0: 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 77   associated.** w
fad0: 69 74 68 20 74 68 69 73 20 70 61 67 65 20 63 61  ith this page ca
fae0: 63 68 65 20 61 66 74 65 72 20 74 68 69 73 20 66  che after this f
faf0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20  unction returns 
fb00: 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a 2a 20 72  will likely.** r
fb10: 65 73 75 6c 74 20 69 6e 20 61 20 63 6f 72 65 64  esult in a cored
fb20: 75 6d 70 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ump..*/.int sqli
fb30: 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 50  te3pager_close(P
fb40: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
fb50: 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
fb60: 65 78 74 3b 0a 20 20 73 77 69 74 63 68 28 20 70  ext;.  switch( p
fb70: 50 61 67 65 72 2d 3e 73 74 61 74 65 20 29 7b 0a  Pager->state ){.
fb80: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 52      case PAGER_R
fb90: 45 53 45 52 56 45 44 3a 0a 20 20 20 20 63 61 73  ESERVED:.    cas
fba0: 65 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3a 20  e PAGER_SYNCED: 
fbb0: 0a 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f  .    case PAGER_
fbc0: 45 58 43 4c 55 53 49 56 45 3a 20 7b 0a 20 20 20  EXCLUSIVE: {.   
fbd0: 20 20 20 2f 2a 20 57 65 20 69 67 6e 6f 72 65 20     /* We ignore 
fbe0: 61 6e 79 20 49 4f 20 65 72 72 6f 72 73 20 74 68  any IO errors th
fbf0: 61 74 20 6f 63 63 75 72 20 64 75 72 69 6e 67 20  at occur during 
fc00: 74 68 65 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 20  the rollback.   
fc10: 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e     ** operation.
fc20: 20 53 6f 20 64 69 73 61 62 6c 65 20 49 4f 20 65   So disable IO e
fc30: 72 72 6f 72 20 73 69 6d 75 6c 61 74 69 6f 6e 20  rror simulation 
fc40: 73 6f 20 74 68 61 74 20 74 65 73 74 69 6e 67 0a  so that testing.
fc50: 20 20 20 20 20 20 2a 2a 20 77 6f 72 6b 73 20 6d        ** works m
fc60: 6f 72 65 20 65 61 73 69 6c 79 2e 0a 20 20 20 20  ore easily..    
fc70: 20 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64    */.#if defined
fc80: 28 53 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26  (SQLITE_TEST) &&
fc90: 20 28 64 65 66 69 6e 65 64 28 4f 53 5f 55 4e 49   (defined(OS_UNI
fca0: 58 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 53  X) || defined(OS
fcb0: 5f 57 49 4e 29 29 0a 20 20 20 20 20 20 65 78 74  _WIN)).      ext
fcc0: 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 5f  ern int sqlite3_
fcd0: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
fce0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 6f 65 72  ;.      int ioer
fcf0: 72 5f 63 6e 74 20 3d 20 73 71 6c 69 74 65 33 5f  r_cnt = sqlite3_
fd00: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
fd10: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fd20: 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e 67  io_error_pending
fd30: 20 3d 20 2d 31 3b 0a 23 65 6e 64 69 66 0a 20 20   = -1;.#endif.  
fd40: 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72      sqlite3pager
fd50: 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72  _rollback(pPager
fd60: 29 3b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  );.#if defined(S
fd70: 51 4c 49 54 45 5f 54 45 53 54 29 20 26 26 20 28  QLITE_TEST) && (
fd80: 64 65 66 69 6e 65 64 28 4f 53 5f 55 4e 49 58 29  defined(OS_UNIX)
fd90: 20 7c 7c 20 64 65 66 69 6e 65 64 28 4f 53 5f 57   || defined(OS_W
fda0: 49 4e 29 29 0a 20 20 20 20 20 20 73 71 6c 69 74  IN)).      sqlit
fdb0: 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64  e3_io_error_pend
fdc0: 69 6e 67 20 3d 20 69 6f 65 72 72 5f 63 6e 74 3b  ing = ioerr_cnt;
fdd0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66  .#endif.      if
fde0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
fdf0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
fe00: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
fe10: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
fe20: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
fe30: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
fe40: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
fe50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
fe60: 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41    case PAGER_SHA
fe70: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  RED: {.      if(
fe80: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
fe90: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
fea0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
feb0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
fec0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
fed0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
fee0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
fef0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
ff00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ff10: 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  }.  for(pPg=pPag
ff20: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
ff30: 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64  Pg=pNext){.#ifnd
ff40: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66  ef NDEBUG.    if
ff50: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
ff60: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
ff70: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
ff80: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
ff90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
ffa0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
ffb0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
ffc0: 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
ffd0: 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
ffe0: 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
fff0: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
10000 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
10010 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
10020 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
10030 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
10040 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
10050 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
10060 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
10070 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61  pPager->fd);.  a
10080 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
10090 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
100a0 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
100b0 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
100c0 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
100d0 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
100e0 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
100f0 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
10100 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
10110 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
10120 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69  * }.  */..  sqli
10130 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
10140 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
10150 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
10160 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
10170 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
10180 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
10190 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
101a0 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
101b0 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
101c0 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
101d0 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
101e0 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
101f0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
10200 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
10210 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
10220 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
10230 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
10240 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
10250 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
10260 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
10270 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
10280 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
10290 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
102a0 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
102b0 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
102c0 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
102d0 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
102e0 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
102f0 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
10300 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
10310 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
10320 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
10330 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
10340 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
10350 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
10360 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
10370 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
10380 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
10390 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
103a0 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
103b0 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
103c0 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
103d0 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
103e0 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
103f0 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
10400 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
10410 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
10420 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
10430 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
10440 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
10450 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
10460 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
10470 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
10480 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
10490 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
104a0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
104b0 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
104c0 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
104d0 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
104e0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
104f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
10500 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
10510 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
10520 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
10530 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
10540 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
10550 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
10560 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
10570 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
10580 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
10590 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
105a0 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
105b0 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
105c0 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
105d0 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
105e0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
105f0 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
10600 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
10610 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
10620 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
10630 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
10640 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
10650 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
10660 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
10670 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
10680 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
10690 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
106a0 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
106b0 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
106c0 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
106d0 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
106e0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
106f0 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
10700 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
10710 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
10720 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
10730 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
10740 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
10750 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
10760 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
10770 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
10780 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
10790 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
107a0 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
107b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
107c0 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
107d0 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
107e0 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
107f0 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
10800 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
10810 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
10820 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
10830 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
10840 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
10850 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
10860 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
10870 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
10880 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
10890 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
108a0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
108b0 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
108c0 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
108d0 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
108e0 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
108f0 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
10900 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
10910 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
10920 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
10930 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
10940 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
10950 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
10960 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
10970 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
10980 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
10990 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
109a0 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
109b0 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
109c0 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
109d0 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
109e0 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
109f0 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
10a00 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
10a10 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
10a20 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
10a30 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
10a40 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
10a50 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
10a60 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
10a70 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
10a80 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
10a90 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
10aa0 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
10ab0 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
10ac0 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
10ad0 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
10ae0 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
10af0 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
10b00 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
10b10 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
10b20 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
10b30 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
10b40 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20  ailure, so sync 
10b50 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
10b60 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
10b70 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
10b80 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
10b90 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
10ba0 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
10bb0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
10bc0 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
10bd0 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
10be0 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
10bf0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
10c00 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
10c10 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
10c20 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
10c30 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
10c40 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
10c50 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
10c60 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
10c70 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
10c80 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
10c90 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
10ca0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
10cb0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
10cc0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
10cd0 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73  n );.      /* as
10ce0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
10cf0 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79  oSync ); // noSy
10d00 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  nc might be set 
10d10 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  if synchronous. 
10d20 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e       ** was turn
10d30 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65  ed off after the
10d40 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
10d50 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65   started.  Ticke
10d60 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65  t #615 */.#ifnde
10d70 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
10d80 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
10d90 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
10da0 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
10db0 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
10dc0 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
10dd0 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
10de0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
10df0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
10e00 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
10e10 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
10e20 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63   jSz;.        rc
10e30 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10e40 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
10e50 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
10e60 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
10e70 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10e80 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10e90 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
10ea0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
10eb0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
10ec0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
10ed0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
10ee0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
10ef0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
10f00 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
10f10 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
10f20 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
10f30 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
10f40 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
10f50 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
10f60 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
10f70 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
10f80 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
10f90 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
10fa0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
10fb0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
10fc0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
10fd0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
10fe0 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
10ff0 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
11000 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
11010 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
11020 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
11030 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
11040 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
11050 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
11060 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
11070 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
11080 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
11090 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
110a0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
110b0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
110c0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
110d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
110e0 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
110f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
11100 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
11110 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
11120 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
11130 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
11140 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
11150 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
11160 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
11170 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
11180 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
11190 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
111a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
111b0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
111c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
111d0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
111e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
111f0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
11200 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
11210 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
11220 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
11230 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
11240 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
11250 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
11260 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
11270 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
11280 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
11290 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
112a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
112b0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
112c0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
112d0 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
112e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
112f0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
11300 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
11310 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
11320 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
11330 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
11340 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
11350 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
11360 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
11370 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
11380 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
11390 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
113a0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
113b0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
113c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
113d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
113e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
113f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
11400 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
11410 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
11420 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
11430 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
11440 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f 66 20  Given a list of 
11450 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74 65 64  pages (connected
11460 20 62 79 20 74 68 65 20 50 67 48 64 72 2e 70 44   by the PgHdr.pD
11470 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20 77 72  irty pointer) wr
11480 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f 6e 65  ite.** every one
11490 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65 73 20   of those pages 
114a0 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74 61 62  out to the datab
114b0 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d 61 72  ase file and mar
114c0 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20 61 73  k them all.** as
114d0 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69   clean..*/.stati
114e0 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72 69 74  c int pager_writ
114f0 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48 64 72  e_pagelist(PgHdr
11500 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61 67 65   *pList){.  Page
11510 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  r *pPager;.  int
11520 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c 69 73   rc;..  if( pLis
11530 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  t==0 ) return SQ
11540 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65  LITE_OK;.  pPage
11550 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61 67 65  r = pList->pPage
11560 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68 69 73  r;..  /* At this
11570 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d 61 79   point there may
11580 20 62 65 20 65 69 74 68 65 72 20 61 20 52 45 53   be either a RES
11590 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49  ERVED or EXCLUSI
115a0 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20  VE lock on the. 
115b0 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c   ** database fil
115c0 65 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61  e. If there is a
115d0 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c 55 53  lready an EXCLUS
115e0 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20 66 6f  IVE lock, the fo
115f0 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63 61 6c  llowing.  ** cal
11600 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f 73 4c  ls to sqlite3OsL
11610 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f 70 73  ock() are no-ops
11620 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f 76 69  ..  **.  ** Movi
11630 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72 6f 6d  ng the lock from
11640 20 52 45 53 45 52 56 45 44 20 74 6f 20 45 58 43   RESERVED to EXC
11650 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c 79 20  LUSIVE actually 
11660 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67 0a 20  involves going. 
11670 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e 20 69   ** through an i
11680 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74 61 74  ntermediate stat
11690 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41 20 50  e PENDING.   A P
116a0 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72 65 76  ENDING lock prev
116b0 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20 72 65  ents new.  ** re
116c0 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74 61 63  aders from attac
116d0 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61  hing to the data
116e0 62 61 73 65 20 62 75 74 20 69 73 20 75 6e 73 75  base but is unsu
116f0 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75 73 20  fficient for us 
11700 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e 20 20  to.  ** write.  
11710 54 68 65 20 69 64 65 61 20 6f 66 20 61 20 50 45  The idea of a PE
11720 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20 74 6f  NDING lock is to
11730 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72 65 61   prevent new rea
11740 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 63  ders from.  ** c
11750 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65 20 77  oming in while w
11760 65 20 77 61 69 74 20 66 6f 72 20 65 78 69 73 74  e wait for exist
11770 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f 20 63  ing readers to c
11780 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lear..  **.  ** 
11790 57 68 69 6c 65 20 74 68 65 20 70 61 67 65 72 20  While the pager 
117a0 69 73 20 69 6e 20 74 68 65 20 52 45 53 45 52 56  is in the RESERV
117b0 45 44 20 73 74 61 74 65 2c 20 74 68 65 20 6f 72  ED state, the or
117c0 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20  iginal database 
117d0 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75 6e 63  file.  ** is unc
117e0 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20 63 61  hanged and we ca
117f0 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74 68 6f  n rollback witho
11800 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70 6c 61  ut having to pla
11810 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a 20 6a  yback the.  ** j
11820 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68 65 20  ournal into the 
11830 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
11840 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20 77 65  e file.  Once we
11850 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 0a 20   transition to. 
11860 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c 20 69   ** EXCLUSIVE, i
11870 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61 74 61  t means the data
11880 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 62 65  base file has be
11890 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64 20 61  en changed and a
118a0 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20 2a 2a  ny rollback.  **
118b0 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20 61 20   will require a 
118c0 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61 63 6b  journal playback
118d0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 70 61  ..  */.  rc = pa
118e0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
118f0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
11900 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66 28 20  VE_LOCK);.  if( 
11910 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
11920 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
11930 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 4c    }..  while( pL
11940 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ist ){.    asser
11950 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74 79 20  t( pList->dirty 
11960 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  );.    sqlite3Os
11970 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  Seek(&pPager->fd
11980 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31  , (pList->pgno-1
11990 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
119a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 2f 2a  ageSize);.    /*
119b0 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
119c0 72 74 79 20 70 61 67 65 73 20 69 6e 20 74 68 65  rty pages in the
119d0 20 70 61 67 65 20 63 61 63 68 65 20 77 69 74 68   page cache with
119e0 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20 67 72   page numbers gr
119f0 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  eater.    ** tha
11a00 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65 2c 20  n Pager.dbSize, 
11a10 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c 69 74  this means sqlit
11a20 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65  e3pager_truncate
11a30 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20 74 6f  () was called to
11a40 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74 68 65  .    ** make the
11a50 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20 28 70   file smaller (p
11a60 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61 75 74  resumably by aut
11a70 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29 2e 20  o-vacuum code). 
11a80 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20 20 20  Do not write.   
11a90 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70 61 67   ** any such pag
11aa0 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65 2e 0a  es to the file..
11ab0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70      */.    if( p
11ac0 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  List->pgno<=pPag
11ad0 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20  er->dbSize ){.  
11ae0 20 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72      CODEC(pPager
11af0 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
11b00 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70  pList), pList->p
11b10 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20 20 54  gno, 6);.      T
11b20 52 41 43 45 33 28 22 53 54 4f 52 45 20 25 64 20  RACE3("STORE %d 
11b30 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
11b40 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
11b50 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20  st->pgno);.     
11b60 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57   rc = sqlite3OsW
11b70 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 66 64  rite(&pPager->fd
11b80 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
11b90 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72 2d 3e  pList), pPager->
11ba0 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20  pageSize);.     
11bb0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50   CODEC(pPager, P
11bc0 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69  GHDR_TO_DATA(pLi
11bd0 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  st), pList->pgno
11be0 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50 61 67  , 0);.      pPag
11bf0 65 72 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a 20 20  er->nWrite++;.  
11c00 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
11c10 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20  UG.    else{.   
11c20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53 54 4f     TRACE3("NOSTO
11c30 52 45 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  RE %d page %d\n"
11c40 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
11c50 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b  ), pList->pgno);
11c60 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
11c70 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72    if( rc ) retur
11c80 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73 74 2d  n rc;.    pList-
11c90 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 64  >dirty = 0;.#ifd
11ca0 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f  ef SQLITE_CHECK_
11cb0 50 41 47 45 53 0a 20 20 20 20 70 4c 69 73 74 2d  PAGES.    pList-
11cc0 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65  >pageHash = page
11cd0 72 5f 70 61 67 65 68 61 73 68 28 70 4c 69 73 74  r_pagehash(pList
11ce0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4c  );.#endif.    pL
11cf0 69 73 74 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69  ist = pList->pDi
11d00 72 74 79 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  rty;.  }.  retur
11d10 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
11d20 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76  /*.** Collect ev
11d30 65 72 79 20 64 69 72 74 79 20 70 61 67 65 20 69  ery dirty page i
11d40 6e 74 6f 20 61 20 64 69 72 74 79 20 6c 69 73 74  nto a dirty list
11d50 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61   and.** return a
11d60 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
11d70 68 65 61 64 20 6f 66 20 74 68 61 74 20 6c 69 73  head of that lis
11d80 74 2e 20 20 41 6c 6c 20 70 61 67 65 73 20 61 72  t.  All pages ar
11d90 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65  e.** collected e
11da0 76 65 6e 20 69 66 20 74 68 65 79 20 61 72 65 20  ven if they are 
11db0 73 74 69 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f  still in use..*/
11dc0 0a 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 70  .static PgHdr *p
11dd0 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
11de0 74 79 5f 70 61 67 65 73 28 50 61 67 65 72 20 2a  ty_pages(Pager *
11df0 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72  pPager){.  PgHdr
11e00 20 2a 70 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70   *p, *pList;.  p
11e10 4c 69 73 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28  List = 0;.  for(
11e20 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  p=pPager->pAll; 
11e30 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p; p=p->pNextAll
11e40 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 69  ){.    if( p->di
11e50 72 74 79 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  rty ){.      p->
11e60 70 44 69 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a  pDirty = pList;.
11e70 20 20 20 20 20 20 70 4c 69 73 74 20 3d 20 70 3b        pList = p;
11e80 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
11e90 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a  urn pList;.}../*
11ea0 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
11eb0 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64  ge..**.** A read
11ec0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73   lock on the dis
11ed0 6b 20 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e  k file is obtain
11ee0 65 64 20 77 68 65 6e 20 74 68 65 20 66 69 72 73  ed when the firs
11ef0 74 20 70 61 67 65 20 69 73 20 61 63 71 75 69 72  t page is acquir
11f00 65 64 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61  ed. .** This rea
11f10 64 20 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65  d lock is droppe
11f20 64 20 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20  d when the last 
11f30 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65 64  page is released
11f40 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77  ..**.** A _get w
11f50 6f 72 6b 73 20 66 6f 72 20 61 6e 79 20 70 61 67  orks for any pag
11f60 65 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  e number greater
11f70 20 74 68 61 6e 20 30 2e 20 20 49 66 20 74 68 65   than 0.  If the
11f80 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c   database.** fil
11f90 65 20 69 73 20 73 6d 61 6c 6c 65 72 20 74 68 61  e is smaller tha
11fa0 6e 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20  n the requested 
11fb0 70 61 67 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63  page, then no ac
11fc0 74 75 61 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61  tual disk.** rea
11fd0 64 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  d occurs and the
11fe0 20 6d 65 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66   memory image of
11ff0 20 74 68 65 20 70 61 67 65 20 69 73 20 69 6e 69   the page is ini
12000 74 69 61 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61  tialized to.** a
12010 6c 6c 20 7a 65 72 6f 73 2e 20 20 54 68 65 20 65  ll zeros.  The e
12020 78 74 72 61 20 64 61 74 61 20 61 70 70 65 6e 64  xtra data append
12030 65 64 20 74 6f 20 61 20 70 61 67 65 20 69 73 20  ed to a page is 
12040 61 6c 77 61 79 73 20 69 6e 69 74 69 61 6c 69 7a  always initializ
12050 65 64 0a 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74  ed.** to zeros t
12060 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 61 20  he first time a 
12070 70 61 67 65 20 69 73 20 6c 6f 61 64 65 64 20 69  page is loaded i
12080 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a  nto memory..**.*
12090 2a 20 54 68 65 20 61 63 71 75 69 73 69 74 69 6f  * The acquisitio
120a0 6e 20 6d 69 67 68 74 20 66 61 69 6c 20 66 6f 72  n might fail for
120b0 20 73 65 76 65 72 61 6c 20 72 65 61 73 6f 6e 73   several reasons
120c0 2e 20 20 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c  .  In all cases,
120d0 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61  .** an appropria
120e0 74 65 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73  te error code is
120f0 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a 70   returned and *p
12100 70 50 61 67 65 20 69 73 20 73 65 74 20 74 6f 20  pPage is set to 
12110 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20  NULL..**.** See 
12120 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65  also sqlite3page
12130 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74  r_lookup().  Bot
12140 68 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 61  h this routine a
12150 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74  nd _lookup() att
12160 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20  empt.** to find 
12170 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 69 6e  a page in the in
12180 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 66 69  -memory cache fi
12190 72 73 74 2e 20 20 49 66 20 74 68 65 20 70 61 67  rst.  If the pag
121a0 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  e is not already
121b0 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74  .** in memory, t
121c0 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f 65 73  his routine goes
121d0 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65 61 64   to disk to read
121e0 20 69 74 20 69 6e 20 77 68 65 72 65 61 73 20 5f   it in whereas _
121f0 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74  lookup().** just
12200 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68 69   returns 0.  Thi
12210 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69 72  s routine acquir
12220 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74  es a read-lock t
12230 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69 74  he first time it
12240 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74 6f  .** has to go to
12250 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64   disk, and could
12260 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20 61   also playback a
12270 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66  n old journal if
12280 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53   necessary..** S
12290 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e  ince _lookup() n
122a0 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
122b0 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
122c0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
122d0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
122e0 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73   files..*/.int s
122f0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
12300 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50  Pager *pPager, P
12310 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a  gno pgno, void *
12320 2a 70 70 50 61 67 65 29 7b 0a 20 20 50 67 48 64  *ppPage){.  PgHd
12330 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
12340 2c 20 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d  , n;..  /* The m
12350 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62  aximum page numb
12360 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75  er is 2^31. Retu
12370 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50  rn SQLITE_CORRUP
12380 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a  T if a page.  **
12390 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72 20   number greater 
123a0 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65  than this, or ze
123b0 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65 64  ro, is requested
123c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e  ..  */.  if( pgn
123d0 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  o>PAGER_MAX_PGNO
123e0 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a 20   || pgno==0 ){. 
123f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
12400 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a 20  _CORRUPT;.  }.. 
12410 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77 65   /* Make sure we
12420 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61 6e   have not hit an
12430 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f 72  y critical error
12440 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65 72  s..  */ .  asser
12450 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
12460 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a 20    *ppPage = 0;. 
12470 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
12480 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f 45  Mask & ~(PAGER_E
12490 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20 20  RR_FULL) ){.    
124a0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
124b0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
124c0 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  }..  /* If this 
124d0 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61 67  is the first pag
124e0 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65 6e  e accessed, then
124f0 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c 6f   get a SHARED lo
12500 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64  ck.  ** on the d
12510 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20  atabase file..  
12520 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
12530 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
12540 44 42 20 29 7b 0a 20 20 20 20 69 66 28 20 21 70  DB ){.    if( !p
12550 50 61 67 65 72 2d 3e 6e 6f 52 65 61 64 6c 6f 63  Pager->noReadloc
12560 6b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  k ){.      rc = 
12570 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
12580 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
12590 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 69  D_LOCK);.      i
125a0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
125b0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
125c0 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20  rn rc;.      }. 
125d0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20     }..    /* If 
125e0 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65  a journal file e
125f0 78 69 73 74 73 2c 20 61 6e 64 20 74 68 65 72 65  xists, and there
12600 20 69 73 20 6e 6f 20 52 45 53 45 52 56 45 44 20   is no RESERVED 
12610 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
12620 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
12630 2c 20 74 68 65 6e 20 69 74 20 65 69 74 68 65 72  , then it either
12640 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 6c 61   needs to be pla
12650 79 65 64 20 62 61 63 6b 20 6f 72 20 64 65 6c 65  yed back or dele
12660 74 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ted..    */.    
12670 69 66 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a  if( pPager->useJ
12680 6f 75 72 6e 61 6c 20 26 26 20 0a 20 20 20 20 20  ournal && .     
12690 20 20 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65     sqlite3OsFile
126a0 45 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a  Exists(pPager->z
126b0 4a 6f 75 72 6e 61 6c 29 20 26 26 0a 20 20 20 20  Journal) &&.    
126c0 20 20 20 20 21 73 71 6c 69 74 65 33 4f 73 43 68      !sqlite3OsCh
126d0 65 63 6b 52 65 73 65 72 76 65 64 4c 6f 63 6b 28  eckReservedLock(
126e0 26 70 50 61 67 65 72 2d 3e 66 64 29 20 0a 20 20  &pPager->fd) .  
126f0 20 20 29 7b 0a 20 20 20 20 20 20 20 69 6e 74 20    ){.       int 
12700 72 63 3b 0a 0a 20 20 20 20 20 20 20 2f 2a 20 47  rc;..       /* G
12710 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20  et an EXCLUSIVE 
12720 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
12730 62 61 73 65 20 66 69 6c 65 2e 20 41 74 20 74 68  base file. At th
12740 69 73 20 70 6f 69 6e 74 20 69 74 20 69 73 0a 20  is point it is. 
12750 20 20 20 20 20 20 2a 2a 20 69 6d 70 6f 72 74 61        ** importa
12760 6e 74 20 74 68 61 74 20 61 20 52 45 53 45 52 56  nt that a RESERV
12770 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 6f  ED lock is not o
12780 62 74 61 69 6e 65 64 20 6f 6e 20 74 68 65 20 77  btained on the w
12790 61 79 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20  ay to the.      
127a0 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   ** EXCLUSIVE lo
127b0 63 6b 2e 20 49 66 20 69 74 20 77 65 72 65 2c 20  ck. If it were, 
127c0 61 6e 6f 74 68 65 72 20 70 72 6f 63 65 73 73 20  another process 
127d0 6d 69 67 68 74 20 6f 70 65 6e 20 74 68 65 0a 20  might open the. 
127e0 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73        ** databas
127f0 65 20 66 69 6c 65 2c 20 64 65 74 65 63 74 20 74  e file, detect t
12800 68 65 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b  he RESERVED lock
12810 2c 20 61 6e 64 20 63 6f 6e 63 6c 75 64 65 20 74  , and conclude t
12820 68 61 74 20 74 68 65 0a 20 20 20 20 20 20 20 2a  hat the.       *
12830 2a 20 64 61 74 61 62 61 73 65 20 69 73 20 73 61  * database is sa
12840 66 65 20 74 6f 20 72 65 61 64 20 77 68 69 6c 65  fe to read while
12850 20 74 68 69 73 20 70 72 6f 63 65 73 73 20 69 73   this process is
12860 20 73 74 69 6c 6c 20 72 6f 6c 6c 69 6e 67 20 69   still rolling i
12870 74 20 0a 20 20 20 20 20 20 20 2a 2a 20 62 61 63  t .       ** bac
12880 6b 2e 0a 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  k..       ** .  
12890 20 20 20 20 20 2a 2a 20 42 65 63 61 75 73 65 20       ** Because 
128a0 74 68 65 20 69 6e 74 65 72 6d 65 64 69 61 74 65  the intermediate
128b0 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69   RESERVED lock i
128c0 73 20 6e 6f 74 20 72 65 71 75 65 73 74 65 64 2c  s not requested,
128d0 20 74 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 73   the.       ** s
128e0 65 63 6f 6e 64 20 70 72 6f 63 65 73 73 20 77 69  econd process wi
128f0 6c 6c 20 67 65 74 20 74 6f 20 74 68 69 73 20 70  ll get to this p
12900 6f 69 6e 74 20 69 6e 20 74 68 65 20 63 6f 64 65  oint in the code
12910 20 61 6e 64 20 66 61 69 6c 20 74 6f 0a 20 20 20   and fail to.   
12920 20 20 20 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74      ** obtain it
12930 27 73 20 6f 77 6e 20 45 58 43 4c 55 53 49 56 45  's own EXCLUSIVE
12940 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
12950 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20  abase file..    
12960 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
12970 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28  = sqlite3OsLock(
12980 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43  &pPager->fd, EXC
12990 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20  LUSIVE_LOCK);.  
129a0 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
129b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
129c0 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
129d0 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
129e0 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
129f0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
12a00 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
12a10 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  .         return
12a20 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20   rc;.       }.  
12a30 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
12a40 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
12a50 53 49 56 45 3b 0a 0a 20 20 20 20 20 20 20 2f 2a  SIVE;..       /*
12a60 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   Open the journa
12a70 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  l for reading on
12a80 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49  ly.  Return SQLI
12a90 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20 20 20  TE_BUSY if.     
12aa0 20 20 2a 2a 20 77 65 20 61 72 65 20 75 6e 61 62    ** we are unab
12ab0 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 6a  le to open the j
12ac0 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 0a 20 20  ournal file. .  
12ad0 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 2a       **.       *
12ae0 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
12af0 6c 65 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 64  le does not need
12b00 20 74 6f 20 62 65 20 6c 6f 63 6b 65 64 20 69 74   to be locked it
12b10 73 65 6c 66 2e 20 20 54 68 65 0a 20 20 20 20 20  self.  The.     
12b20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c    ** journal fil
12b30 65 20 69 73 20 6e 65 76 65 72 20 6f 70 65 6e 20  e is never open 
12b40 75 6e 6c 65 73 73 20 74 68 65 20 6d 61 69 6e 20  unless the main 
12b50 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 68 6f  database file ho
12b60 6c 64 73 0a 20 20 20 20 20 20 20 2a 2a 20 61 20  lds.       ** a 
12b70 77 72 69 74 65 20 6c 6f 63 6b 2c 20 73 6f 20 74  write lock, so t
12b80 68 65 72 65 20 69 73 20 6e 65 76 65 72 20 61 6e  here is never an
12b90 79 20 63 68 61 6e 63 65 20 6f 66 20 74 77 6f 20  y chance of two 
12ba0 6f 72 20 6d 6f 72 65 0a 20 20 20 20 20 20 20 2a  or more.       *
12bb0 2a 20 70 72 6f 63 65 73 73 65 73 20 6f 70 65 6e  * processes open
12bc0 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  ing the journal 
12bd0 61 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65  at the same time
12be0 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ..       */.    
12bf0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
12c00 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 70 50  sOpenReadOnly(pP
12c10 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
12c20 26 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20  &pPager->jfd);. 
12c30 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12c40 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12c50 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
12c60 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
12c70 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
12c80 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
12c90 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
12ca0 3b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  ;.         retur
12cb0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
12cc0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70        }.       p
12cd0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
12ce0 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 70  en = 1;.       p
12cf0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74  Pager->journalSt
12d00 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 20  arted = 0;.     
12d10 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
12d20 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20  lOff = 0;.      
12d30 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
12d40 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 70  er = 0;.       p
12d50 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
12d60 72 20 3d 20 30 3b 0a 0a 20 20 20 20 20 20 20 2f  r = 0;..       /
12d70 2a 20 50 6c 61 79 62 61 63 6b 20 61 6e 64 20 64  * Playback and d
12d80 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e 61  elete the journa
12d90 6c 2e 20 20 44 72 6f 70 20 74 68 65 20 64 61 74  l.  Drop the dat
12da0 61 62 61 73 65 20 77 72 69 74 65 0a 20 20 20 20  abase write.    
12db0 20 20 20 2a 2a 20 6c 6f 63 6b 20 61 6e 64 20 72     ** lock and r
12dc0 65 61 63 71 75 69 72 65 20 74 68 65 20 72 65 61  eacquire the rea
12dd0 64 20 6c 6f 63 6b 2e 0a 20 20 20 20 20 20 20 2a  d lock..       *
12de0 2f 0a 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  /.       rc = pa
12df0 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
12e00 67 65 72 29 3b 0a 20 20 20 20 20 20 20 69 66 28  ger);.       if(
12e10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
12e20 7b 0a 20 20 20 20 20 20 20 20 20 72 65 74 75 72  {.         retur
12e30 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 7d 0a 20  n rc;.       }. 
12e40 20 20 20 7d 0a 20 20 20 20 70 50 67 20 3d 20 30     }.    pPg = 0
12e50 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
12e60 2a 20 53 65 61 72 63 68 20 66 6f 72 20 70 61 67  * Search for pag
12e70 65 20 69 6e 20 63 61 63 68 65 20 2a 2f 0a 20 20  e in cache */.  
12e80 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
12e90 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
12ea0 6f 29 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44  o);.    if( MEMD
12eb0 42 20 26 26 20 70 50 61 67 65 72 2d 3e 73 74 61  B && pPager->sta
12ec0 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
12ed0 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
12ee0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
12ef0 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
12f00 7d 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29  }.  if( pPg==0 )
12f10 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71  {.    /* The req
12f20 75 65 73 74 65 64 20 70 61 67 65 20 69 73 20 6e  uested page is n
12f30 6f 74 20 69 6e 20 74 68 65 20 70 61 67 65 20 63  ot in the page c
12f40 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20 69 6e 74  ache. */.    int
12f50 20 68 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   h;.    pPager->
12f60 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20 20 69 66 28  nMiss++;.    if(
12f70 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3c 70   pPager->nPage<p
12f80 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 20 7c 7c  Pager->mxPage ||
12f90 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 3d   pPager->pFirst=
12fa0 3d 30 20 7c 7c 20 4d 45 4d 44 42 20 29 7b 0a 20  =0 || MEMDB ){. 
12fb0 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20 61       /* Create a
12fc0 20 6e 65 77 20 70 61 67 65 20 2a 2f 0a 20 20 20   new page */.   
12fd0 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65 4d     pPg = sqliteM
12fe0 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
12ff0 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72 2d  (*pPg) + pPager-
13000 3e 70 73 41 6c 69 67 6e 65 64 0a 20 20 20 20 20  >psAligned.     
13010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13020 20 20 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f           + sizeo
13030 66 28 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d  f(u32) + pPager-
13040 3e 6e 45 78 74 72 61 0a 20 20 20 20 20 20 20 20  >nExtra.        
13050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13060 20 20 20 20 20 20 2b 20 4d 45 4d 44 42 2a 73 69        + MEMDB*si
13070 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 20  zeof(PgHistory) 
13080 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  );.      if( pPg
13090 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ==0 ){.        i
130a0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
130b0 20 20 20 20 20 20 20 70 61 67 65 72 5f 75 6e 77         pager_unw
130c0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
130d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
130e0 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72 4d      pPager->errM
130f0 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52 52  ask |= PAGER_ERR
13100 5f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 72 65  _MEM;.        re
13110 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  turn SQLITE_NOME
13120 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
13130 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30 2c 20   memset(pPg, 0, 
13140 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b 0a 20  sizeof(*pPg));. 
13150 20 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29       if( MEMDB )
13160 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  {.        memset
13170 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70  (PGHDR_TO_HIST(p
13180 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
13190 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79  sizeof(PgHistory
131a0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
131b0 20 20 70 50 67 2d 3e 70 50 61 67 65 72 20 3d 20    pPg->pPager = 
131c0 70 50 61 67 65 72 3b 0a 20 20 20 20 20 20 70 50  pPager;.      pP
131d0 67 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20 70 50  g->pNextAll = pP
131e0 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 20 20  ager->pAll;.    
131f0 20 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d    pPager->pAll =
13200 20 70 50 67 3b 0a 20 20 20 20 20 20 70 50 61 67   pPg;.      pPag
13210 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b 0a 20 20 20  er->nPage++;.   
13220 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a   }else{.      /*
13230 20 46 69 6e 64 20 61 20 70 61 67 65 20 74 6f 20   Find a page to 
13240 72 65 63 79 63 6c 65 2e 20 20 54 72 79 20 74 6f  recycle.  Try to
13250 20 6c 6f 63 61 74 65 20 61 20 70 61 67 65 20 74   locate a page t
13260 68 61 74 20 64 6f 65 73 20 6e 6f 74 0a 20 20 20  hat does not.   
13270 20 20 20 2a 2a 20 72 65 71 75 69 72 65 20 75 73     ** require us
13280 20 74 6f 20 64 6f 20 61 6e 20 66 73 79 6e 63 28   to do an fsync(
13290 29 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ) on the journal
132a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
132b0 20 70 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70   pPg = pPager->p
132c0 46 69 72 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20  FirstSynced;..  
132d0 20 20 20 20 2f 2a 20 49 66 20 77 65 20 63 6f 75      /* If we cou
132e0 6c 64 20 6e 6f 74 20 66 69 6e 64 20 61 20 70 61  ld not find a pa
132f0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
13300 20 72 65 71 75 69 72 65 20 61 6e 20 66 73 79 6e   require an fsyn
13310 63 28 29 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  c().      ** on 
13320 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
13330 20 74 68 65 6e 20 66 73 79 6e 63 20 74 68 65 20   then fsync the 
13340 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 54  journal file.  T
13350 68 69 73 20 69 73 20 61 0a 20 20 20 20 20 20 2a  his is a.      *
13360 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65 72  * very slow oper
13370 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f 72  ation, so we wor
13380 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64 20  k hard to avoid 
13390 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69 6d  it.  But sometim
133a0 65 73 0a 20 20 20 20 20 20 2a 2a 20 69 74 20 63  es.      ** it c
133b0 61 6e 27 74 20 62 65 20 68 65 6c 70 65 64 2e 0a  an't be helped..
133c0 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
133d0 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20  f( pPg==0 ){.   
133e0 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 79       int rc = sy
133f0 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
13400 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
13410 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c!=0 ){.        
13420 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
13430 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
13440 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
13450 6e 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a  n SQLITE_IOERR;.
13460 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13470 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75    if( pPager->fu
13480 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20 20 20 20  llSync ){.      
13490 20 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c      /* If in ful
134a0 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69  l-sync mode, wri
134b0 74 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c  te a new journal
134c0 20 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65   header into the
134d0 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66  ..  ** journal f
134e0 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64 6f 6e  ile. This is don
134f0 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65 72 20  e to avoid ever 
13500 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f 75 72  modifying a jour
13510 6e 61 6c 0a 09 20 20 2a 2a 20 68 65 61 64 65 72  nal..  ** header
13520 20 74 68 61 74 20 69 73 20 69 6e 76 6f 6c 76 65   that is involve
13530 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
13540 6b 20 6f 66 20 70 61 67 65 73 20 74 68 61 74 20  k of pages that 
13550 68 61 76 65 0a 09 20 20 2a 2a 20 61 6c 72 65 61  have..  ** alrea
13560 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  dy been written 
13570 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
13580 28 69 6e 20 63 61 73 65 20 74 68 65 20 68 65 61  (in case the hea
13590 64 65 72 20 69 73 0a 09 20 20 2a 2a 20 74 72 61  der is..  ** tra
135a0 73 68 65 64 20 77 68 65 6e 20 74 68 65 20 6e 52  shed when the nR
135b0 65 63 20 66 69 65 6c 64 20 69 73 20 75 70 64 61  ec field is upda
135c0 74 65 64 29 2e 0a 20 20 20 20 20 20 20 20 20 20  ted)..          
135d0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  */.          pPa
135e0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
135f0 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
13600 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13610 4f 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20  Off > 0 );.     
13620 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 4a       rc = writeJ
13630 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72  ournalHdr(pPager
13640 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13650 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
13660 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
13670 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
13680 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  er);.           
13690 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49   return SQLITE_I
136a0 4f 45 52 52 3b 0a 20 20 20 20 20 20 20 20 20 20  OERR;.          
136b0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
136c0 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65 72      pPg = pPager
136d0 2d 3e 70 46 69 72 73 74 3b 0a 20 20 20 20 20 20  ->pFirst;.      
136e0 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  }.      assert( 
136f0 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a  pPg->nRef==0 );.
13700 0a 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20  .      /* Write 
13710 74 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20  the page to the 
13720 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 66  database file if
13730 20 69 74 20 69 73 20 64 69 72 74 79 2e 0a 20 20   it is dirty..  
13740 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28      */.      if(
13750 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20   pPg->dirty ){. 
13760 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
13770 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20  Pg->needSync==0 
13780 29 3b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e  );.        pPg->
13790 70 44 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  pDirty = 0;.    
137a0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
137b0 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28 20 70  rite_pagelist( p
137c0 50 67 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Pg );.        if
137d0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
137e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
137f0 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
13800 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
13810 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
13820 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20  ITE_IOERR;.     
13830 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
13840 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
13850 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 20  dirty==0 );..   
13860 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67     /* If the pag
13870 65 20 77 65 20 61 72 65 20 72 65 63 79 63 6c 69  e we are recycli
13880 6e 67 20 69 73 20 6d 61 72 6b 65 64 20 61 73 20  ng is marked as 
13890 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2c 20  alwaysRollback, 
138a0 74 68 65 6e 0a 20 20 20 20 20 20 2a 2a 20 73 65  then.      ** se
138b0 74 20 74 68 65 20 67 6c 6f 62 61 6c 20 61 6c 77  t the global alw
138c0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c 61 67  aysRollback flag
138d0 2c 20 74 68 75 73 20 64 69 73 61 62 6c 69 6e 67  , thus disabling
138e0 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 73 71   the.      ** sq
138f0 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  lite_dont_rollba
13900 63 6b 28 29 20 6f 70 74 69 6d 69 7a 61 74 69 6f  ck() optimizatio
13910 6e 20 66 6f 72 20 74 68 65 20 72 65 73 74 20 6f  n for the rest o
13920 66 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69  f this transacti
13930 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 49 74 20  on..      ** It 
13940 69 73 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  is necessary to 
13950 64 6f 20 74 68 69 73 20 62 65 63 61 75 73 65 20  do this because 
13960 74 68 65 20 70 61 67 65 20 6d 61 72 6b 65 64 20  the page marked 
13970 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 20  alwaysRollback. 
13980 20 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65       ** might be
13990 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
139a0 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
139b0 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
139c0 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
139d0 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20 77      ** that is w
139e0 61 73 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73  as marked always
139f0 52 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 69 73 20  Rollback.  This 
13a00 6d 65 61 6e 73 20 74 68 61 74 20 61 6c 6c 20 70  means that all p
13a10 61 67 65 73 20 6d 75 73 74 0a 20 20 20 20 20 20  ages must.      
13a20 2a 2a 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20  ** be marked as 
13a30 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66  alwaysRollback f
13a40 72 6f 6d 20 68 65 72 65 20 6f 6e 20 6f 75 74 2e  rom here on out.
13a50 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
13a60 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
13a70 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  ollback ){.     
13a80 20 20 20 70 50 61 67 65 72 2d 3e 61 6c 77 61 79     pPager->alway
13a90 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31 3b 0a 20  sRollback = 1;. 
13aa0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
13ab0 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c 64 20   Unlink the old 
13ac0 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72  page from the fr
13ad0 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68 65 20  ee list and the 
13ae0 68 61 73 68 20 74 61 62 6c 65 0a 20 20 20 20 20  hash table.     
13af0 20 2a 2f 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b   */.      unlink
13b00 50 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Page(pPg);.     
13b10 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 2b 2b   pPager->nOvfl++
13b20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
13b30 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20  >pgno = pgno;.  
13b40 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
13b50 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e 74  nJournal && (int
13b60 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 6f  )pgno<=pPager->o
13b70 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
13b80 20 20 20 73 71 6c 69 74 65 33 43 68 65 63 6b 4d     sqlite3CheckM
13b90 65 6d 6f 72 79 28 70 50 61 67 65 72 2d 3e 61 49  emory(pPager->aI
13ba0 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67 6e 6f 2f 38  nJournal, pgno/8
13bb0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
13bc0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
13bd0 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20 20 70 50  Open );.      pP
13be0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28  g->inJournal = (
13bf0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
13c00 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c  al[pgno/8] & (1<
13c10 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a  <(pgno&7)))!=0;.
13c20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
13c30 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  ync = 0;.    }el
13c40 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69  se{.      pPg->i
13c50 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20  nJournal = 0;.  
13c60 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
13c70 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 0;.    }.   
13c80 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e   if( pPager->aIn
13c90 53 74 6d 74 20 26 26 20 28 69 6e 74 29 70 67 6e  Stmt && (int)pgn
13ca0 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
13cb0 69 7a 65 0a 20 20 20 20 20 20 20 20 20 20 20 20  ize.            
13cc0 20 26 26 20 28 70 50 61 67 65 72 2d 3e 61 49 6e   && (pPager->aIn
13cd0 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d 20 26 20 28  Stmt[pgno/8] & (
13ce0 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21 3d 30  1<<(pgno&7)))!=0
13cf0 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 5f 61   ){.      page_a
13d00 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
13d10 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  pPg);.    }else{
13d20 0a 20 20 20 20 20 20 70 61 67 65 5f 72 65 6d 6f  .      page_remo
13d30 76 65 5f 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73  ve_from_stmt_lis
13d40 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
13d50 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
13d60 3b 0a 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 20  ;.    pPg->nRef 
13d70 3d 20 31 3b 0a 20 20 20 20 52 45 46 49 4e 46 4f  = 1;.    REFINFO
13d80 28 70 50 67 29 3b 0a 20 20 20 20 70 50 61 67 65  (pPg);.    pPage
13d90 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 68  r->nRef++;.    h
13da0 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70 67   = pager_hash(pg
13db0 6e 6f 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  no);.    pPg->pN
13dc0 65 78 74 48 61 73 68 20 3d 20 70 50 61 67 65 72  extHash = pPager
13dd0 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20  ->aHash[h];.    
13de0 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d  pPager->aHash[h]
13df0 20 3d 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20   = pPg;.    if( 
13e00 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 29  pPg->pNextHash )
13e10 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
13e20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e  pPg->pNextHash->
13e30 70 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a  pPrevHash==0 );.
13e40 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74        pPg->pNext
13e50 48 61 73 68 2d 3e 70 50 72 65 76 48 61 73 68 20  Hash->pPrevHash 
13e60 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20  = pPg;.    }.   
13e70 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 45 78   if( pPager->nEx
13e80 74 72 61 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d  tra>0 ){.      m
13e90 65 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 45  emset(PGHDR_TO_E
13ea0 58 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72  XTRA(pPg, pPager
13eb0 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 6e 45  ), 0, pPager->nE
13ec0 78 74 72 61 29 3b 0a 20 20 20 20 7d 0a 20 20 20  xtra);.    }.   
13ed0 20 6e 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65   n = sqlite3page
13ee0 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
13ef0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  er);.    if( pPa
13f00 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
13f10 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13f20 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
13f30 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
13f40 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
13f50 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
13f60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
13f70 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
13f80 28 20 6e 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b  ( n<(int)pgno ){
13f90 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
13fa0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
13fb0 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
13fc0 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73  eSize);.    }els
13fd0 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 63 3b  e{.      int rc;
13fe0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 4d  .      assert( M
13ff0 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20  EMDB==0 );.     
14000 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
14010 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
14020 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
14030 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
14040 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
14050 73 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66  sRead(&pPager->f
14060 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  d, PGHDR_TO_DATA
14070 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
14080 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
14090 54 52 41 43 45 33 28 22 46 45 54 43 48 20 25 64  TRACE3("FETCH %d
140a0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
140b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
140c0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
140d0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47  CODEC(pPager, PG
140e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
140f0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b  , pPg->pgno, 3);
14100 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
14110 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
14120 20 20 20 20 69 36 34 20 66 69 6c 65 53 69 7a 65      i64 fileSize
14130 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
14140 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
14150 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c  &pPager->fd,&fil
14160 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f  eSize)!=SQLITE_O
14170 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  K.              
14180 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67   || fileSize>=pg
14190 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67 65 53  no*pPager->pageS
141a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ize ){.         
141b0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
141c0 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  ref(PGHDR_TO_DAT
141d0 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20 20 20  A(pPg));.       
141e0 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
141f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14200 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47         memset(PG
14210 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
14220 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
14230 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20  eSize);.        
14240 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
14250 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e         pPager->n
14260 52 65 61 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  Read++;.      }.
14270 20 20 20 20 7d 0a 23 69 66 64 65 66 20 53 51 4c      }.#ifdef SQL
14280 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
14290 20 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73      pPg->pageHas
142a0 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61  h = pager_pageha
142b0 73 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a  sh(pPg);.#endif.
142c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
142d0 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61  The requested pa
142e0 67 65 20 69 73 20 69 6e 20 74 68 65 20 70 61 67  ge is in the pag
142f0 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20 20  e cache. */.    
14300 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b 2b 3b 0a  pPager->nHit++;.
14310 20 20 20 20 70 61 67 65 5f 72 65 66 28 70 50 67      page_ref(pPg
14320 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65  );.  }.  *ppPage
14330 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41   = PGHDR_TO_DATA
14340 28 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20  (pPg);.  return 
14350 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
14360 0a 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61  .** Acquire a pa
14370 67 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65  ge if it is alre
14380 61 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  ady in the in-me
14390 6d 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a  mory cache.  Do.
143a0 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20  ** not read the 
143b0 70 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20  page from disk. 
143c0 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   Return a pointe
143d0 72 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a  r to the page,.*
143e0 2a 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61  * or 0 if the pa
143f0 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
14400 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  he..**.** See al
14410 73 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  so sqlite3pager_
14420 67 65 74 28 29 2e 20 20 54 68 65 20 64 69 66 66  get().  The diff
14430 65 72 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74  erence between t
14440 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61  his routine.** a
14450 6e 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nd sqlite3pager_
14460 67 65 74 28 29 20 69 73 20 74 68 61 74 20 5f 67  get() is that _g
14470 65 74 28 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20  et() will go to 
14480 74 68 65 20 64 69 73 6b 20 61 6e 64 20 72 65 61  the disk and rea
14490 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70 61 67 65  d.** in the page
144a0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
144b0 6e 6f 74 20 61 6c 72 65 61 64 79 20 69 6e 20 63  not already in c
144c0 61 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74  ache.  This rout
144d0 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e  ine.** returns N
144e0 55 4c 4c 20 69 66 20 74 68 65 20 70 61 67 65 20  ULL if the page 
144f0 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68 65 20  is not in cache 
14500 6f 72 20 69 66 20 61 20 64 69 73 6b 20 49 2f 4f  or if a disk I/O
14510 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65   error .** has e
14520 76 65 72 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f  ver happened..*/
14530 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65 33 70 61  .void *sqlite3pa
14540 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72  ger_lookup(Pager
14550 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70   *pPager, Pgno p
14560 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
14570 50 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70  Pg;..  assert( p
14580 50 61 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73  Pager!=0 );.  as
14590 73 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b  sert( pgno!=0 );
145a0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
145b0 72 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52  rrMask & ~(PAGER
145c0 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20  _ERR_FULL) ){.  
145d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
145e0 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f    pPg = pager_lo
145f0 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e  okup(pPager, pgn
14600 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 3d 3d 30  o);.  if( pPg==0
14610 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
14620 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20 20  age_ref(pPg);.  
14630 72 65 74 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f  return PGHDR_TO_
14640 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a 0a 2f 2a  DATA(pPg);.}../*
14650 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61 20 70 61  .** Release a pa
14660 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ge..**.** If the
14670 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
14680 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61 67  ences to the pag
14690 65 20 64 72 6f 70 20 74 6f 20 7a 65 72 6f 2c 20  e drop to zero, 
146a0 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65  then the.** page
146b0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
146c0 20 4c 52 55 20 6c 69 73 74 2e 20 20 57 68 65 6e   LRU list.  When
146d0 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65 73 20   all references 
146e0 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a 2a 2a 20  to all pages.** 
146f0 61 72 65 20 72 65 6c 65 61 73 65 64 2c 20 61 20  are released, a 
14700 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 20  rollback occurs 
14710 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20  and the lock on 
14720 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 0a  the database is.
14730 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a 2f 0a 69  ** removed..*/.i
14740 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
14750 75 6e 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  unref(void *pDat
14760 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
14770 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65 6d 65 6e  ;..  /* Decremen
14780 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20  t the reference 
14790 63 6f 75 6e 74 20 66 6f 72 20 74 68 69 73 20 70  count for this p
147a0 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d  age.  */.  pPg =
147b0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
147c0 44 61 74 61 29 3b 0a 20 20 61 73 73 65 72 74 28  Data);.  assert(
147d0 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a   pPg->nRef>0 );.
147e0 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20    pPg->nRef--;. 
147f0 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a 0a   REFINFO(pPg);..
14800 20 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67    CHECK_PAGE(pPg
14810 29 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68  );..  /* When th
14820 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
14830 72 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65  rences to a page
14840 20 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74   reach 0, call t
14850 68 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74  he.  ** destruct
14860 6f 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70  or and add the p
14870 61 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c  age to the freel
14880 69 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ist..  */.  if( 
14890 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a  pPg->nRef==0 ){.
148a0 20 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65      Pager *pPage
148b0 72 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20  r;.    pPager = 
148c0 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20  pPg->pPager;.   
148d0 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20   pPg->pNextFree 
148e0 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50  = 0;.    pPg->pP
148f0 72 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72  revFree = pPager
14900 2d 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61  ->pLast;.    pPa
14910 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67  ger->pLast = pPg
14920 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
14930 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20  PrevFree ){.    
14940 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65    pPg->pPrevFree
14950 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50  ->pNextFree = pP
14960 67 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  g;.    }else{.  
14970 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72      pPager->pFir
14980 73 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a  st = pPg;.    }.
14990 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65      if( pPg->nee
149a0 64 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67  dSync==0 && pPag
149b0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
149c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ==0 ){.      pPa
149d0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
149e0 64 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  d = pPg;.    }. 
149f0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
14a00 44 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20  Destructor ){.  
14a10 20 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73      pPager->xDes
14a20 74 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70  tructor(pData, p
14a30 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
14a40 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
14a50 2a 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73  * When all pages
14a60 20 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c   reach the freel
14a70 69 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65  ist, drop the re
14a80 61 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20  ad lock from.   
14a90 20 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65   ** the database
14aa0 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20   file..    */.  
14ab0 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d    pPager->nRef--
14ac0 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
14ad0 61 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b  ager->nRef>=0 );
14ae0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
14af0 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d  >nRef==0 && !MEM
14b00 44 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65  DB ){.      page
14b10 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
14b20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14b30 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
14b40 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
14b50 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
14b60 72 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65  r pPager.  There
14b70 20 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20   should already 
14b80 62 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a  be a RESERVED.**
14b90 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
14ba0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
14bb0 73 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69  se file when thi
14bc0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
14bd0 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  led..**.** Retur
14be0 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
14bf0 76 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75  verything.  Retu
14c00 72 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  rn an error code
14c10 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65   and release the
14c20 0a 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69  .** write lock i
14c30 66 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20  f anything goes 
14c40 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  wrong..*/.static
14c50 20 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f   int pager_open_
14c60 6a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  journal(Pager *p
14c70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
14c80 3b 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d  ;.  assert( !MEM
14c90 44 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  DB );.  assert( 
14ca0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
14cb0 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
14cc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
14cd0 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d  r->journalOpen==
14ce0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
14cf0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
14d00 6c 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61  l );.  sqlite3pa
14d10 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50  ger_pagecount(pP
14d20 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d  ager);.  pPager-
14d30 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71  >aInJournal = sq
14d40 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67  liteMalloc( pPag
14d50 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31  er->dbSize/8 + 1
14d60 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
14d70 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->aInJournal==0 
14d80 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  ){.    rc = SQLI
14d90 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f  TE_NOMEM;.    go
14da0 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65  to failed_to_ope
14db0 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20  n_journal;.  }. 
14dc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
14dd0 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61  penExclusive(pPa
14de0 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26  ger->zJournal, &
14df0 70 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67  pPager->jfd,pPag
14e00 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20  er->tempFile);. 
14e10 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14e20 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Off = 0;.  pPage
14e30 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30  r->setMaster = 0
14e40 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ;.  pPager->jour
14e50 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66  nalHdr = 0;.  if
14e60 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
14e70 29 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c  ){.    goto fail
14e80 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  ed_to_open_journ
14e90 61 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65  al;.  }.  sqlite
14ea0 33 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79  3OsOpenDirectory
14eb0 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
14ec0 6f 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66  ory, &pPager->jf
14ed0 64 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  d);.  pPager->jo
14ee0 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20  urnalOpen = 1;. 
14ef0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
14f00 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70  Started = 0;.  p
14f10 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
14f20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  = 0;.  pPager->a
14f30 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
14f40 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65  0;.  pPager->nRe
14f50 63 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61  c = 0;.  if( pPa
14f60 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
14f70 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
14f80 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
14f90 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  );.    return rc
14fa0 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
14fb0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
14fc0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20  ger->dbSize;..  
14fd0 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61  rc = writeJourna
14fe0 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20  lHdr(pPager);.. 
14ff0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
15000 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d  tAutoopen && rc=
15010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15020 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
15030 67 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70  ger_stmt_begin(p
15040 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66  Pager);.  }.  if
15050 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15060 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65  ){.    rc = page
15070 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50  r_unwritelock(pP
15080 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72  ager);.    if( r
15090 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
150a0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
150b0 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20  E_FULL;.    }.  
150c0 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  }.  return rc;..
150d0 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
150e0 6f 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65  ournal:.  sqlite
150f0 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e  Free(pPager->aIn
15100 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67  Journal);.  pPag
15110 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d  er->aInJournal =
15120 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55   0;.  sqlite3OsU
15130 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66  nlock(&pPager->f
15140 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70  d, NO_LOCK);.  p
15150 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
15160 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 72  AGER_UNLOCK;.  r
15170 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15180 2a 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69  ** Acquire a wri
15190 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  te-lock on the d
151a0 61 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f  atabase.  The lo
151b0 63 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68  ck is removed wh
151c0 65 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66  en.** the any of
151d0 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
151e0 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a  appen:.**.**   *
151f0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63    sqlite3pager_c
15200 6f 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65  ommit() is calle
15210 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74  d..**   *  sqlit
15220 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
15230 28 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a  () is called..**
15240 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
15250 65 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61  er_close() is ca
15260 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71  lled..**   *  sq
15270 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
15280 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  () is called to 
15290 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e  on every outstan
152a0 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  ding page..**.**
152b0 20 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d   The first param
152c0 65 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75  eter to this rou
152d0 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65  tine is a pointe
152e0 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61  r to any open pa
152f0 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74  ge of the.** dat
15300 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74  abase file.  Not
15310 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f  hing changes abo
15320 75 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74  ut the page - it
15330 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20   is used merely 
15340 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20  to.** acquire a 
15350 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50  pointer to the P
15360 61 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61  ager structure a
15370 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74  nd as proof that
15380 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72   there is.** alr
15390 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b  eady a read-lock
153a0 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   on the database
153b0 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f  ..**.** The seco
153c0 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64  nd parameter ind
153d0 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20  icates how much 
153e0 73 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74  space in bytes t
153f0 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a  o reserve for a.
15400 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
15410 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74  l file-name at t
15420 68 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20  he start of the 
15430 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20  journal when it 
15440 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a  is created..**.*
15450 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  * A journal file
15460 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68   is opened if th
15470 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70  is is not a temp
15480 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72  orary file.  For
15490 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69   temporary.** fi
154a0 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67  les, the opening
154b0 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
154c0 66 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64  file is deferred
154d0 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20   until there is 
154e0 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65  an.** actual nee
154f0 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68  d to write to th
15500 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  e journal..**.**
15510 20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65   If the database
15520 20 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65   is already rese
15530 72 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67  rved for writing
15540 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  , this routine i
15550 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a  s a no-op..**.**
15560 20 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72   If exFlag is tr
15570 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64  ue, go ahead and
15580 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56   get an EXCLUSIV
15590 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69  E lock on the fi
155a0 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c  le.** immediatel
155b0 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69  y instead of wai
155c0 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72  ting until we tr
155d0 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63  y to flush the c
155e0 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78  ache.  The.** ex
155f0 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20  Flag is ignored 
15600 69 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  if a transaction
15610 20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69   is already acti
15620 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ve..*/.int sqlit
15630 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f  e3pager_begin(vo
15640 69 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65  id *pData, int e
15650 78 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20  xFlag){.  PgHdr 
15660 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50  *pPg = DATA_TO_P
15670 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50  GHDR(pData);.  P
15680 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
15690 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e  Pg->pPager;.  in
156a0 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
156b0 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d  ;.  assert( pPg-
156c0 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73  >nRef>0 );.  ass
156d0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
156e0 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
156f0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
15700 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53  ->state==PAGER_S
15710 48 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73  HARED ){.    ass
15720 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ert( pPager->aIn
15730 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20  Journal==0 );.  
15740 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20    if( MEMDB ){. 
15750 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
15760 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
15770 53 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67  SIVE;.      pPag
15780 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
15790 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
157a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
157b0 20 20 69 66 28 20 53 51 4c 49 54 45 5f 42 55 53    if( SQLITE_BUS
157c0 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  Y_RESERVED_LOCK 
157d0 7c 7c 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20  || exFlag ){.   
157e0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
157f0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
15800 67 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f  ger, RESERVED_LO
15810 43 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  CK);.      }else
15820 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
15830 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50  qlite3OsLock(&pP
15840 61 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56  ager->fd, RESERV
15850 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  ED_LOCK);.      
15860 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  }.      if( rc==
15870 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15880 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
15890 74 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52  te = PAGER_RESER
158a0 56 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28  VED;.        if(
158b0 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20   exFlag ){.     
158c0 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
158d0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
158e0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
158f0 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  OCK);.        }.
15900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
15910 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15920 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
15930 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n rc;.      }.  
15940 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
15950 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20  yCache = 0;.    
15960 20 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41    TRACE2("TRANSA
15970 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
15980 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
15990 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
159a0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
159b0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
159c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
159d0 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
159e0 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
159f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
15a00 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
15a10 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61  *.** Mark a data
15a20 20 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62   page as writeab
15a30 6c 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73  le.  The page is
15a40 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
15a50 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66  e journal .** if
15a60 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65   it is not there
15a70 20 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20   already.  This 
15a80 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20  routine must be 
15a90 63 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61  called before ma
15aa0 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20  king.** changes 
15ab0 74 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a  to a page..**.**
15ac0 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20   The first time 
15ad0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
15ae0 63 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65  called, the page
15af0 72 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a  r creates a new.
15b00 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61  ** journal and a
15b10 63 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56  cquires a RESERV
15b20 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64  ED lock on the d
15b30 61 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65  atabase.  If the
15b40 20 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63   RESERVED.** loc
15b50 6b 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61  k could not be a
15b60 63 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f  cquired, this ro
15b70 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
15b80 4c 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a  LITE_BUSY.  The.
15b90 2a 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  ** calling routi
15ba0 6e 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f  ne must check fo
15bb0 72 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61  r that return va
15bc0 6c 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66  lue and be caref
15bd0 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61  ul not to.** cha
15be0 6e 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74  nge any page dat
15bf0 61 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75  a until this rou
15c00 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
15c10 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66  ITE_OK..**.** If
15c20 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
15c30 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77  e could not be w
15c40 72 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74  ritten because t
15c50 68 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c  he disk is full,
15c60 0a 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f  .** then this ro
15c70 75 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51  utine returns SQ
15c80 4c 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f  LITE_FULL and do
15c90 65 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20  es an immediate 
15ca0 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c  rollback..** All
15cb0 20 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74   subsequent writ
15cc0 65 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20  e attempts also 
15cd0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55  return SQLITE_FU
15ce0 4c 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a  LL until there.*
15cf0 2a 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73  * is a call to s
15d00 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d  qlite3pager_comm
15d10 69 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70  it() or sqlite3p
15d20 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  ager_rollback() 
15d30 74 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a  to.** reset..*/.
15d40 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
15d50 5f 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61  _write(void *pDa
15d60 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  ta){.  PgHdr *pP
15d70 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
15d80 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65  R(pData);.  Page
15d90 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d  r *pPager = pPg-
15da0 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72  >pPager;.  int r
15db0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
15dc0 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65    /* Check for e
15dd0 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28  rrors.  */.  if(
15de0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
15df0 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20   ){ .    return 
15e00 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
15e10 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
15e20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c   pPager->readOnl
15e30 79 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  y ){.    return 
15e40 53 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d  SQLITE_PERM;.  }
15e50 0a 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  ..  assert( !pPa
15e60 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
15e70 3b 0a 0a 20 20 43 48 45 43 4b 5f 50 41 47 45 28  ;..  CHECK_PAGE(
15e80 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  pPg);..  /* Mark
15e90 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
15ea0 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
15eb0 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15ec0 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
15ed0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
15ee0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
15ef0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
15f00 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
15f10 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
15f20 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
15f30 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
15f40 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
15f50 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
15f60 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
15f70 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
15f80 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
15f90 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
15fa0 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
15fb0 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
15fc0 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
15fd0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
15fe0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
15ff0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
16000 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
16010 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
16020 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
16030 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
16040 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
16050 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
16060 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
16070 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
16080 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
16090 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
160a0 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
160b0 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
160c0 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
160d0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
160e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
160f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
16100 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
16110 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
16120 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
16130 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
16140 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
16150 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
16160 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
16170 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
16180 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
16190 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
161a0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
161b0 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
161c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
161d0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
161e0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
161f0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
16200 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
16210 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
16220 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
16230 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
16240 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
16250 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
16260 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
16270 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
16280 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
16290 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
162a0 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
162b0 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
162c0 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
162d0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
162e0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
162f0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
16300 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
16310 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
16320 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
16330 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
16340 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
16350 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
16360 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73  g;.        u32 s
16370 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
16380 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
16390 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
163a0 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
163b0 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
163c0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  r);.          TR
163d0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
163e0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
163f0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
16400 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
16410 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
16420 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
16430 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
16440 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
16450 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
16460 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
16470 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
16480 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
16490 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
164a0 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
164b0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
164c0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
164d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
164e0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
164f0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
16500 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44  m;.          COD
16510 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
16520 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
16530 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
16540 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
16550 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
16560 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
16570 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33      saved = *(u3
16580 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
16590 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  A(pPg, pPager);.
165a0 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33            store3
165b0 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
165c0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
165d0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
165e0 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
165f0 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
16600 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
16610 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20  pPg->pgno, pPg, 
16620 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  -4);.          r
16630 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
16640 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
16650 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29   &((char*)pData)
16660 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20  [-4], szPg);.   
16670 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
16680 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
16690 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  g;.          TRA
166a0 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
166b0 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
166c0 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
166d0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
166e0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
166f0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
16700 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
16710 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
16720 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
16730 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  0);.          *(
16740 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
16750 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
16760 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20   = saved;.      
16770 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
16780 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
16790 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
167a0 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
167b0 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
167c0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
167d0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
167e0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
167f0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16800 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
16810 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
16820 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
16830 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
16840 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
16850 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
16860 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
16870 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
16880 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
16890 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
168a0 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
168b0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
168c0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
168d0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
168e0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
168f0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
16900 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
16910 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
16920 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
16930 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
16940 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16950 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
16960 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
16970 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
16980 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
16990 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
169a0 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ync;.        TRA
169b0 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
169c0 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
169d0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
169e0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
169f0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
16a00 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
16a10 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
16a20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
16a30 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
16a40 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
16a50 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16a60 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16a70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
16a80 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
16a90 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
16aa0 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
16ab0 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
16ac0 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
16ad0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
16ae0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
16af0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
16b00 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
16b10 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
16b20 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
16b30 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
16b40 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
16b50 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
16b60 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
16b70 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
16b80 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
16b90 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
16ba0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
16bb0 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
16bc0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
16bd0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
16be0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
16bf0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
16c00 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
16c10 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
16c20 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
16c30 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16c40 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
16c50 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
16c60 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
16c70 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
16c80 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
16c90 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
16ca0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
16cb0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
16cc0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
16cd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
16ce0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
16cf0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
16d00 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
16d10 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
16d20 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16d30 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
16d40 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
16d50 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
16d60 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
16d70 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
16d80 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
16d90 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
16da0 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
16db0 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
16dc0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
16dd0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
16de0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
16df0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
16e00 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 73  Write(&pPager->s
16e10 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74  tfd,((char*)pDat
16e20 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70 61  a)-4, pPager->pa
16e30 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
16e40 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
16e50 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
16e60 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16e70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
16e80 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  o);.        CODE
16e90 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
16ea0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
16eb0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16ec0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16ed0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
16ee0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
16ef0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
16f00 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
16f10 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
16f20 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  L;.          ret
16f30 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16f40 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
16f50 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
16f60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16f70 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
16f80 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
16f90 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
16fa0 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
16fb0 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
16fc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
16fd0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
16fe0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
16ff0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
17000 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
17010 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
17020 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
17030 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
17040 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
17050 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
17060 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
17070 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
17080 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
17090 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
170a0 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
170b0 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
170c0 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
170d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
170e0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
170f0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
17100 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
17110 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
17120 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
17130 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
17140 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
17150 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
17160 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
17170 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
17180 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
17190 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
171a0 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
171b0 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
171c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
171d0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
171e0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
171f0 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 23 69  Pg->dirty;.}..#i
17200 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
17210 54 5f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52  T_VACUUM./*.** R
17220 65 70 6c 61 63 65 20 74 68 65 20 63 6f 6e 74 65  eplace the conte
17230 6e 74 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 70  nt of a single p
17240 61 67 65 20 77 69 74 68 20 74 68 65 20 69 6e 66  age with the inf
17250 6f 72 6d 61 74 69 6f 6e 20 69 6e 20 74 68 65 20  ormation in the 
17260 74 68 69 72 64 0a 2a 2a 20 61 72 67 75 6d 65 6e  third.** argumen
17270 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  t..*/.int sqlite
17280 33 70 61 67 65 72 5f 6f 76 65 72 77 72 69 74 65  3pager_overwrite
17290 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
172a0 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f 69 64 20  Pgno pgno, void 
172b0 2a 70 44 61 74 61 29 7b 0a 20 20 76 6f 69 64 20  *pData){.  void 
172c0 2a 70 50 61 67 65 3b 0a 20 20 69 6e 74 20 72 63  *pPage;.  int rc
172d0 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
172e0 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65  3pager_get(pPage
172f0 72 2c 20 70 67 6e 6f 2c 20 26 70 50 61 67 65 29  r, pgno, &pPage)
17300 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
17310 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
17320 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
17330 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 20  rite(pPage);.   
17340 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17350 4f 4b 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63  OK ){.      memc
17360 70 79 28 70 50 61 67 65 2c 20 70 44 61 74 61 2c  py(pPage, pData,
17370 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
17380 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e);.    }.    sq
17390 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
173a0 28 70 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72  (pPage);.  }.  r
173b0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 23 65 6e 64  eturn rc;.}.#end
173c0 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c  if../*.** A call
173d0 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
173e0 20 74 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72   tells the pager
173f0 20 74 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20   that it is not 
17400 6e 65 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20  necessary to.** 
17410 77 72 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d  write the inform
17420 61 74 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70  ation on page "p
17430 67 6e 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65  gno" back to the
17440 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75   disk, even thou
17450 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20  gh.** that page 
17460 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20  might be marked 
17470 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20  as dirty..**.** 
17480 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f  The overlying so
17490 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c  ftware layer cal
174a0 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ls this routine 
174b0 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20  when all of the 
174c0 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67  data.** on the g
174d0 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75  iven page is unu
174e0 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72 20  sed.  The pager 
174f0 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20 61  marks the page a
17500 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68  s clean so.** th
17510 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67  at it does not g
17520 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69  et written to di
17530 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20  sk..**.** Tests 
17540 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f  show that this o
17550 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67  ptimization, tog
17560 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a  ether with the.*
17570 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64  * sqlite3pager_d
17580 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62  ont_rollback() b
17590 65 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20  elow, more than 
175a0 64 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64  double the speed
175b0 0a 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53  .** of large INS
175c0 45 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61  ERT operations a
175d0 6e 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65  nd quadruple the
175e0 20 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20   speed of large 
175f0 44 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57  DELETEs..**.** W
17600 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
17610 20 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20   is called, set 
17620 74 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  the alwaysRollba
17630 63 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e  ck flag to true.
17640 0a 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63  .** Subsequent c
17650 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70  alls to sqlite3p
17660 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61  ager_dont_rollba
17670 63 6b 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d  ck() for the sam
17680 65 20 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74  e page.** will t
17690 68 65 72 65 61 66 74 65 72 20 62 65 20 69 67 6e  hereafter be ign
176a0 6f 72 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e  ored.  This is n
176b0 65 63 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69  ecessary to avoi
176c0 64 20 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77  d a problem.** w
176d0 68 65 72 65 20 61 20 70 61 67 65 20 77 69 74 68  here a page with
176e0 20 64 61 74 61 20 69 73 20 61 64 64 65 64 20 74   data is added t
176f0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  o the freelist d
17700 75 72 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f  uring one part o
17710 66 0a 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69  f.** a transacti
17720 6f 6e 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20  on then removed 
17730 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
17740 74 20 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72  t during a later
17750 20 70 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20   part.** of the 
17760 73 61 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  same transaction
17770 20 61 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20   and reused for 
17780 73 6f 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f  some other purpo
17790 73 65 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20  se.  When it.** 
177a0 69 73 20 66 69 72 73 74 20 61 64 64 65 64 20 74  is first added t
177b0 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20  o the freelist, 
177c0 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
177d0 63 61 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65  called.  When re
177e0 75 73 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e  used,.** the don
177f0 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75  t_rollback() rou
17800 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20  tine is called. 
17810 20 42 75 74 20 62 65 63 61 75 73 65 20 74 68 65   But because the
17820 20 70 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a   page contains.*
17830 2a 20 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c  * critical data,
17840 20 77 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74   we still need t
17850 6f 20 62 65 20 73 75 72 65 20 69 74 20 67 65 74  o be sure it get
17860 73 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e  s rolled back in
17870 20 73 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65   spite.** of the
17880 20 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29   dont_rollback()
17890 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73   call..*/.void s
178a0 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74  qlite3pager_dont
178b0 5f 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50  _write(Pager *pP
178c0 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29  ager, Pgno pgno)
178d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
178e0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72  .  if( MEMDB ) r
178f0 65 74 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20  eturn;..  pPg = 
17900 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
17910 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50  ger, pgno);.  pP
17920 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
17930 6b 20 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67  k = 1;.  if( pPg
17940 20 26 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29   && pPg->dirty )
17950 7b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  {.    if( pPager
17960 2d 3e 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70  ->dbSize==(int)p
17970 50 67 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67  Pg->pgno && pPag
17980 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70  er->origDbSize<p
17990 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b  Pager->dbSize ){
179a0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69  .      /* If thi
179b0 73 20 70 61 67 65 73 20 69 73 20 74 68 65 20 6c  s pages is the l
179c0 61 73 74 20 70 61 67 65 20 69 6e 20 74 68 65 20  ast page in the 
179d0 66 69 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c  file and the fil
179e0 65 20 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20  e has grown.    
179f0 20 20 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20    ** during the 
17a00 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74  current transact
17a10 69 6f 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54  ion, then do NOT
17a20 20 6d 61 72 6b 20 74 68 65 20 70 61 67 65 20 61   mark the page a
17a30 73 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a  s clean..      *
17a40 2a 20 57 68 65 6e 20 74 68 65 20 64 61 74 61 62  * When the datab
17a50 61 73 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20  ase file grows, 
17a60 77 65 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72  we must make sur
17a70 65 20 74 68 61 74 20 74 68 65 20 6c 61 73 74 20  e that the last 
17a80 70 61 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65  page.      ** ge
17a90 74 73 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65  ts written at le
17aa0 61 73 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74  ast once so that
17ab0 20 74 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77   the disk file w
17ac0 69 6c 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65  ill be the corre
17ad0 63 74 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65  ct.      ** size
17ae0 2e 20 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20  . If you do not 
17af0 77 72 69 74 65 20 74 68 69 73 20 70 61 67 65 20  write this page 
17b00 61 6e 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20  and the size of 
17b10 74 68 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a  the file.      *
17b20 2a 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e  * on the disk en
17b30 64 73 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20  ds up being too 
17b40 73 6d 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20  small, that can 
17b50 6c 65 61 64 20 74 6f 20 64 61 74 61 62 61 73 65  lead to database
17b60 0a 20 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70  .      ** corrup
17b70 74 69 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20  tion during the 
17b80 6e 65 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  next transaction
17b90 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d  ..      */.    }
17ba0 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43  else{.      TRAC
17bb0 45 33 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70  E3("DONT_WRITE p
17bc0 61 67 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c  age %d of %d\n",
17bd0 20 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70   pgno, PAGERID(p
17be0 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70  Pager));.      p
17bf0 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 23  Pg->dirty = 0;.#
17c00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45  ifdef SQLITE_CHE
17c10 43 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70  CK_PAGES.      p
17c20 50 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70  Pg->pageHash = p
17c30 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50  ager_pagehash(pP
17c40 67 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  g);.#endif.    }
17c50 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  .  }.}../*.** A 
17c60 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
17c70 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
17c80 61 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72  ager that if a r
17c90 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a  ollback occurs,.
17ca0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63  ** it is not nec
17cb0 65 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72  essary to restor
17cc0 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68  e the data on th
17cd0 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54  e given page.  T
17ce0 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61  his.** means tha
17cf0 74 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73  t the pager does
17d00 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63   not have to rec
17d10 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61  ord the given pa
17d20 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c  ge in the.** rol
17d30 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  lback journal..*
17d40 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61  /.void sqlite3pa
17d50 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63  ger_dont_rollbac
17d60 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a  k(void *pData){.
17d70 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44    PgHdr *pPg = D
17d80 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
17d90 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50  ta);.  Pager *pP
17da0 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67  ager = pPg->pPag
17db0 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65  er;..  if( pPage
17dc0 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
17dd0 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61  EXCLUSIVE || pPa
17de0 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
17df0 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
17e00 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
17e10 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65  ollback || pPage
17e20 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
17e30 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74  k || MEMDB ) ret
17e40 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d  urn;.  if( !pPg-
17e50 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69  >inJournal && (i
17e60 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20  nt)pPg->pgno <= 
17e70 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
17e80 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  ze ){.    assert
17e90 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
17ea0 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70  rnal!=0 );.    p
17eb0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
17ec0 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c  l[pPg->pgno/8] |
17ed0 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26  = 1<<(pPg->pgno&
17ee0 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a  7);.    pPg->inJ
17ef0 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
17f00 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
17f10 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70  InUse ){.      p
17f20 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
17f30 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
17f40 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
17f50 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
17f60 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
17f70 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41  );.    }.    TRA
17f80 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41  CE3("DONT_ROLLBA
17f90 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64  CK page %d of %d
17fa0 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  \n", pPg->pgno, 
17fb0 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
17fc0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
17fd0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
17fe0 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
17ff0 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
18000 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
18010 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
18020 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
18030 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  || (int)pPg->pgn
18040 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  o>pPager->origDb
18050 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65  Size );.    asse
18060 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  rt( pPager->aInS
18070 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  tmt!=0 );.    pP
18080 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
18090 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
180a0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
180b0 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f      page_add_to_
180c0 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a  stmt_list(pPg);.
180d0 20 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20    }.}...#ifndef 
180e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f  SQLITE_OMIT_MEMO
180f0 52 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72  RYDB./*.** Clear
18100 20 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f   a PgHistory blo
18110 63 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ck.*/.static voi
18120 64 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50  d clearHistory(P
18130 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29  gHistory *pHist)
18140 7b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  {.  sqliteFree(p
18150 48 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20  Hist->pOrig);.  
18160 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
18170 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73  ->pStmt);.  pHis
18180 74 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20  t->pOrig = 0;.  
18190 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
181a0 3b 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e  ;.}.#else.#defin
181b0 65 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78  e clearHistory(x
181c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
181d0 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
181e0 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
181f0 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
18200 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
18210 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
18220 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
18230 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
18240 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
18250 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
18260 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
18270 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
18280 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
18290 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
182a0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
182b0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
182c0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
182d0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
182e0 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
182f0 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
18300 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ==PAGER_ERR_FULL
18310 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
18320 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
18330 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
18340 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
18350 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
18360 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
18370 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
18380 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
18390 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
183a0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
183b0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
183c0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
183d0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
183e0 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
183f0 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
18400 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
18410 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  OR;.  }.  TRACE2
18420 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
18430 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
18440 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
18450 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
18460 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
18470 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
18480 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
18490 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
184a0 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
184b0 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
184c0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
184d0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
184e0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
184f0 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
18500 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
18510 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
18520 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
18530 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
18540 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
18550 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
18560 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
18570 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
18580 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
18590 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
185a0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
185b0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
185c0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
185d0 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
185e0 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
185f0 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
18600 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
18610 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
18620 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
18630 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
18640 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
18650 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
18660 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
18670 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
18680 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
18690 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
186a0 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
186b0 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
186c0 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
186d0 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
186e0 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
186f0 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
18700 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
18710 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
18720 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
18730 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
18740 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
18750 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
18760 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
18770 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
18780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
18790 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
187a0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
187b0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
187c0 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
187d0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
187e0 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
187f0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
18800 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
18810 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
18820 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75  }.  rc = pager_u
18830 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
18840 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  r);.  pPager->db
18850 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
18860 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
18870 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68  mp here if anyth
18880 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64  ing goes wrong d
18890 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
188a0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63   process..  */.c
188b0 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73  ommit_abort:.  s
188c0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
188d0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
188e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
188f0 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
18900 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
18910 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
18920 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
18930 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
18940 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
18950 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
18960 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
18970 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
18980 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
18990 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
189a0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
189b0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
189c0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
189d0 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
189e0 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
189f0 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
18a00 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ol (SQLITE_PROTO
18a10 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73  COL) or unless s
18a20 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
18a30 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
18a40 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
18a50 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
18a60 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
18a70 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
18a80 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
18a90 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
18aa0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
18ab0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
18ac0 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
18ad0 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
18ae0 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
18af0 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
18b00 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
18b10 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
18b20 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
18b30 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
18b40 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  .  TRACE2("ROLLB
18b50 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
18b60 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
18b70 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
18b80 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
18b90 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
18ba0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
18bb0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
18bc0 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
18bd0 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
18be0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
18bf0 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
18c00 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
18c10 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
18c20 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
18c30 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
18c40 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
18c50 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
18c60 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
18c70 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
18c80 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
18c90 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
18ca0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
18cb0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
18cc0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
18cd0 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
18ce0 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
18cf0 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
18d00 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
18d10 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
18d20 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18d30 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c       TRACE3("ROL
18d40 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
18d50 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
18d60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18d70 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
18d80 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
18d90 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
18da0 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
18db0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
18dc0 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
18dd0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
18de0 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
18df0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
18e00 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
18e10 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
18e20 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
18e30 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
18e40 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
18e50 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
18e60 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
18e70 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
18e80 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
18e90 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61  _TO_DATA(p), pPa
18ea0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
18eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
18ec0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
18ed0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
18ee0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
18ef0 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18f00 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
18f10 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
18f20 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
18f30 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
18f40 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
18f50 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
18f60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18f70 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
18f80 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
18f90 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
18fa0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
18fb0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
18fc0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
18fd0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
18fe0 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
18ff0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
19000 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
19010 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
19020 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
19030 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
19040 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
19050 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
19060 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
19070 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
19080 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
19090 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
190a0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
190b0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
190c0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
190d0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
190e0 20 72 63 32 3b 0a 20 20 20 20 72 63 20 3d 20 70   rc2;.    rc = p
190f0 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
19100 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  e(pPager);.    r
19110 63 32 20 3d 20 70 61 67 65 72 5f 75 6e 77 72 69  c2 = pager_unwri
19120 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b 0a  telock(pPager);.
19130 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
19140 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
19150 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20  c = rc2;.    }. 
19160 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
19170 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
19180 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69  pPager);.  }.  i
19190 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
191a0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
191b0 49 54 45 5f 43 4f 52 52 55 50 54 3b 20 20 2f 2a  ITE_CORRUPT;  /*
191c0 20 62 6b 70 74 2d 43 4f 52 52 55 50 54 20 2a 2f   bkpt-CORRUPT */
191d0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
191e0 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
191f0 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 20  R_CORRUPT;.  }. 
19200 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
19210 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 72  = -1;.  return r
19220 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  c;.}../*.** Retu
19230 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
19240 61 74 61 62 61 73 65 20 66 69 6c 65 20 69 73 20  atabase file is 
19250 6f 70 65 6e 65 64 20 72 65 61 64 2d 6f 6e 6c 79  opened read-only
19260 2e 20 20 52 65 74 75 72 6e 20 46 41 4c 53 45 0a  .  Return FALSE.
19270 2a 2a 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ** if the databa
19280 73 65 20 69 73 20 28 69 6e 20 74 68 65 6f 72 79  se is (in theory
19290 29 20 77 72 69 74 61 62 6c 65 2e 0a 2a 2f 0a 69  ) writable..*/.i
192a0 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
192b0 69 73 72 65 61 64 6f 6e 6c 79 28 50 61 67 65 72  isreadonly(Pager
192c0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
192d0 75 72 6e 20 70 50 61 67 65 72 2d 3e 72 65 61 64  urn pPager->read
192e0 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  Only;.}../*.** T
192f0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75  his routine is u
19300 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e 67 20  sed for testing 
19310 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f 6e 6c  and analysis onl
19320 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73 71 6c 69 74  y..*/.int *sqlit
19330 65 33 70 61 67 65 72 5f 73 74 61 74 73 28 50 61  e3pager_stats(Pa
19340 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
19350 73 74 61 74 69 63 20 69 6e 74 20 61 5b 31 31 5d  static int a[11]
19360 3b 0a 20 20 61 5b 30 5d 20 3d 20 70 50 61 67 65  ;.  a[0] = pPage
19370 72 2d 3e 6e 52 65 66 3b 0a 20 20 61 5b 31 5d 20  r->nRef;.  a[1] 
19380 3d 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 3b  = pPager->nPage;
19390 0a 20 20 61 5b 32 5d 20 3d 20 70 50 61 67 65 72  .  a[2] = pPager
193a0 2d 3e 6d 78 50 61 67 65 3b 0a 20 20 61 5b 33 5d  ->mxPage;.  a[3]
193b0 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
193c0 65 3b 0a 20 20 61 5b 34 5d 20 3d 20 70 50 61 67  e;.  a[4] = pPag
193d0 65 72 2d 3e 73 74 61 74 65 3b 0a 20 20 61 5b 35  er->state;.  a[5
193e0 5d 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  ] = pPager->errM
193f0 61 73 6b 3b 0a 20 20 61 5b 36 5d 20 3d 20 70 50  ask;.  a[6] = pP
19400 61 67 65 72 2d 3e 6e 48 69 74 3b 0a 20 20 61 5b  ager->nHit;.  a[
19410 37 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 4d 69  7] = pPager->nMi
19420 73 73 3b 0a 20 20 61 5b 38 5d 20 3d 20 70 50 61  ss;.  a[8] = pPa
19430 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a 20 20 61 5b  ger->nOvfl;.  a[
19440 39 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 52 65  9] = pPager->nRe
19450 61 64 3b 0a 20 20 61 5b 31 30 5d 20 3d 20 70 50  ad;.  a[10] = pP
19460 61 67 65 72 2d 3e 6e 57 72 69 74 65 3b 0a 20 20  ager->nWrite;.  
19470 72 65 74 75 72 6e 20 61 3b 0a 7d 0a 0a 2f 2a 0a  return a;.}../*.
19480 2a 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65  ** Set the state
19490 6d 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f  ment rollback po
194a0 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  int..**.** This 
194b0 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62  routine should b
194c0 65 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68  e called with th
194d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
194e0 75 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a  urnal already.**
194f0 20 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74   open.  A new st
19500 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20  atement journal 
19510 69 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20  is created that 
19520 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72  can be used to r
19530 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67  ollback.** chang
19540 65 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53  es of a single S
19550 51 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69  QL command withi
19560 6e 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73  n a larger trans
19570 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  action..*/.int s
19580 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
19590 5f 62 65 67 69 6e 28 50 61 67 65 72 20 2a 70 50  _begin(Pager *pP
195a0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
195b0 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 53 51  .  char zTemp[SQ
195c0 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
195d0 5a 45 5d 3b 0a 20 20 61 73 73 65 72 74 28 20 21  ZE];.  assert( !
195e0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
195f0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
19600 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e 3d 30  Pager->dbSize>=0
19610 20 29 3b 0a 20 20 54 52 41 43 45 32 28 22 53 54   );.  TRACE2("ST
19620 4d 54 2d 42 45 47 49 4e 20 25 64 5c 6e 22 2c 20  MT-BEGIN %d\n", 
19630 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
19640 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
19650 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
19660 74 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 20 20  tInUse = 1;.    
19670 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
19680 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a   = pPager->dbSiz
19690 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  e;.    return SQ
196a0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69  LITE_OK;.  }.  i
196b0 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72  f( !pPager->jour
196c0 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20 20 70  nalOpen ){.    p
196d0 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
196e0 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 72 65 74  pen = 1;.    ret
196f0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
19700 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 50 61   }.  assert( pPa
19710 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
19720 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 49   );.  pPager->aI
19730 6e 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d 61  nStmt = sqliteMa
19740 6c 6c 6f 63 28 20 70 50 61 67 65 72 2d 3e 64 62  lloc( pPager->db
19750 53 69 7a 65 2f 38 20 2b 20 31 20 29 3b 0a 20 20  Size/8 + 1 );.  
19760 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53  if( pPager->aInS
19770 74 6d 74 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tmt==0 ){.    sq
19780 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
19790 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45 44 5f  ger->fd, SHARED_
197a0 4c 4f 43 4b 29 3b 0a 20 20 20 20 72 65 74 75 72  LOCK);.    retur
197b0 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  n SQLITE_NOMEM;.
197c0 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44 45 42    }.#ifndef NDEB
197d0 55 47 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  UG.  rc = sqlite
197e0 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
197f0 67 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65  ger->jfd, &pPage
19800 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20  r->stmtJSize);. 
19810 20 69 66 28 20 72 63 20 29 20 67 6f 74 6f 20 73   if( rc ) goto s
19820 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64  tmt_begin_failed
19830 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
19840 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 3d  er->stmtJSize ==
19850 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19860 4f 66 66 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20  Off );.#endif.  
19870 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
19880 65 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  e = pPager->jour
19890 6e 61 6c 4f 66 66 3b 0a 20 20 70 50 61 67 65 72  nalOff;.  pPager
198a0 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 70 50 61  ->stmtSize = pPa
198b0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 70  ger->dbSize;.  p
198c0 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
198d0 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  f = 0;.  pPager-
198e0 3e 73 74 6d 74 43 6b 73 75 6d 20 3d 20 70 50 61  >stmtCksum = pPa
198f0 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
19900 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 73    if( !pPager->s
19910 74 6d 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72  tmtOpen ){.    r
19920 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
19930 5f 6f 70 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c  _opentemp(zTemp,
19940 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 29 3b   &pPager->stfd);
19950 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 67 6f  .    if( rc ) go
19960 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
19970 69 6c 65 64 3b 0a 20 20 20 20 70 50 61 67 65 72  iled;.    pPager
19980 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 31 3b 0a  ->stmtOpen = 1;.
19990 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
199a0 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  NRec = 0;.  }.  
199b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
199c0 65 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  e = 1;.  return 
199d0 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a 73 74 6d  SQLITE_OK;. .stm
199e0 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65 64 3a 0a  t_begin_failed:.
199f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61 49    if( pPager->aI
19a00 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c  nStmt ){.    sql
19a10 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e  iteFree(pPager->
19a20 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20 20 70 50  aInStmt);.    pP
19a30 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
19a40 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
19a50 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d  rc;.}../*.** Com
19a60 6d 69 74 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  mit a statement.
19a70 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
19a80 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74  ager_stmt_commit
19a90 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
19aa0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
19ab0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
19ac0 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65  PgHdr *pPg, *pNe
19ad0 78 74 3b 0a 20 20 20 20 54 52 41 43 45 32 28 22  xt;.    TRACE2("
19ae0 53 54 4d 54 2d 43 4f 4d 4d 49 54 20 25 64 5c 6e  STMT-COMMIT %d\n
19af0 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
19b00 72 29 29 3b 0a 20 20 20 20 69 66 28 20 21 4d 45  r));.    if( !ME
19b10 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  MDB ){.      sql
19b20 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
19b30 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20  er->stfd, 0);.  
19b40 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f 73      /* sqlite3Os
19b50 54 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72  Truncate(&pPager
19b60 2d 3e 73 74 66 64 2c 20 30 29 3b 20 2a 2f 0a 20  ->stfd, 0); */. 
19b70 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
19b80 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
19b90 20 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72   );.      pPager
19ba0 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 30 3b 0a 20  ->aInStmt = 0;. 
19bb0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 50 67     }.    for(pPg
19bc0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
19bd0 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29 7b  pPg; pPg=pNext){
19be0 0a 20 20 20 20 20 20 70 4e 65 78 74 20 3d 20 70  .      pNext = p
19bf0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
19c00 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67       assert( pPg
19c10 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20  ->inStmt );.    
19c20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 3d 20    pPg->inStmt = 
19c30 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  0;.      pPg->pP
19c40 72 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70  revStmt = pPg->p
19c50 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20  NextStmt = 0;.  
19c60 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
19c70 0a 20 20 20 20 20 20 20 20 50 67 48 69 73 74 6f  .        PgHisto
19c80 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
19c90 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
19ca0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
19cb0 73 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74  sqliteFree(pHist
19cc0 2d 3e 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  ->pStmt);.      
19cd0 20 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d    pHist->pStmt =
19ce0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
19cf0 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  }.    pPager->st
19d00 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 20 20  mtNRec = 0;.    
19d10 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
19d20 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65  e = 0;.    pPage
19d30 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  r->pStmt = 0;.  
19d40 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
19d50 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
19d60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
19d70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 6f 6c 6c 62  ;.}../*.** Rollb
19d80 61 63 6b 20 61 20 73 74 61 74 65 6d 65 6e 74 2e  ack a statement.
19d90 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
19da0 61 67 65 72 5f 73 74 6d 74 5f 72 6f 6c 6c 62 61  ager_stmt_rollba
19db0 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ck(Pager *pPager
19dc0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  ){.  int rc;.  i
19dd0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
19de0 6e 55 73 65 20 29 7b 0a 20 20 20 20 54 52 41 43  nUse ){.    TRAC
19df0 45 32 28 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43  E2("STMT-ROLLBAC
19e00 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  K %d\n", PAGERID
19e10 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
19e20 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
19e30 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20    PgHdr *pPg;.  
19e40 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
19e50 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
19e60 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 53 74  pPg=pPg->pNextSt
19e70 6d 74 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  mt){.        PgH
19e80 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
19e90 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
19ea0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
19eb0 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
19ec0 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
19ed0 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
19ee0 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 48 69  O_DATA(pPg), pHi
19ef0 73 74 2d 3e 70 53 74 6d 74 2c 20 70 50 61 67 65  st->pStmt, pPage
19f00 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
19f10 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
19f20 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d 74 29  ee(pHist->pStmt)
19f30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
19f40 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
19f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
19f60 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62        pPager->db
19f70 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 73  Size = pPager->s
19f80 74 6d 74 53 69 7a 65 3b 0a 20 20 20 20 20 20 6d  tmtSize;.      m
19f90 65 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 70 50  emoryTruncate(pP
19fa0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 63 20  ager);.      rc 
19fb0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
19fc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
19fd0 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c   = pager_stmt_pl
19fe0 61 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  ayback(pPager);.
19ff0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
1a000 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d  3pager_stmt_comm
1a010 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
1a020 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
1a030 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
1a040 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
1a050 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
1a060 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
1a070 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
1a080 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
1a090 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
1a0a0 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
1a0b0 69 74 65 33 70 61 67 65 72 5f 66 69 6c 65 6e 61  ite3pager_filena
1a0c0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1a0d0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1a0e0 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d  er->zFilename;.}
1a0f0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1a100 68 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20  he directory of 
1a110 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a120 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
1a130 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64   *sqlite3pager_d
1a140 69 72 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  irname(Pager *pP
1a150 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
1a160 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
1a170 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ry;.}../*.** Ret
1a180 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74  urn the full pat
1a190 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75  hname of the jou
1a1a0 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f  rnal file..*/.co
1a1b0 6e 73 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65  nst char *sqlite
1a1c0 33 70 61 67 65 72 5f 6a 6f 75 72 6e 61 6c 6e 61  3pager_journalna
1a1d0 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  me(Pager *pPager
1a1e0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
1a1f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a  er->zJournal;.}.
1a200 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63  ./*.** Set the c
1a210 6f 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61  odec for this pa
1a220 67 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ger.*/.void sqli
1a230 74 65 33 70 61 67 65 72 5f 73 65 74 5f 63 6f 64  te3pager_set_cod
1a240 65 63 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61  ec(.  Pager *pPa
1a250 67 65 72 2c 0a 20 20 76 6f 69 64 20 28 2a 78 43  ger,.  void (*xC
1a260 6f 64 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64  odec)(void*,void
1a270 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76  *,Pgno,int),.  v
1a280 6f 69 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29  oid *pCodecArg.)
1a290 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64  {.  pPager->xCod
1a2a0 65 63 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70  ec = xCodec;.  p
1a2b0 50 61 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67  Pager->pCodecArg
1a2c0 20 3d 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a   = pCodecArg;.}.
1a2d0 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
1a2e0 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  ine is called to
1a2f0 20 69 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 64   increment the d
1a300 61 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61  atabase file cha
1a310 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a 2a 2a 20  nge-counter,.** 
1a320 73 74 6f 72 65 64 20 61 74 20 62 79 74 65 20 32  stored at byte 2
1a330 34 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66  4 of the pager f
1a340 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ile..*/.static i
1a350 6e 74 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68  nt pager_incr_ch
1a360 61 6e 67 65 63 6f 75 6e 74 65 72 28 50 61 67 65  angecounter(Page
1a370 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 76 6f  r *pPager){.  vo
1a380 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 50 67 48  id *pPage;.  PgH
1a390 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 75 33  dr *pPgHdr;.  u3
1a3a0 32 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  2 change_counter
1a3b0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  ;.  int rc;..  /
1a3c0 2a 20 4f 70 65 6e 20 70 61 67 65 20 31 20 6f 66  * Open page 1 of
1a3d0 20 74 68 65 20 66 69 6c 65 20 66 6f 72 20 77 72   the file for wr
1a3e0 69 74 69 6e 67 2e 20 2a 2f 0a 20 20 72 63 20 3d  iting. */.  rc =
1a3f0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65   sqlite3pager_ge
1a400 74 28 70 50 61 67 65 72 2c 20 31 2c 20 26 70 50  t(pPager, 1, &pP
1a410 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  age);.  if( rc!=
1a420 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1a430 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
1a440 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
1a450 28 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72  (pPage);.  if( r
1a460 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
1a470 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20  eturn rc;..  /* 
1a480 52 65 61 64 20 74 68 65 20 63 75 72 72 65 6e 74  Read the current
1a490 20 76 61 6c 75 65 20 61 74 20 62 79 74 65 20 32   value at byte 2
1a4a0 34 2e 20 2a 2f 0a 20 20 70 50 67 48 64 72 20 3d  4. */.  pPgHdr =
1a4b0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1a4c0 50 61 67 65 29 3b 0a 20 20 63 68 61 6e 67 65 5f  Page);.  change_
1a4d0 63 6f 75 6e 74 65 72 20 3d 20 72 65 74 72 69 65  counter = retrie
1a4e0 76 65 33 32 62 69 74 73 28 70 50 67 48 64 72 2c  ve32bits(pPgHdr,
1a4f0 20 32 34 29 3b 0a 0a 20 20 2f 2a 20 49 6e 63 72   24);..  /* Incr
1a500 65 6d 65 6e 74 20 74 68 65 20 76 61 6c 75 65 20  ement the value 
1a510 6a 75 73 74 20 72 65 61 64 20 61 6e 64 20 77 72  just read and wr
1a520 69 74 65 20 69 74 20 62 61 63 6b 20 74 6f 20 62  ite it back to b
1a530 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 63 68 61  yte 24. */.  cha
1a540 6e 67 65 5f 63 6f 75 6e 74 65 72 2b 2b 3b 0a 20  nge_counter++;. 
1a550 20 73 74 6f 72 65 33 32 62 69 74 73 28 63 68 61   store32bits(cha
1a560 6e 67 65 5f 63 6f 75 6e 74 65 72 2c 20 70 50 67  nge_counter, pPg
1a570 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
1a580 52 65 6c 65 61 73 65 20 74 68 65 20 70 61 67 65  Release the page
1a590 20 72 65 66 65 72 65 6e 63 65 2e 20 2a 2f 0a 20   reference. */. 
1a5a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75 6e   sqlite3pager_un
1a5b0 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20 72 65  ref(pPage);.  re
1a5c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
1a5d0 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68  }../*.** Sync th
1a5e0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
1a5f0 66 6f 72 20 74 68 65 20 70 61 67 65 72 20 70 50  for the pager pP
1a600 61 67 65 72 2e 20 7a 4d 61 73 74 65 72 20 70 6f  ager. zMaster po
1a610 69 6e 74 73 20 74 6f 20 74 68 65 20 6e 61 6d 65  ints to the name
1a620 0a 2a 2a 20 6f 66 20 61 20 6d 61 73 74 65 72 20  .** of a master 
1a630 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 61  journal file tha
1a640 74 20 73 68 6f 75 6c 64 20 62 65 20 77 72 69 74  t should be writ
1a650 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 69 6e 64  ten into the ind
1a660 69 76 69 64 75 61 6c 0a 2a 2a 20 6a 6f 75 72 6e  ividual.** journ
1a670 61 6c 20 66 69 6c 65 2e 20 7a 4d 61 73 74 65 72  al file. zMaster
1a680 20 6d 61 79 20 62 65 20 4e 55 4c 4c 2c 20 77 68   may be NULL, wh
1a690 69 63 68 20 69 73 20 69 6e 74 65 72 70 72 65 74  ich is interpret
1a6a0 65 64 20 61 73 20 6e 6f 20 6d 61 73 74 65 72 0a  ed as no master.
1a6b0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28 61 20 73 69  ** journal (a si
1a6c0 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
1a6d0 61 6e 73 61 63 74 69 6f 6e 29 2e 0a 2a 2a 0a 2a  ansaction)..**.*
1a6e0 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 65  * This routine e
1a6f0 6e 73 75 72 65 73 20 74 68 61 74 20 74 68 65 20  nsures that the 
1a700 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
1a710 64 2c 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67  d, all dirty pag
1a720 65 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 74 6f  es written.** to
1a730 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
1a740 6c 65 20 61 6e 64 20 74 68 65 20 64 61 74 61 62  le and the datab
1a750 61 73 65 20 66 69 6c 65 20 73 79 6e 63 65 64 2e  ase file synced.
1a760 20 54 68 65 20 6f 6e 6c 79 20 74 68 69 6e 67 20   The only thing 
1a770 74 68 61 74 0a 2a 2a 20 72 65 6d 61 69 6e 73 20  that.** remains 
1a780 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  to commit the tr
1a790 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 74 6f 20  ansaction is to 
1a7a0 64 65 6c 65 74 65 20 74 68 65 20 6a 6f 75 72 6e  delete the journ
1a7b0 61 6c 20 66 69 6c 65 20 28 6f 72 0a 2a 2a 20 6d  al file (or.** m
1a7c0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1a7d0 6c 65 20 69 66 20 73 70 65 63 69 66 69 65 64 29  le if specified)
1a7e0 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61  ..**.** Note tha
1a7f0 74 20 69 66 20 7a 4d 61 73 74 65 72 3d 3d 4e 55  t if zMaster==NU
1a800 4c 4c 2c 20 74 68 69 73 20 64 6f 65 73 20 6e 6f  LL, this does no
1a810 74 20 6f 76 65 72 77 72 69 74 65 20 61 20 70 72  t overwrite a pr
1a820 65 76 69 6f 75 73 20 76 61 6c 75 65 0a 2a 2a 20  evious value.** 
1a830 70 61 73 73 65 64 20 74 6f 20 61 6e 20 73 71 6c  passed to an sql
1a840 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28 29  ite3pager_sync()
1a850 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   call..**.** If 
1a860 70 61 72 61 6d 65 74 65 72 20 6e 54 72 75 6e 63  parameter nTrunc
1a870 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68   is non-zero, th
1a880 65 6e 20 74 68 65 20 70 61 67 65 72 20 66 69 6c  en the pager fil
1a890 65 20 69 73 20 74 72 75 6e 63 61 74 65 64 20 74  e is truncated t
1a8a0 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70 61 67 65  o.** nTrunc page
1a8b0 73 20 28 74 68 69 73 20 69 73 20 75 73 65 64 20  s (this is used 
1a8c0 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 64  by auto-vacuum d
1a8d0 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f 0a 69 6e  atabases)..*/.in
1a8e0 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  t sqlite3pager_s
1a8f0 79 6e 63 28 50 61 67 65 72 20 2a 70 50 61 67 65  ync(Pager *pPage
1a900 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
1a910 4d 61 73 74 65 72 2c 20 50 67 6e 6f 20 6e 54 72  Master, Pgno nTr
1a920 75 6e 63 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  unc){.  int rc =
1a930 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 54   SQLITE_OK;..  T
1a940 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45 20  RACE4("DATABASE 
1a950 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a 4d  SYNC: File=%s zM
1a960 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63 3d  aster=%s nTrunc=
1a970 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70 50  %d\n", .      pP
1a980 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 2c  ager->zFilename,
1a990 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e 63   zMaster, nTrunc
1a9a0 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  );..  /* If this
1a9b0 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   is an in-memory
1a9c0 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65 73   db, or no pages
1a9d0 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1a9e0 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a 20  en to, or this. 
1a9f0 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61 73   ** function has
1aa00 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63 61   already been ca
1aa10 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e 6f  lled, it is a no
1aa20 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  -op..  */.  if( 
1aa30 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50  pPager->state!=P
1aa40 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20 21  AGER_SYNCED && !
1aa50 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
1aa60 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a 20  >dirtyCache ){. 
1aa70 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20     PgHdr *pPg;. 
1aa80 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1aa90 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
1aaa0 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 6d  ;..    /* If a m
1aab0 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
1aac0 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72 65  le name has alre
1aad0 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e  ady been written
1aae0 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20 6a   to the.    ** j
1aaf0 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68 65  ournal file, the
1ab00 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65 71  n no sync is req
1ab10 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70 70  uired. This happ
1ab20 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a 20  ens when it is. 
1ab30 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20 74     ** written, t
1ab40 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73 20  hen the process 
1ab50 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64 65  fails to upgrade
1ab60 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45 44   from a RESERVED
1ab70 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58   to an.    ** EX
1ab80 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54 68  CLUSIVE lock. Th
1ab90 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65 20  e next time the 
1aba0 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74 6f  process tries to
1abb0 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20 20   commit the.    
1abc0 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74  ** transaction t
1abd0 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c 6c  he m-j name will
1abe0 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
1abf0 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20 20  en written..    
1ac00 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  */.    if( !pPag
1ac10 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 7b  er->setMaster ){
1ac20 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
1ac30 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f 75  r_incr_changecou
1ac40 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20 20  nter(pPager);.  
1ac50 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1ac60 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e  TE_OK ) goto syn
1ac70 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66 20  c_exit;.#ifndef 
1ac80 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f  SQLITE_OMIT_AUTO
1ac90 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66 28  VACUUM.      if(
1aca0 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20   nTrunc!=0 ){.  
1acb0 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73        /* If this
1acc0 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61 73   transaction has
1acd0 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62 61   made the databa
1ace0 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65 6e  se smaller, then
1acf0 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20 20   all pages.     
1ad00 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73 63     ** being disc
1ad10 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72 75  arded by the tru
1ad20 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65 20  ncation must be 
1ad30 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a  written to the j
1ad40 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20 2a  ournal.        *
1ad50 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20 20  * file..        
1ad60 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f 20  */.        Pgno 
1ad70 69 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64 20  i;.        void 
1ad80 2a 70 50 61 67 65 3b 0a 20 20 20 20 20 20 20 20  *pPage;.        
1ad90 66 6f 72 28 20 69 3d 6e 54 72 75 6e 63 2b 31 3b  for( i=nTrunc+1;
1ada0 20 69 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67   i<=pPager->orig
1adb0 44 62 53 69 7a 65 3b 20 69 2b 2b 20 29 7b 0a 20  DbSize; i++ ){. 
1adc0 20 20 20 20 20 20 20 20 20 69 66 28 20 21 28 70           if( !(p
1add0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ade0 6c 5b 69 2f 38 5d 20 26 20 28 31 3c 3c 28 69 26  l[i/8] & (1<<(i&
1adf0 37 29 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20  7))) ){.        
1ae00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1ae10 70 61 67 65 72 5f 67 65 74 28 70 50 61 67 65 72  pager_get(pPager
1ae20 2c 20 69 2c 20 26 70 50 61 67 65 29 3b 0a 20 20  , i, &pPage);.  
1ae30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
1ae40 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1ae50 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
1ae60 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
1ae70 71 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74  qlite3pager_writ
1ae80 65 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20 20  e(pPage);.      
1ae90 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
1aea0 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
1aeb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
1aec0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1aed0 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1aee0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1aef0 20 20 20 20 20 7d 20 0a 20 20 20 20 20 20 7d 0a       } .      }.
1af00 23 65 6e 64 69 66 0a 20 20 20 20 20 20 72 63 20  #endif.      rc 
1af10 3d 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f 75  = writeMasterJou
1af20 72 6e 61 6c 28 70 50 61 67 65 72 2c 20 7a 4d 61  rnal(pPager, zMa
1af30 73 74 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28  ster);.      if(
1af40 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
1af50 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b   goto sync_exit;
1af60 0a 20 20 20 20 20 20 72 63 20 3d 20 73 79 6e 63  .      rc = sync
1af70 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  Journal(pPager);
1af80 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
1af90 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
1afa0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
1afb0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
1afc0 5f 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d  _OMIT_AUTOVACUUM
1afd0 0a 20 20 20 20 69 66 28 20 6e 54 72 75 6e 63 21  .    if( nTrunc!
1afe0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  =0 ){.      rc =
1aff0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 74 72   sqlite3pager_tr
1b000 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
1b010 54 72 75 6e 63 29 3b 0a 20 20 20 20 20 20 69 66  Trunc);.      if
1b020 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1b030 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1b040 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 0a  ;.    }.#endif..
1b050 20 20 20 20 2f 2a 20 57 72 69 74 65 20 61 6c 6c      /* Write all
1b060 20 64 69 72 74 79 20 70 61 67 65 73 20 74 6f 20   dirty pages to 
1b070 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1b080 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d 20 70  e */.    pPg = p
1b090 61 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72  ager_get_all_dir
1b0a0 74 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29  ty_pages(pPager)
1b0b0 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
1b0c0 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73 74 28  _write_pagelist(
1b0d0 70 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63  pPg);.    if( rc
1b0e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
1b0f0 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 0a 20  to sync_exit;.. 
1b100 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20 64     /* Sync the d
1b110 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a 2f  atabase file. */
1b120 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65 72  .    if( !pPager
1b130 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20 20  ->noSync ){.    
1b140 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1b150 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 66 64  Sync(&pPager->fd
1b160 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 50  );.    }..    pP
1b170 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
1b180 47 45 52 5f 53 59 4e 43 45 44 3b 0a 20 20 7d 0a  GER_SYNCED;.  }.
1b190 0a 73 79 6e 63 5f 65 78 69 74 3a 0a 20 20 72 65  .sync_exit:.  re
1b1a0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 23 69 66 6e  turn rc;.}..#ifn
1b1b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1b1c0 41 55 54 4f 56 41 43 55 55 4d 0a 2f 2a 0a 2a 2a  AUTOVACUUM./*.**
1b1d0 20 4d 6f 76 65 20 74 68 65 20 70 61 67 65 20 69   Move the page i
1b1e0 64 65 6e 74 69 66 69 65 64 20 62 79 20 70 44 61  dentified by pDa
1b1f0 74 61 20 74 6f 20 6c 6f 63 61 74 69 6f 6e 20 70  ta to location p
1b200 67 6e 6f 20 69 6e 20 74 68 65 20 66 69 6c 65 2e  gno in the file.
1b210 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75   .**.** There mu
1b220 73 74 20 62 65 20 6e 6f 20 72 65 66 65 72 65 6e  st be no referen
1b230 63 65 73 20 74 6f 20 74 68 65 20 63 75 72 72 65  ces to the curre
1b240 6e 74 20 70 61 67 65 20 70 67 6e 6f 2e 20 49 66  nt page pgno. If
1b250 20 63 75 72 72 65 6e 74 20 70 61 67 65 0a 2a 2a   current page.**
1b260 20 70 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72   pgno is not alr
1b270 65 61 64 79 20 69 6e 20 74 68 65 20 72 6f 6c 6c  eady in the roll
1b280 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69 74  back journal, it
1b290 20 69 73 20 6e 6f 74 20 77 72 69 74 74 65 6e 20   is not written 
1b2a0 74 68 65 72 65 20 62 79 0a 2a 2a 20 62 79 20 74  there by.** by t
1b2b0 68 69 73 20 72 6f 75 74 69 6e 65 2e 20 54 68 65  his routine. The
1b2c0 20 73 61 6d 65 20 61 70 70 6c 69 65 73 20 74 6f   same applies to
1b2d0 20 74 68 65 20 70 61 67 65 20 70 44 61 74 61 20   the page pData 
1b2e0 72 65 66 65 72 73 20 74 6f 20 6f 6e 20 65 6e 74  refers to on ent
1b2f0 72 79 20 74 6f 0a 2a 2a 20 74 68 69 73 20 72 6f  ry to.** this ro
1b300 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
1b310 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
1b320 61 67 65 20 72 65 66 65 72 65 64 20 74 6f 20 62  age refered to b
1b330 79 20 70 44 61 74 61 20 72 65 6d 61 69 6e 20 76  y pData remain v
1b340 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
1b350 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
1b360 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
1b370 70 61 67 65 20 70 44 61 74 61 20 28 69 2e 65 2e  page pData (i.e.
1b380 20 64 61 74 61 20 73 74 6f 72 65 64 20 69 6e 20   data stored in 
1b390 74 68 65 20 6e 45 78 74 72 61 20 62 79 74 65 73  the nExtra bytes
1b3a0 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c  .** allocated al
1b3b0 6f 6e 67 20 77 69 74 68 20 74 68 65 20 70 61 67  ong with the pag
1b3c0 65 29 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  e) is the respon
1b3d0 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 20  sibility of the 
1b3e0 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a 2a 20 41 20  caller..**.** A 
1b3f0 74 72 61 6e 73 61 63 74 69 6f 6e 20 6d 75 73 74  transaction must
1b400 20 62 65 20 61 63 74 69 76 65 20 77 68 65 6e 20   be active when 
1b410 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
1b420 63 61 6c 6c 65 64 2c 20 68 6f 77 65 76 65 72 20  called, however 
1b430 69 74 20 69 73 20 0a 2a 2a 20 69 6c 6c 65 67 61  it is .** illega
1b440 6c 20 74 6f 20 63 61 6c 6c 20 74 68 69 73 20 72  l to call this r
1b450 6f 75 74 69 6e 65 20 69 66 20 61 20 73 74 61 74  outine if a stat
1b460 6d 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  ment transaction
1b470 20 69 73 20 61 63 74 69 76 65 2e 0a 2a 2f 0a 69   is active..*/.i
1b480 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
1b490 6d 6f 76 65 70 61 67 65 28 50 61 67 65 72 20 2a  movepage(Pager *
1b4a0 70 50 61 67 65 72 2c 20 76 6f 69 64 20 2a 70 44  pPager, void *pD
1b4b0 61 74 61 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  ata, Pgno pgno){
1b4c0 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
1b4d0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
1b4e0 61 74 61 29 3b 0a 20 20 50 67 48 64 72 20 2a 70  ata);.  PgHdr *p
1b4f0 50 67 4f 6c 64 3b 20 0a 20 20 69 6e 74 20 68 3b  PgOld; .  int h;
1b500 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
1b510 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
1b520 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74  ert( !pPager->st
1b530 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73  mtInUse );.  ass
1b540 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
1b550 20 29 3b 0a 0a 20 20 54 52 41 43 45 35 28 22 4d   );..  TRACE5("M
1b560 4f 56 45 20 25 64 20 70 61 67 65 20 25 64 20 28  OVE %d page %d (
1b570 6e 65 65 64 53 79 6e 63 3d 25 64 29 20 6d 6f 76  needSync=%d) mov
1b580 65 73 20 74 6f 20 25 64 5c 6e 22 2c 20 0a 20 20  es to %d\n", .  
1b590 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
1b5a0 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  er), pPg->pgno, 
1b5b0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 2c 20 70  pPg->needSync, p
1b5c0 67 6e 6f 29 3b 0a 0a 20 20 69 66 28 20 70 50 67  gno);..  if( pPg
1b5d0 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20  ->needSync ){.  
1b5e0 20 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 3d    needSyncPgno =
1b5f0 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
1b600 61 73 73 65 72 74 28 20 70 50 67 2d 3e 69 6e 4a  assert( pPg->inJ
1b610 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 61 73  ournal );.    as
1b620 73 65 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79  sert( pPg->dirty
1b630 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
1b640 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
1b650 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e   );.  }..  /* Un
1b660 6c 69 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74  link pPg from it
1b670 27 73 20 68 61 73 68 2d 63 68 61 69 6e 20 2a 2f  's hash-chain */
1b680 0a 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61  .  unlinkHashCha
1b690 69 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b  in(pPager, pPg);
1b6a0 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 61  ..  /* If the ca
1b6b0 63 68 65 20 63 6f 6e 74 61 69 6e 73 20 61 20 70  che contains a p
1b6c0 61 67 65 20 77 69 74 68 20 70 61 67 65 2d 6e 75  age with page-nu
1b6d0 6d 62 65 72 20 70 67 6e 6f 2c 20 72 65 6d 6f 76  mber pgno, remov
1b6e0 65 20 69 74 0a 20 20 2a 2a 20 66 72 6f 6d 20 69  e it.  ** from i
1b6f0 74 27 73 20 68 61 73 68 20 63 68 61 69 6e 2e 20  t's hash chain. 
1b700 41 6c 73 6f 2c 20 69 66 20 74 68 65 20 50 67 48  Also, if the PgH
1b710 64 72 2e 6e 65 65 64 53 79 6e 63 20 77 61 73 20  dr.needSync was 
1b720 73 65 74 20 66 6f 72 20 0a 20 20 2a 2a 20 70 61  set for .  ** pa
1b730 67 65 20 70 67 6e 6f 20 62 65 66 6f 72 65 20 74  ge pgno before t
1b740 68 65 20 27 6d 6f 76 65 27 20 6f 70 65 72 61 74  he 'move' operat
1b750 69 6f 6e 2c 20 69 74 20 6e 65 65 64 73 20 74 6f  ion, it needs to
1b760 20 62 65 20 72 65 74 61 69 6e 65 64 20 0a 20 20   be retained .  
1b770 2a 2a 20 66 6f 72 20 74 68 65 20 70 61 67 65 20  ** for the page 
1b780 6d 6f 76 65 64 20 74 68 65 72 65 2e 0a 20 20 2a  moved there..  *
1b790 2f 0a 20 20 70 50 67 4f 6c 64 20 3d 20 70 61 67  /.  pPgOld = pag
1b7a0 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72  er_lookup(pPager
1b7b0 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70  , pgno);.  if( p
1b7c0 50 67 4f 6c 64 20 29 7b 0a 20 20 20 20 61 73 73  PgOld ){.    ass
1b7d0 65 72 74 28 20 70 50 67 4f 6c 64 2d 3e 6e 52 65  ert( pPgOld->nRe
1b7e0 66 3d 3d 30 20 29 3b 0a 20 20 20 20 75 6e 6c 69  f==0 );.    unli
1b7f0 6e 6b 48 61 73 68 43 68 61 69 6e 28 70 50 61 67  nkHashChain(pPag
1b800 65 72 2c 20 70 50 67 4f 6c 64 29 3b 0a 20 20 20  er, pPgOld);.   
1b810 20 70 50 67 4f 6c 64 2d 3e 64 69 72 74 79 20 3d   pPgOld->dirty =
1b820 20 30 3b 0a 20 20 20 20 69 66 28 20 70 50 67 4f   0;.    if( pPgO
1b830 6c 64 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 0a  ld->needSync ){.
1b840 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
1b850 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  gOld->inJournal 
1b860 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1b870 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20  Journal = 1;.   
1b880 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
1b890 20 3d 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65   = 1;.      asse
1b8a0 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1b8b0 53 79 6e 63 20 29 3b 0a 20 20 20 20 7d 0a 20 20  Sync );.    }.  
1b8c0 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20 74  }..  /* Change t
1b8d0 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
1b8e0 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65 72  or pPg and inser
1b8f0 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e 65  t it into the ne
1b900 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a 2f  w hash-chain. */
1b910 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70  .  pPg->pgno = p
1b920 67 6e 6f 3b 0a 20 20 68 20 3d 20 70 61 67 65 72  gno;.  h = pager
1b930 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20 69  _hash(pgno);.  i
1b940 66 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  f( pPager->aHash
1b950 5b 68 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72  [h] ){.    asser
1b960 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68  t( pPager->aHash
1b970 5b 68 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d  [h]->pPrevHash==
1b980 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1b990 3e 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76  >aHash[h]->pPrev
1b9a0 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a  Hash = pPg;.  }.
1b9b0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
1b9c0 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
1b9d0 5b 68 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61  [h];.  pPager->a
1b9e0 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20  Hash[h] = pPg;. 
1b9f0 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
1ba00 3d 20 30 3b 0a 0a 20 20 70 50 67 2d 3e 64 69 72  = 0;..  pPg->dir
1ba10 74 79 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72  ty = 1;.  pPager
1ba20 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31  ->dirtyCache = 1
1ba30 3b 0a 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e  ;..  if( needSyn
1ba40 63 50 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20  cPgno ){.    /* 
1ba50 49 66 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20  If needSyncPgno 
1ba60 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65  is non-zero, the
1ba70 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  n the journal fi
1ba80 6c 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a  le needs to be .
1ba90 20 20 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20      ** sync()ed 
1baa0 62 65 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20  before any data 
1bab0 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61  is written to da
1bac0 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 67 65  tabase file page
1bad0 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20   needSyncPgno.. 
1bae0 20 20 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c     ** Currently,
1baf0 20 6e 6f 20 73 75 63 68 20 70 61 67 65 20 65 78   no such page ex
1bb00 69 73 74 73 20 69 6e 20 74 68 65 20 70 61 67 65  ists in the page
1bb10 2d 63 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a  -cache and the .
1bb20 20 20 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e      ** Pager.aIn
1bb30 4a 6f 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20  Journal bit has 
1bb40 62 65 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e  been set. This n
1bb50 65 65 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64  eeds to be remed
1bb60 69 65 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20  ied by loading. 
1bb70 20 20 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69     ** the page i
1bb80 6e 74 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61  nto the pager-ca
1bb90 63 68 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20  che and setting 
1bba0 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
1bbb0 6e 63 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a  nc flag..    **.
1bbc0 20 20 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74      ** The sqlit
1bbd0 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 63 61  e3pager_get() ca
1bbe0 6c 6c 20 6d 61 79 20 63 61 75 73 65 20 74 68 65  ll may cause the
1bbf0 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63   journal to sync
1bc00 2e 20 53 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a  . So make.    **
1bc10 20 73 75 72 65 20 74 68 65 20 50 61 67 65 72 2e   sure the Pager.
1bc20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20 69 73  needSync flag is
1bc30 20 73 65 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f   set too..    */
1bc40 0a 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20 20  .    int rc;.   
1bc50 20 76 6f 69 64 20 2a 70 4e 65 65 64 53 79 6e 63   void *pNeedSync
1bc60 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  ;.    assert( pP
1bc70 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 29  ager->needSync )
1bc80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1bc90 65 33 70 61 67 65 72 5f 67 65 74 28 70 50 61 67  e3pager_get(pPag
1bca0 65 72 2c 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f  er, needSyncPgno
1bcb0 2c 20 26 70 4e 65 65 64 53 79 6e 63 29 3b 0a 20  , &pNeedSync);. 
1bcc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1bcd0 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
1bce0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65  ;.    pPager->ne
1bcf0 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1bd00 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e  DATA_TO_PGHDR(pN
1bd10 65 65 64 53 79 6e 63 29 2d 3e 6e 65 65 64 53 79  eedSync)->needSy
1bd20 6e 63 20 3d 20 31 3b 0a 20 20 20 20 44 41 54 41  nc = 1;.    DATA
1bd30 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64 53  _TO_PGHDR(pNeedS
1bd40 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20  ync)->inJournal 
1bd50 3d 20 31 3b 0a 20 20 20 20 44 41 54 41 5f 54 4f  = 1;.    DATA_TO
1bd60 5f 50 47 48 44 52 28 70 4e 65 65 64 53 79 6e 63  _PGHDR(pNeedSync
1bd70 29 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20  )->dirty = 1;.  
1bd80 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
1bd90 6e 72 65 66 28 70 4e 65 65 64 53 79 6e 63 29 3b  nref(pNeedSync);
1bda0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
1bdb0 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64  QLITE_OK;.}.#end
1bdc0 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  if..#if defined(
1bdd0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
1bde0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1bdf0 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75  TEST)./*.** Retu
1be00 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  rn the current s
1be10 74 61 74 65 20 6f 66 20 74 68 65 20 66 69 6c 65  tate of the file
1be20 20 6c 6f 63 6b 20 66 6f 72 20 74 68 65 20 67 69   lock for the gi
1be30 76 65 6e 20 70 61 67 65 72 2e 0a 2a 2a 20 54 68  ven pager..** Th
1be40 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 69  e return value i
1be50 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f 4c 4f 43 4b  s one of NO_LOCK
1be60 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 2c 20 52  , SHARED_LOCK, R
1be70 45 53 45 52 56 45 44 5f 4c 4f 43 4b 2c 0a 2a 2a  ESERVED_LOCK,.**
1be80 20 50 45 4e 44 49 4e 47 5f 4c 4f 43 4b 2c 20 6f   PENDING_LOCK, o
1be90 72 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b  r EXCLUSIVE_LOCK
1bea0 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
1beb0 70 61 67 65 72 5f 6c 6f 63 6b 73 74 61 74 65 28  pager_lockstate(
1bec0 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
1bed0 23 69 66 64 65 66 20 4f 53 5f 54 45 53 54 0a 20  #ifdef OS_TEST. 
1bee0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
1bef0 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74 79 70 65 3b  fd->fd.locktype;
1bf00 0a 23 65 6c 73 65 0a 20 20 72 65 74 75 72 6e 20  .#else.  return 
1bf10 70 50 61 67 65 72 2d 3e 66 64 2e 6c 6f 63 6b 74  pPager->fd.lockt
1bf20 79 70 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 23 65  ype;.#endif.}.#e
1bf30 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53 51 4c  ndif..#ifdef SQL
1bf40 49 54 45 5f 44 45 42 55 47 0a 2f 2a 0a 2a 2a 20  ITE_DEBUG./*.** 
1bf50 50 72 69 6e 74 20 61 20 6c 69 73 74 69 6e 67 20  Print a listing 
1bf60 6f 66 20 61 6c 6c 20 72 65 66 65 72 65 6e 63 65  of all reference
1bf70 64 20 70 61 67 65 73 20 61 6e 64 20 74 68 65 69  d pages and thei
1bf80 72 20 72 65 66 20 63 6f 75 6e 74 2e 0a 2a 2f 0a  r ref count..*/.
1bf90 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
1bfa0 72 5f 72 65 66 64 75 6d 70 28 50 61 67 65 72 20  r_refdump(Pager 
1bfb0 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
1bfc0 72 20 2a 70 50 67 3b 0a 20 20 66 6f 72 28 70 50  r *pPg;.  for(pP
1bfd0 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
1bfe0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
1bff0 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28  extAll){.    if(
1c000 20 70 50 67 2d 3e 6e 52 65 66 3c 3d 30 20 29 20   pPg->nRef<=0 ) 
1c010 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 73 71  continue;.    sq
1c020 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66  lite3DebugPrintf
1c030 28 22 50 41 47 45 20 25 33 64 20 61 64 64 72 3d  ("PAGE %3d addr=
1c040 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 20 0a  %p nRef=%d\n", .
1c050 20 20 20 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f         pPg->pgno
1c060 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  , PGHDR_TO_DATA(
1c070 70 50 67 29 2c 20 70 50 67 2d 3e 6e 52 65 66 29  pPg), pPg->nRef)
1c080 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a     ;.  }.}.#endif.