/ Hex Artifact Content
Login

Artifact 4b37f741fc199166cc69cfdfdbbb1e41b30f7ede:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ******.** This i
0180: 73 20 74 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61  s the implementa
0190: 74 69 6f 6e 20 6f 66 20 74 68 65 20 70 61 67 65  tion of the page
01a0: 20 63 61 63 68 65 20 73 75 62 73 79 73 74 65 6d   cache subsystem
01b0: 20 6f 72 20 22 70 61 67 65 72 22 2e 0a 2a 2a 20   or "pager"..** 
01c0: 0a 2a 2a 20 54 68 65 20 70 61 67 65 72 20 69 73  .** The pager is
01d0: 20 75 73 65 64 20 74 6f 20 61 63 63 65 73 73 20   used to access 
01e0: 61 20 64 61 74 61 62 61 73 65 20 64 69 73 6b 20  a database disk 
01f0: 66 69 6c 65 2e 20 20 49 74 20 69 6d 70 6c 65 6d  file.  It implem
0200: 65 6e 74 73 0a 2a 2a 20 61 74 6f 6d 69 63 20 63  ents.** atomic c
0210: 6f 6d 6d 69 74 20 61 6e 64 20 72 6f 6c 6c 62 61  ommit and rollba
0220: 63 6b 20 74 68 72 6f 75 67 68 20 74 68 65 20 75  ck through the u
0230: 73 65 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20  se of a journal 
0240: 66 69 6c 65 20 74 68 61 74 0a 2a 2a 20 69 73 20  file that.** is 
0250: 73 65 70 61 72 61 74 65 20 66 72 6f 6d 20 74 68  separate from th
0260: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0270: 20 20 54 68 65 20 70 61 67 65 72 20 61 6c 73 6f    The pager also
0280: 20 69 6d 70 6c 65 6d 65 6e 74 73 20 66 69 6c 65   implements file
0290: 0a 2a 2a 20 6c 6f 63 6b 69 6e 67 20 74 6f 20 70  .** locking to p
02a0: 72 65 76 65 6e 74 20 74 77 6f 20 70 72 6f 63 65  revent two proce
02b0: 73 73 65 73 20 66 72 6f 6d 20 77 72 69 74 69 6e  sses from writin
02c0: 67 20 74 68 65 20 73 61 6d 65 20 64 61 74 61 62  g the same datab
02d0: 61 73 65 0a 2a 2a 20 66 69 6c 65 20 73 69 6d 75  ase.** file simu
02e0: 6c 74 61 6e 65 6f 75 73 6c 79 2c 20 6f 72 20 6f  ltaneously, or o
02f0: 6e 65 20 70 72 6f 63 65 73 73 20 66 72 6f 6d 20  ne process from 
0300: 72 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61  reading the data
0310: 62 61 73 65 20 77 68 69 6c 65 0a 2a 2a 20 61 6e  base while.** an
0320: 6f 74 68 65 72 20 69 73 20 77 72 69 74 69 6e 67  other is writing
0330: 2e 0a 2a 2a 0a 2a 2a 20 40 28 23 29 20 24 49 64  ..**.** @(#) $Id
0340: 3a 20 70 61 67 65 72 2e 63 2c 76 20 31 2e 31 38  : pager.c,v 1.18
0350: 32 20 32 30 30 35 2f 30 31 2f 31 33 20 31 31 3a  2 2005/01/13 11:
0360: 30 37 3a 35 33 20 64 61 6e 69 65 6c 6b 31 39 37  07:53 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35  ).#define TRACE5
04f0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69  (X,Y,Z,W,V) sqli
0500: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0510: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a  ,Y,Z,W,V).#else.
0520: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
0530: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0540: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0550: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0560: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0570: 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,W).#define TRAC
0580: 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65  E5(X,Y,Z,W,V).#e
0590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
05a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
05b0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
05c0: 74 68 69 6e 20 74 68 65 20 54 52 41 43 45 58 28  thin the TRACEX(
05d0: 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a  ) macros above.*
05e0: 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66  * to print out f
05f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e  ile-descriptors.
0600: 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
0610: 65 64 20 73 6f 20 74 68 61 74 20 74 72 61 63 69  ed so that traci
0620: 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20 74 75 72  ng.** can be tur
0630: 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75 73 69 6e  ned on when usin
0640: 67 20 62 6f 74 68 20 74 68 65 20 72 65 67 75 6c  g both the regul
0650: 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6e 64  ar os_unix.c and
0660: 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a 20 62 61   os_test.c.** ba
0670: 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 50 41  ckends..**.** PA
0680: 47 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20  GERID() takes a 
0690: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
06a0: 65 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27  er struct as it'
06b0: 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a  s argument. The.
06c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  ** associated fi
06d0: 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73  le-descriptor is
06e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48   returned. FILEH
06f0: 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20  ANDLEID() takes 
0700: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72  an OsFile.** str
0710: 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75  uct as it's argu
0720: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ment..*/.#ifdef 
0730: 4f 53 5f 54 45 53 54 0a 23 64 65 66 69 6e 65 20  OS_TEST.#define 
0740: 50 41 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66  PAGERID(p) (p->f
0750: 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65  d->fd.h).#define
0760: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0770: 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a 23 65 6c  ) (fd->fd.h).#el
0780: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0790: 49 44 28 70 29 20 28 70 2d 3e 66 64 2e 68 29 0a  ID(p) (p->fd.h).
07a0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
07b0: 4c 45 49 44 28 66 64 29 20 28 66 64 2e 68 29 0a  LEID(fd) (fd.h).
07c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
07e0: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
07f0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0800: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0810: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
0820: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
0830: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0840: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0880: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0890: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
08c0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
08d0: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0900: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0910: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
0920: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0930: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0940: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
0960: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
0970: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0980: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
09a0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
09b0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
09c0: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
09f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0a00: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0a10: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
0a20: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
0a30: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
0a40: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
0a70: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a80: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a90: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0ac0: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0ad0: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0ae0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b00: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0b10: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0b20: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0b50: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0b60: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0ba0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0bb0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0bc0: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0bd0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0c00: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0c10: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0c40: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0c50: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0c60: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c80: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c90: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0ca0: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0cb0: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0cc0: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0cd0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0ce0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cf0: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0d00: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0d10: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0d20: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0d50: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0d60: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d90: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0da0: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0db0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
0dd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74  urnal file and t
0de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
0df0: 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ill be.**       
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0e20: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0e30: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0e40: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0e50: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0e60: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
0e70: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0e80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e90: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0ea0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
0eb0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
0ec0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0ed0: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0ee0: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0ef0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0f00: 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  to PAGER_UNLOCK.
0f10: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0f20: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33  .** that sqlite3
0f30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
0f40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f60: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f70: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f80: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69   sqlite_page_wri
0f90: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0fa0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0fc0: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0fd0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0fe0: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0ff0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
1000: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
1010: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1020: 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ).** The transit
1030: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1040: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 77 68  LUSIVE occurs wh
1050: 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  en before any ch
1060: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
1070: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1080: 65 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61  e file.  After a
1090: 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  n sqlite3pager_r
10a0: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
10b0: 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d  sqlite_pager_com
10c0: 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61 74 65  mit(), the state
10d0: 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41   goes back to PA
10e0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23  GER_SHARED..*/.#
10f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c  define PAGER_UNL
1100: 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69  OCK      0.#defi
1110: 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ne PAGER_SHARED 
1120: 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65       1   /* same
1130: 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   as SHARED_LOCK 
1140: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1150: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20  _RESERVED    2  
1160: 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45   /* same as RESE
1170: 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  RVED_LOCK */.#de
1180: 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55  fine PAGER_EXCLU
1190: 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61  SIVE   4   /* sa
11a0: 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f  me as EXCLUSIVE_
11b0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
11c0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
11d0: 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68    5../*.** If th
11e0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
11f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72  SERVED_LOCK macr
1200: 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  o is set to true
1210: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1220: 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64  ,.** then failed
1230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74   attempts to get
1240: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1250: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
1260: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a   busy callback..
1270: 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62  ** This is off b
1280: 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73  y default.  To s
1290: 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72  ee why, consider
12a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
12b0: 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20  cenario:.** .** 
12c0: 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41  Suppose thread A
12d0: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73   already has a s
12e0: 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  hared lock and w
12f0: 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20  ants a reserved 
1300: 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20  lock..** Thread 
1310: 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  B already has a 
1320: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e  reserved lock an
1330: 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75  d wants an exclu
1340: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a  sive lock.  If.*
1350: 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61  * both threads a
1360: 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62  re using their b
1370: 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69  usy callbacks, i
1380: 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e  t might be a lon
1390: 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72  g time.** be for
13a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65   one of the thre
13b0: 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20  ads give up and 
13c0: 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72  allows the other
13d0: 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20   to proceed..** 
13e0: 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61  But if the threa
13f0: 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20  d trying to get 
1400: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
1410: 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b  k gives up quick
1420: 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76  ly.** (if it nev
1430: 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62  er invokes its b
1440: 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68  usy callback) th
1450: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f  en the contentio
1460: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73  n will be.** res
1470: 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a  olved quickly..*
1480: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1490: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14a0: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
14b0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14c0: 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a  D_LOCK 0.#endif.
14d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
14e0: 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20  o rounds values 
14f0: 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  up so that if th
1500: 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64  e value is an ad
1510: 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67  dress it.** is g
1520: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1530: 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20  an address that 
1540: 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e  is aligned to an
1550: 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
1560: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52  ..*/.#define FOR
1570: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20  CE_ALIGNMENT(X) 
1580: 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a    (((X)+7)&~7)..
1590: 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65  /*.** Each in-me
15a0: 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20  mory image of a 
15b0: 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68  page begins with
15c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
15d0: 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68  eader..** This h
15e0: 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69  eader is only vi
15f0: 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61  sible to this pa
1600: 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65  ger module.  The
1610: 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20   client.** code 
1620: 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72  that calls pager
1630: 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64   sees only the d
1640: 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1650: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1660: 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73  ** Client code s
1670: 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74  hould call sqlit
1680: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1690: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
16a0: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
16b0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
16c0: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
16d0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
16e0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16f0: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
1700: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
1710: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
1720: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1730: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1740: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
1750: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1760: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1770: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1780: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1790: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
17a0: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
17b0: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
17c0: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
17d0: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
17e0: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
17f0: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
1800: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1810: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
1820: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
1830: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
1840: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1850: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1860: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1870: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1880: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1890: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
18a0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67   when sqlite3pag
18b0: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
18c0: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
18d0: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
18e0: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
18f0: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1900: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1910: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1920: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
1930: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
1940: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
1950: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
1960: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1970: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1980: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
1990: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
19a0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
19d0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
1a00: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
1a10: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
1a20: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
1a30: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
1a40: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
1a50: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
1a60: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
1a70: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
1a80: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
1aa0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
1ab0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53  .  PgHdr *pNextS
1ac0: 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b  tmt, *pPrevStmt;
1ad0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
1ae0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
1af0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ent journal */. 
1b00: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
1b30: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
1b40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b50: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b70: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
1b80: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1b90: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1bd0: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1be0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1c10: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1c20: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1c30: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1c40: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1c50: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1c60: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1c70: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68  his page */.  sh
1c80: 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ort int nRef;   
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  Number of users 
1cb0: 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  of this page */.
1cc0: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20   /* Dirty pages 
1cf0: 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72 2e  sorted by PgHdr.
1d00: 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  pgno */.  /* pPa
1d10: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 62  ger->psAligned b
1d20: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
1d30: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
1d40: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1d50: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1d60: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1d70: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1d80: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1d90: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
1da0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
1db0: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
1dc0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
1dd0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
1de0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
1df0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
1e00: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
1e10: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
1e20: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
1e30: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e40: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
1e50: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
1e60: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
1e70: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
1e80: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
1e90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ea0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1eb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
1ec0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
1ed0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1ee0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
1ef0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
1f00: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
1f10: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
1f20: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
1f30: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
1f40: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
1f50: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
1f60: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
1f70: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
1f80: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
1f90: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
1fa0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
1fb0: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
1fc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1fd0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
1fe0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
1ff0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2000: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2010: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2020: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2030: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2040: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2050: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2060: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2070: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2080: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2090: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
20a0: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
20b0: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
20c0: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
20d0: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
20e0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
20f0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2100: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2110: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
2120: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
2130: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
2140: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2150: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
2160: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
2170: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
2180: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
2190: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
21a0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
21b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
21c0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
21d0: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
21e0: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
21f0: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
2200: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
2210: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2220: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
2230: 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  id*)&((char*)(&(
2240: 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73 41  G)[1]))[(P)->psA
2250: 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e 65  ligned]).#define
2260: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
2270: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
2280: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
2290: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
22a0: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73 41  [1]))[(PGR)->psA
22b0: 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e 45  ligned+(PGR)->nE
22c0: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  xtra])../*.** Ho
22d0: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
22e0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
22f0: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
2300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
2310: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
2320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50  ..*/.#define N_P
2330: 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a  G_HASH 2048../*.
2340: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
2350: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
2360: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
2370: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2380: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2390: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
23a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
23b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23c0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
23d0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68  uct Pager {.  ch
23e0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
23f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
2420: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2440: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2450: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2460: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
2470: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
2480: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
2490: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
24a0: 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64  s */.  OsFile fd
24b0: 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20  , jfd;          
24c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
24d0: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
24e0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
24f0: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64  */.  OsFile stfd
2500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2510: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2520: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
2530: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
2540: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2570: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2580: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2590: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
25a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
25b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
25c0: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
25d0: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
25e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
25f0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2600: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2610: 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73 74  in() */.  i64 st
2620: 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mtJSize;        
2630: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2640: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
2650: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
2660: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
2670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2680: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
2690: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
26a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
26b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
26c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
26d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
26e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
26f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
2700: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
2710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2720: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
2730: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2740: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
2770: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
2780: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2790: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
27a0: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
27b0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
27c0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
27d0: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
27e0: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
27f0: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
2800: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2810: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
2820: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2830: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2840: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2850: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2860: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 73  page */.  int ps
2870: 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20 20  Aligned;        
2880: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69 7a        /* pageSiz
2890: 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  e rounded up to 
28a0: 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 20  a multiple of 8 
28b0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
28e0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
28f0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
2900: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2910: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2920: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2930: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2940: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2950: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2960: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2970: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2980: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
29a0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
29b0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
29c0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
29d0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
29e0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
29f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2a00: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2a10: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ead/written */. 
2a20: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
2a30: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2a40: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2a50: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2a60: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2a70: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a90: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2aa0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
2ab0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2ac0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ad0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2ae0: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2af0: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2b00: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b20: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2b30: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2b40: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b60: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
2b70: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
2b80: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
2b90: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2ba0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2bc0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2bd0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2be0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2bf0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2c00: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2c10: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2c20: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2c30: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2c40: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2c50: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2c60: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2c70: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2ca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2cb0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2cc0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2cd0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2ce0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2cf0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2d00: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2d10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2d20: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2d30: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2d40: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2d50: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2d80: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2d90: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
2da0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2db0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2dc0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2dd0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2de0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2df0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2e00: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2e10: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2e20: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e40: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2e50: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2e60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2e70: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2e80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e90: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2ea0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2eb0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2ec0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2ed0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2ee0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2ef0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2f00: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f20: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2f30: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2f40: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f60: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f70: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
2f90: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
2fb0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2fc0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fd0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2fe0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2ff0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3000: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3010: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3020: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
3030: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3040: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3050: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
3060: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
3070: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
3080: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3090: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
30a0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
30b0: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
30c0: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
30d0: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
30e0: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
30f0: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3100: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3110: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3120: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3140: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
3150: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3160: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
3170: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3190: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
31a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
31b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
31c0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
31d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
31e0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
31f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3200: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3210: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3220: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3230: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3240: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3250: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3260: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3270: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
3280: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
3290: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e   started */.  in
32a0: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
32c0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
32d0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
32e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
32f0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3300: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3310: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3320: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d  er to PgHdr */.}
3330: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
3340: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
3350: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
3360: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
3370: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
3380: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
3390: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
33a0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
33b0: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
33c0: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
33d0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
33e0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
33f0: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
3400: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
3410: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
3420: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3430: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
3440: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
3450: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
3460: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
3470: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
3480: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
3490: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
34a0: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
34b0: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ve? */../*.** Jo
34c0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
34d0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
34e0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
34f0: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3500: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3510: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3520: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3530: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3540: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3550: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3560: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3570: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3580: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3590: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
35a0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
35b0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
35c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
35d0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
35e0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
35f0: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3600: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3610: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3620: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3630: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3640: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3650: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3660: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3670: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3680: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3690: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
36a0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
36b0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
36c0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
36d0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
36e0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
36f0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3700: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3710: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3720: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3730: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3740: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3750: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3760: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3770: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3780: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3790: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
37a0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
37b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
37c0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
37d0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
37e0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
37f0: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3800: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3810: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3820: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3830: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3840: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3850: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3860: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3870: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
3880: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
3890: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
38a0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
38b0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
38c0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
38d0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
38e0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
38f0: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3900: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3910: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3920: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3930: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3940: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3950: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3960: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3970: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
3980: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
3990: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
39a0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
39b0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
39c0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
39d0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
39e0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
39f0: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3a00: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3a10: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3a20: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3a40: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3a50: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3a60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
3a80: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
3a90: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
3aa0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
3ab0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
3ac0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
3ad0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3af0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3b00: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3b10: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3b20: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3b30: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3b40: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3b50: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3b60: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3b70: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
3b80: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3b90: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3ba0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3bb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3bc0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3bd0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3be0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3bf0: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3c00: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3c10: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3c20: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3c30: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3c40: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3c50: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3c60: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3c70: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3c80: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3c90: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3ca0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3cb0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3cc0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3cd0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3ce0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3cf0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3d00: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3d10: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3d20: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3d30: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3d40: 54 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65  The default size
3d50: 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f   of a disk secto
3d60: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  r.*/.#define PAG
3d70: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35  ER_SECTOR_SIZE 5
3d80: 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  12../*.** Page n
3d90: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
3da0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3db0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3dc0: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3dd0: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3de0: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3df0: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3e00: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3e10: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3e30: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3e40: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
3e50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
3e60: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
3e70: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
3e80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
3e90: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3ea0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3eb0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3ec0: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3ed0: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3ee0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3ef0: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3f00: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3f10: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3f20: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3f30: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3f40: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3f50: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
3f60: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
3f70: 31 29 0a 0a 2f 2a 0a 2a 2a 20 45 6e 61 62 6c 65  1)../*.** Enable
3f80: 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
3f90: 20 74 72 61 63 6b 69 6e 67 20 28 66 6f 72 20 64   tracking (for d
3fa0: 65 62 75 67 67 69 6e 67 29 20 68 65 72 65 3a 0a  ebugging) here:.
3fb0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
3fc0: 5f 44 45 42 55 47 0a 20 20 69 6e 74 20 70 61 67  _DEBUG.  int pag
3fd0: 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65 6e 61 62  er3_refinfo_enab
3fe0: 6c 65 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63  le = 0;.  static
3ff0: 20 76 6f 69 64 20 70 61 67 65 72 5f 72 65 66 69   void pager_refi
4000: 6e 66 6f 28 50 67 48 64 72 20 2a 70 29 7b 0a 20  nfo(PgHdr *p){. 
4010: 20 20 20 73 74 61 74 69 63 20 69 6e 74 20 63 6e     static int cn
4020: 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 21  t = 0;.    if( !
4030: 70 61 67 65 72 33 5f 72 65 66 69 6e 66 6f 5f 65  pager3_refinfo_e
4040: 6e 61 62 6c 65 20 29 20 72 65 74 75 72 6e 3b 0a  nable ) return;.
4050: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
4060: 50 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22  Printf(.       "
4070: 52 45 46 43 4e 54 3a 20 25 34 64 20 61 64 64 72  REFCNT: %4d addr
4080: 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e 22 2c 0a  =%p nRef=%d\n",.
4090: 20 20 20 20 20 20 20 70 2d 3e 70 67 6e 6f 2c 20         p->pgno, 
40a0: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29  PGHDR_TO_DATA(p)
40b0: 2c 20 70 2d 3e 6e 52 65 66 0a 20 20 20 20 29 3b  , p->nRef.    );
40c0: 0a 20 20 20 20 63 6e 74 2b 2b 3b 20 20 20 2f 2a  .    cnt++;   /*
40d0: 20 53 6f 6d 65 74 68 69 6e 67 20 74 6f 20 73 65   Something to se
40e0: 74 20 61 20 62 72 65 61 6b 70 6f 69 6e 74 20 6f  t a breakpoint o
40f0: 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64 65 66 69 6e  n */.  }.# defin
4100: 65 20 52 45 46 49 4e 46 4f 28 58 29 20 20 70 61  e REFINFO(X)  pa
4110: 67 65 72 5f 72 65 66 69 6e 66 6f 28 58 29 0a 23  ger_refinfo(X).#
4120: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 52 45  else.# define RE
4130: 46 49 4e 46 4f 28 58 29 0a 23 65 6e 64 69 66 0a  FINFO(X).#endif.
4140: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
4150: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 66 72 6f  -bit integer fro
4160: 6d 20 74 68 65 20 67 69 76 65 6e 20 66 69 6c 65  m the given file
4170: 20 64 65 73 63 72 69 70 74 6f 72 2e 20 20 53 74   descriptor.  St
4180: 6f 72 65 20 74 68 65 20 69 6e 74 65 67 65 72 0a  ore the integer.
4190: 2a 2a 20 74 68 61 74 20 69 73 20 72 65 61 64 20  ** that is read 
41a0: 69 6e 20 2a 70 52 65 73 2e 20 20 52 65 74 75 72  in *pRes.  Retur
41b0: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65  n SQLITE_OK if e
41c0: 76 65 72 79 74 68 69 6e 67 20 77 6f 72 6b 65 64  verything worked
41d0: 2c 20 6f 72 20 61 6e 0a 2a 2a 20 65 72 72 6f 72  , or an.** error
41e0: 20 63 6f 64 65 20 69 73 20 73 6f 6d 65 74 68 69   code is somethi
41f0: 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a  ng goes wrong..*
4200: 2a 0a 2a 2a 20 41 6c 6c 20 76 61 6c 75 65 73 20  *.** All values 
4210: 61 72 65 20 73 74 6f 72 65 64 20 6f 6e 20 64 69  are stored on di
4220: 73 6b 20 61 73 20 62 69 67 2d 65 6e 64 69 61 6e  sk as big-endian
4230: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4240: 72 65 61 64 33 32 62 69 74 73 28 4f 73 46 69 6c  read32bits(OsFil
4250: 65 20 2a 66 64 2c 20 75 33 32 20 2a 70 52 65 73  e *fd, u32 *pRes
4260: 29 7b 0a 20 20 75 33 32 20 72 65 73 3b 0a 20 20  ){.  u32 res;.  
4270: 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20 73  int rc;.  rc = s
4280: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 66 64 2c  qlite3OsRead(fd,
4290: 20 26 72 65 73 2c 20 73 69 7a 65 6f 66 28 72 65   &res, sizeof(re
42a0: 73 29 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53  s));.  if( rc==S
42b0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
42c0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 63  unsigned char ac
42d0: 5b 34 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  [4];.    memcpy(
42e0: 61 63 2c 20 26 72 65 73 2c 20 34 29 3b 0a 20 20  ac, &res, 4);.  
42f0: 20 20 72 65 73 20 3d 20 28 61 63 5b 30 5d 3c 3c    res = (ac[0]<<
4300: 32 34 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36  24) | (ac[1]<<16
4310: 29 20 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c  ) | (ac[2]<<8) |
4320: 20 61 63 5b 33 5d 3b 0a 20 20 7d 0a 20 20 2a 70   ac[3];.  }.  *p
4330: 52 65 73 20 3d 20 72 65 73 3b 0a 20 20 72 65 74  Res = res;.  ret
4340: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
4350: 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20   Write a 32-bit 
4360: 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68 65  integer into the
4370: 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63   given file desc
4380: 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e 20  riptor.  Return 
4390: 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e 20  SQLITE_OK.** on 
43a0: 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65 72  success or an er
43b0: 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d 65  ror code is some
43c0: 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67  thing goes wrong
43d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
43e0: 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46 69  write32bits(OsFi
43f0: 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c 29  le *fd, u32 val)
4400: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  {.  unsigned cha
4410: 72 20 61 63 5b 34 5d 3b 0a 20 20 61 63 5b 30 5d  r ac[4];.  ac[0]
4420: 20 3d 20 28 76 61 6c 3e 3e 32 34 29 20 26 20 30   = (val>>24) & 0
4430: 78 66 66 3b 0a 20 20 61 63 5b 31 5d 20 3d 20 28  xff;.  ac[1] = (
4440: 76 61 6c 3e 3e 31 36 29 20 26 20 30 78 66 66 3b  val>>16) & 0xff;
4450: 0a 20 20 61 63 5b 32 5d 20 3d 20 28 76 61 6c 3e  .  ac[2] = (val>
4460: 3e 38 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63  >8) & 0xff;.  ac
4470: 5b 33 5d 20 3d 20 76 61 6c 20 26 20 30 78 66 66  [3] = val & 0xff
4480: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
4490: 65 33 4f 73 57 72 69 74 65 28 66 64 2c 20 61 63  e3OsWrite(fd, ac
44a0: 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  , 4);.}../*.** W
44b0: 72 69 74 65 20 74 68 65 20 33 32 2d 62 69 74 20  rite the 32-bit 
44c0: 69 6e 74 65 67 65 72 20 27 76 61 6c 27 20 69 6e  integer 'val' in
44d0: 74 6f 20 74 68 65 20 70 61 67 65 20 69 64 65 6e  to the page iden
44e0: 74 69 66 69 65 64 20 62 79 20 70 61 67 65 20 68  tified by page h
44f0: 65 61 64 65 72 0a 2a 2a 20 27 70 27 20 61 74 20  eader.** 'p' at 
4500: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 2e  offset 'offset'.
4510: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
4520: 73 74 6f 72 65 33 32 62 69 74 73 28 75 33 32 20  store32bits(u32 
4530: 76 61 6c 2c 20 50 67 48 64 72 20 2a 70 2c 20 69  val, PgHdr *p, i
4540: 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75 6e  nt offset){.  un
4550: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63 3b  signed char *ac;
4560: 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69 67  .  ac = &((unsig
4570: 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52 5f  ned char*)PGHDR_
4580: 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66 73  TO_DATA(p))[offs
4590: 65 74 5d 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28  et];.  ac[0] = (
45a0: 76 61 6c 3e 3e 32 34 29 20 26 20 30 78 66 66 3b  val>>24) & 0xff;
45b0: 0a 20 20 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e  .  ac[1] = (val>
45c0: 3e 31 36 29 20 26 20 30 78 66 66 3b 0a 20 20 61  >16) & 0xff;.  a
45d0: 63 5b 32 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20  c[2] = (val>>8) 
45e0: 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20  & 0xff;.  ac[3] 
45f0: 3d 20 76 61 6c 20 26 20 30 78 66 66 3b 0a 7d 0a  = val & 0xff;.}.
4600: 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 33 32  ./*.** Read a 32
4610: 2d 62 69 74 20 69 6e 74 65 67 65 72 20 61 74 20  -bit integer at 
4620: 6f 66 66 73 65 74 20 27 6f 66 66 73 65 74 27 20  offset 'offset' 
4630: 66 72 6f 6d 20 74 68 65 20 70 61 67 65 20 69 64  from the page id
4640: 65 6e 74 69 66 69 65 64 20 62 79 0a 2a 2a 20 70  entified by.** p
4650: 61 67 65 20 68 65 61 64 65 72 20 27 70 27 2e 0a  age header 'p'..
4660: 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20 72 65  */.static u32 re
4670: 74 72 69 65 76 65 33 32 62 69 74 73 28 50 67 48  trieve32bits(PgH
4680: 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65  dr *p, int offse
4690: 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63  t){.  unsigned c
46a0: 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20  har *ac;.  ac = 
46b0: 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  &((unsigned char
46c0: 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  *)PGHDR_TO_DATA(
46d0: 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72  p))[offset];.  r
46e0: 65 74 75 72 6e 20 28 61 63 5b 30 5d 3c 3c 32 34  eturn (ac[0]<<24
46f0: 29 20 7c 20 28 61 63 5b 31 5d 3c 3c 31 36 29 20  ) | (ac[1]<<16) 
4700: 7c 20 28 61 63 5b 32 5d 3c 3c 38 29 20 7c 20 61  | (ac[2]<<8) | a
4710: 63 5b 33 5d 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  c[3];.}.../*.** 
4720: 43 6f 6e 76 65 72 74 20 74 68 65 20 62 69 74 73  Convert the bits
4730: 20 69 6e 20 74 68 65 20 70 50 61 67 65 72 2d 3e   in the pPager->
4740: 65 72 72 4d 61 73 6b 20 69 6e 74 6f 20 61 6e 20  errMask into an 
4750: 61 70 70 72 6f 70 72 61 74 65 0a 2a 2a 20 72 65  approprate.** re
4760: 74 75 72 6e 20 63 6f 64 65 2e 0a 2a 2f 0a 73 74  turn code..*/.st
4770: 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65  atic int pager_e
4780: 72 72 63 6f 64 65 28 50 61 67 65 72 20 2a 70 50  rrcode(Pager *pP
4790: 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 20  ager){.  int rc 
47a0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69  = SQLITE_OK;.  i
47b0: 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61  f( pPager->errMa
47c0: 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4c  sk & PAGER_ERR_L
47d0: 4f 43 4b 20 29 20 20 20 20 72 63 20 3d 20 53 51  OCK )    rc = SQ
47e0: 4c 49 54 45 5f 50 52 4f 54 4f 43 4f 4c 3b 0a 20  LITE_PROTOCOL;. 
47f0: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
4800: 4d 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52  Mask & PAGER_ERR
4810: 5f 44 49 53 4b 20 29 20 20 20 20 72 63 20 3d 20  _DISK )    rc = 
4820: 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20 20  SQLITE_IOERR;.  
4830: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
4840: 61 73 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f  ask & PAGER_ERR_
4850: 46 55 4c 4c 20 29 20 20 20 20 72 63 20 3d 20 53  FULL )    rc = S
4860: 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 69 66  QLITE_FULL;.  if
4870: 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
4880: 6b 20 26 20 50 41 47 45 52 5f 45 52 52 5f 4d 45  k & PAGER_ERR_ME
4890: 4d 20 29 20 20 20 20 20 72 63 20 3d 20 53 51 4c  M )     rc = SQL
48a0: 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 69 66 28  ITE_NOMEM;.  if(
48b0: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
48c0: 20 26 20 50 41 47 45 52 5f 45 52 52 5f 43 4f 52   & PAGER_ERR_COR
48d0: 52 55 50 54 20 29 20 72 63 20 3d 20 53 51 4c 49  RUPT ) rc = SQLI
48e0: 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 72 65  TE_CORRUPT;.  re
48f0: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
4900: 2a 20 57 68 65 6e 20 74 68 69 73 20 69 73 20 63  * When this is c
4910: 61 6c 6c 65 64 20 74 68 65 20 6a 6f 75 72 6e 61  alled the journa
4920: 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72  l file for pager
4930: 20 70 50 61 67 65 72 20 6d 75 73 74 20 62 65 20   pPager must be 
4940: 6f 70 65 6e 2e 0a 2a 2a 20 54 68 65 20 6d 61 73  open..** The mas
4950: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
4960: 20 6e 61 6d 65 20 69 73 20 72 65 61 64 20 66 72   name is read fr
4970: 6f 6d 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  om the end of th
4980: 65 20 66 69 6c 65 20 61 6e 64 20 0a 2a 2a 20 77  e file and .** w
4990: 72 69 74 74 65 6e 20 69 6e 74 6f 20 6d 65 6d 6f  ritten into memo
49a0: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
49b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 2e   sqliteMalloc().
49c0: 20 2a 70 7a 4d 61 73 74 65 72 20 69 73 0a 2a 2a   *pzMaster is.**
49d0: 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 61 74   set to point at
49e0: 20 74 68 65 20 6d 65 6d 6f 72 79 20 61 6e 64 20   the memory and 
49f0: 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e  SQLITE_OK return
4a00: 65 64 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 6d  ed. The caller m
4a10: 75 73 74 0a 2a 2a 20 73 71 6c 69 74 65 46 72 65  ust.** sqliteFre
4a20: 65 28 29 20 2a 70 7a 4d 61 73 74 65 72 2e 0a 2a  e() *pzMaster..*
4a30: 2a 0a 2a 2a 20 49 66 20 6e 6f 20 6d 61 73 74 65  *.** If no maste
4a40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6e  r journal file n
4a50: 61 6d 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ame is present *
4a60: 70 7a 4d 61 73 74 65 72 20 69 73 20 73 65 74 20  pzMaster is set 
4a70: 74 6f 20 30 20 61 6e 64 0a 2a 2a 20 53 51 4c 49  to 0 and.** SQLI
4a80: 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64 2e 0a  TE_OK returned..
4a90: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
4aa0: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
4ab0: 4f 73 46 69 6c 65 20 2a 70 4a 72 6e 6c 2c 20 63  OsFile *pJrnl, c
4ac0: 68 61 72 20 2a 2a 70 7a 4d 61 73 74 65 72 29 7b  har **pzMaster){
4ad0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 75 33 32  .  int rc;.  u32
4ae0: 20 6c 65 6e 3b 0a 20 20 69 36 34 20 73 7a 4a 3b   len;.  i64 szJ;
4af0: 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20  .  u32 cksum;.  
4b00: 69 6e 74 20 69 3b 0a 20 20 75 6e 73 69 67 6e 65  int i;.  unsigne
4b10: 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38 5d  d char aMagic[8]
4b20: 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74 6f  ; /* A buffer to
4b30: 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63 20   hold the magic 
4b40: 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 2a 70 7a  header */..  *pz
4b50: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 0a 20 20 72  Master = 0;..  r
4b60: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c  c = sqlite3OsFil
4b70: 65 53 69 7a 65 28 70 4a 72 6e 6c 2c 20 26 73 7a  eSize(pJrnl, &sz
4b80: 4a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  J);.  if( rc!=SQ
4b90: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 73 7a 4a 3c 31  LITE_OK || szJ<1
4ba0: 36 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  6 ) return rc;..
4bb0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
4bc0: 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d  Seek(pJrnl, szJ-
4bd0: 31 36 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  16);.  if( rc!=S
4be0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4bf0: 6e 20 72 63 3b 0a 20 0a 20 20 72 63 20 3d 20 72  n rc;. .  rc = r
4c00: 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e 6c 2c  ead32bits(pJrnl,
4c10: 20 26 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63   &len);.  if( rc
4c20: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
4c30: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
4c40: 20 72 65 61 64 33 32 62 69 74 73 28 70 4a 72 6e   read32bits(pJrn
4c50: 6c 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 69 66  l, &cksum);.  if
4c60: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
4c70: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
4c80: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
4c90: 61 64 28 70 4a 72 6e 6c 2c 20 61 4d 61 67 69 63  ad(pJrnl, aMagic
4ca0: 2c 20 38 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  , 8);.  if( rc!=
4cb0: 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6d 65 6d  SQLITE_OK || mem
4cc0: 63 6d 70 28 61 4d 61 67 69 63 2c 20 61 4a 6f 75  cmp(aMagic, aJou
4cd0: 72 6e 61 6c 4d 61 67 69 63 2c 20 38 29 20 29 20  rnalMagic, 8) ) 
4ce0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
4cf0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
4d00: 28 70 4a 72 6e 6c 2c 20 73 7a 4a 2d 31 36 2d 6c  (pJrnl, szJ-16-l
4d10: 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  en);.  if( rc!=S
4d20: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4d30: 6e 20 72 63 3b 0a 0a 20 20 2a 70 7a 4d 61 73 74  n rc;..  *pzMast
4d40: 65 72 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c  er = (char *)sql
4d50: 69 74 65 4d 61 6c 6c 6f 63 28 6c 65 6e 2b 31 29  iteMalloc(len+1)
4d60: 3b 0a 20 20 69 66 28 20 21 2a 70 7a 4d 61 73 74  ;.  if( !*pzMast
4d70: 65 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  er ){.    return
4d80: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
4d90: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
4da0: 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20 2a  3OsRead(pJrnl, *
4db0: 70 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b 0a  pzMaster, len);.
4dc0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
4dd0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
4de0: 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29  eFree(*pzMaster)
4df0: 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20  ;.    *pzMaster 
4e00: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
4e10: 72 63 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 65  rc;.  }..  /* Se
4e20: 65 20 69 66 20 74 68 65 20 63 68 65 63 6b 73 75  e if the checksu
4e30: 6d 20 6d 61 74 63 68 65 73 20 74 68 65 20 6d 61  m matches the ma
4e40: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d  ster journal nam
4e50: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
4e60: 69 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  i<len; i++){.   
4e70: 20 63 6b 73 75 6d 20 2d 3d 20 28 2a 70 7a 4d 61   cksum -= (*pzMa
4e80: 73 74 65 72 29 5b 69 5d 3b 0a 20 20 7d 0a 20 20  ster)[i];.  }.  
4e90: 69 66 28 20 63 6b 73 75 6d 20 29 7b 0a 20 20 20  if( cksum ){.   
4ea0: 20 2f 2a 20 49 66 20 74 68 65 20 63 68 65 63 6b   /* If the check
4eb0: 73 75 6d 20 64 6f 65 73 6e 27 74 20 61 64 64 20  sum doesn't add 
4ec0: 75 70 2c 20 74 68 65 6e 20 6f 6e 65 20 6f 72 20  up, then one or 
4ed0: 6d 6f 72 65 20 6f 66 20 74 68 65 20 64 69 73 6b  more of the disk
4ee0: 20 73 65 63 74 6f 72 73 0a 20 20 20 20 2a 2a 20   sectors.    ** 
4ef0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 6d  containing the m
4f00: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
4f10: 6c 65 6e 61 6d 65 20 69 73 20 63 6f 72 72 75 70  lename is corrup
4f20: 74 65 64 2e 20 54 68 69 73 20 6d 65 61 6e 73 0a  ted. This means.
4f30: 20 20 20 20 2a 2a 20 64 65 66 69 6e 69 74 65 6c      ** definitel
4f40: 79 20 72 6f 6c 6c 20 62 61 63 6b 2c 20 73 6f 20  y roll back, so 
4f50: 6a 75 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49  just return SQLI
4f60: 54 45 5f 4f 4b 20 61 6e 64 20 72 65 70 6f 72 74  TE_OK and report
4f70: 20 61 20 28 6e 75 6c 29 0a 20 20 20 20 2a 2a 20   a (nul).    ** 
4f80: 6d 61 73 74 65 72 2d 6a 6f 75 72 6e 61 6c 20 66  master-journal f
4f90: 69 6c 65 6e 61 6d 65 2e 0a 20 20 20 20 2a 2f 0a  ilename..    */.
4fa0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
4fb0: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
4fc0: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
4fd0: 7d 65 6c 73 65 7b 0a 20 20 20 20 28 2a 70 7a 4d  }else{.    (*pzM
4fe0: 61 73 74 65 72 29 5b 6c 65 6e 5d 20 3d 20 27 5c  aster)[len] = '\
4ff0: 30 27 3b 0a 20 20 7d 0a 20 20 20 0a 20 20 72 65  0';.  }.   .  re
5000: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
5010: 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 65 6b 20 74 68  }../*.** Seek th
5020: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  e journal file d
5030: 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74 68 65  escriptor to the
5040: 20 6e 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75   next sector bou
5050: 6e 64 61 72 79 20 77 68 65 72 65 20 61 0a 2a 2a  ndary where a.**
5060: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5070: 6d 61 79 20 62 65 20 72 65 61 64 20 6f 72 20 77  may be read or w
5080: 72 69 74 74 65 6e 2e 20 50 61 67 65 72 2e 6a 6f  ritten. Pager.jo
5090: 75 72 6e 61 6c 4f 66 66 20 69 73 20 75 70 64 61  urnalOff is upda
50a0: 74 65 64 20 77 69 74 68 0a 2a 2a 20 74 68 65 20  ted with.** the 
50b0: 6e 65 77 20 73 65 65 6b 20 6f 66 66 73 65 74 2e  new seek offset.
50c0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 20 66 6f 72 20 61  .**.** i.e for a
50d0: 20 73 65 63 74 6f 72 20 73 69 7a 65 20 6f 66 20   sector size of 
50e0: 35 31 32 3a 0a 2a 2a 0a 2a 2a 20 49 6e 70 75 74  512:.**.** Input
50f0: 20 4f 66 66 73 65 74 20 20 20 20 20 20 20 20 20   Offset         
5100: 20 20 20 20 20 4f 75 74 70 75 74 20 4f 66 66 73       Output Offs
5110: 65 74 0a 2a 2a 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  et.** ----------
5120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 2a 2a  -------------.**
5140: 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20   0              
5150: 20 20 20 20 20 20 20 20 20 20 20 30 0a 2a 2a 20             0.** 
5160: 35 31 32 20 20 20 20 20 20 20 20 20 20 20 20 20  512             
5170: 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a 2a            512.**
5180: 20 31 30 30 20 20 20 20 20 20 20 20 20 20 20 20   100            
5190: 20 20 20 20 20 20 20 20 20 20 20 35 31 32 0a 2a             512.*
51a0: 2a 20 32 30 30 30 20 20 20 20 20 20 20 20 20 20  * 2000          
51b0: 20 20 20 20 20 20 20 20 20 20 20 20 32 30 34 38              2048
51c0: 0a 2a 2a 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  .** .*/.static i
51d0: 6e 74 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64  nt seekJournalHd
51e0: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  r(Pager *pPager)
51f0: 7b 0a 20 20 69 36 34 20 6f 66 66 73 65 74 20 3d  {.  i64 offset =
5200: 20 30 3b 0a 20 20 69 36 34 20 63 20 3d 20 70 50   0;.  i64 c = pP
5210: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
5220: 3b 0a 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20  ;.  if( c ){.   
5230: 20 6f 66 66 73 65 74 20 3d 20 28 28 63 2d 31 29   offset = ((c-1)
5240: 2f 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  /JOURNAL_HDR_SZ(
5250: 70 50 61 67 65 72 29 20 2b 20 31 29 20 2a 20 4a  pPager) + 1) * J
5260: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5270: 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 61 73 73  ager);.  }.  ass
5280: 65 72 74 28 20 6f 66 66 73 65 74 25 4a 4f 55 52  ert( offset%JOUR
5290: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
52a0: 72 29 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  r)==0 );.  asser
52b0: 74 28 20 6f 66 66 73 65 74 3e 3d 63 20 29 3b 0a  t( offset>=c );.
52c0: 20 20 61 73 73 65 72 74 28 20 28 6f 66 66 73 65    assert( (offse
52d0: 74 2d 63 29 3c 4a 4f 55 52 4e 41 4c 5f 48 44 52  t-c)<JOURNAL_HDR
52e0: 5f 53 5a 28 70 50 61 67 65 72 29 20 29 3b 0a 20  _SZ(pPager) );. 
52f0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5300: 4f 66 66 20 3d 20 6f 66 66 73 65 74 3b 0a 20 20  Off = offset;.  
5310: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73  return sqlite3Os
5320: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
5330: 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
5340: 61 6c 4f 66 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  alOff);.}../*.**
5350: 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   The journal fil
5360: 65 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 20 77  e must be open w
5370: 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
5380: 20 69 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f   is called. A jo
5390: 75 72 6e 61 6c 0a 2a 2a 20 68 65 61 64 65 72 20  urnal.** header 
53a0: 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20  (JOURNAL_HDR_SZ 
53b0: 62 79 74 65 73 29 20 69 73 20 77 72 69 74 74 65  bytes) is writte
53c0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
53d0: 61 6c 20 66 69 6c 65 20 61 74 20 74 68 65 0a 2a  al file at the.*
53e0: 2a 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69  * current locati
53f0: 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6f  on..**.** The fo
5400: 72 6d 61 74 20 66 6f 72 20 74 68 65 20 6a 6f 75  rmat for the jou
5410: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 61  rnal header is a
5420: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 2d 20  s follows:.** - 
5430: 38 20 62 79 74 65 73 3a 20 4d 61 67 69 63 20 69  8 bytes: Magic i
5440: 64 65 6e 74 69 66 79 69 6e 67 20 6a 6f 75 72 6e  dentifying journ
5450: 61 6c 20 66 6f 72 6d 61 74 2e 0a 2a 2a 20 2d 20  al format..** - 
5460: 34 20 62 79 74 65 73 3a 20 4e 75 6d 62 65 72 20  4 bytes: Number 
5470: 6f 66 20 72 65 63 6f 72 64 73 20 69 6e 20 6a 6f  of records in jo
5480: 75 72 6e 61 6c 2c 20 6f 72 20 2d 31 20 6e 6f 2d  urnal, or -1 no-
5490: 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 6f 6e 2e  sync mode is on.
54a0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 52  .** - 4 bytes: R
54b0: 61 6e 64 6f 6d 20 6e 75 6d 62 65 72 20 75 73 65  andom number use
54c0: 64 20 66 6f 72 20 70 61 67 65 20 68 61 73 68 2e  d for page hash.
54d0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 49  .** - 4 bytes: I
54e0: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
54f0: 70 61 67 65 20 63 6f 75 6e 74 2e 0a 2a 2a 20 2d  page count..** -
5500: 20 34 20 62 79 74 65 73 3a 20 53 65 63 74 6f 72   4 bytes: Sector
5510: 20 73 69 7a 65 20 75 73 65 64 20 62 79 20 74 68   size used by th
5520: 65 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 77  e process that w
5530: 72 6f 74 65 20 74 68 69 73 20 6a 6f 75 72 6e 61  rote this journa
5540: 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46 6f 6c 6c 6f 77  l..** .** Follow
5550: 65 64 20 62 79 20 28 4a 4f 55 52 4e 41 4c 5f 48  ed by (JOURNAL_H
5560: 44 52 5f 53 5a 20 2d 20 32 34 29 20 62 79 74 65  DR_SZ - 24) byte
5570: 73 20 6f 66 20 75 6e 75 73 65 64 20 73 70 61 63  s of unused spac
5580: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
5590: 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72   writeJournalHdr
55a0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
55b0: 0a 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 65 65  ..  int rc = see
55c0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
55d0: 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  er);.  if( rc ) 
55e0: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50  return rc;..  pP
55f0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72  ager->journalHdr
5600: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
5610: 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 70 50 61  alOff;.  if( pPa
5620: 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3d  ger->stmtHdrOff=
5630: 3d 30 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  =0 ){.    pPager
5640: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 70  ->stmtHdrOff = p
5650: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 48 64  Pager->journalHd
5660: 72 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  r;.  }.  pPager-
5670: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a  >journalOff += J
5680: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
5690: 61 67 65 72 29 3b 0a 0a 20 20 2f 2a 20 46 49 58  ager);..  /* FIX
56a0: 20 4d 45 3a 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20   ME: .  **.  ** 
56b0: 50 6f 73 73 69 62 6c 79 20 66 6f 72 20 61 20 70  Possibly for a p
56c0: 61 67 65 72 20 6e 6f 74 20 69 6e 20 6e 6f 2d 73  ager not in no-s
56d0: 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65 20 6a 6f  ync mode, the jo
56e0: 75 72 6e 61 6c 20 6d 61 67 69 63 20 73 68 6f 75  urnal magic shou
56f0: 6c 64 20 6e 6f 74 0a 20 20 2a 2a 20 62 65 20 77  ld not.  ** be w
5700: 72 69 74 74 65 6e 20 75 6e 74 69 6c 20 6e 52 65  ritten until nRe
5710: 63 20 69 73 20 66 69 6c 6c 65 64 20 69 6e 20 61  c is filled in a
5720: 73 20 70 61 72 74 20 6f 66 20 6e 65 78 74 20 73  s part of next s
5730: 79 6e 63 4a 6f 75 72 6e 61 6c 28 29 2e 20 0a 20  yncJournal(). . 
5740: 20 2a 2a 0a 20 20 2a 2a 20 41 63 74 75 61 6c 6c   **.  ** Actuall
5750: 79 20 6d 61 79 62 65 20 74 68 65 20 77 68 6f 6c  y maybe the whol
5760: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
5770: 20 73 68 6f 75 6c 64 20 62 65 20 64 65 6c 61 79   should be delay
5780: 65 64 20 75 6e 74 69 6c 20 74 68 61 74 0a 20 20  ed until that.  
5790: 2a 2a 20 70 6f 69 6e 74 2e 20 54 68 69 6e 6b 20  ** point. Think 
57a0: 61 62 6f 75 74 20 74 68 69 73 2e 0a 20 20 2a 2f  about this..  */
57b0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
57c0: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
57d0: 6a 66 64 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  jfd, aJournalMag
57e0: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72  ic, sizeof(aJour
57f0: 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 0a 20 20 69  nalMagic));..  i
5800: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5810: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 6e   ){.    /* The n
5820: 52 65 63 20 46 69 65 6c 64 2e 20 30 78 46 46 46  Rec Field. 0xFFF
5830: 46 46 46 46 46 20 66 6f 72 20 6e 6f 2d 73 79 6e  FFFFF for no-syn
5840: 63 20 6a 6f 75 72 6e 61 6c 73 2e 20 2a 2f 0a 20  c journals. */. 
5850: 20 20 20 72 63 20 3d 20 77 72 69 74 65 33 32 62     rc = write32b
5860: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
5870: 2c 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63  , pPager->noSync
5880: 20 3f 20 30 78 66 66 66 66 66 66 66 66 20 3a 20   ? 0xffffffff : 
5890: 30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63  0);.  }.  if( rc
58a0: 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
58b0: 20 20 20 2f 2a 20 54 68 65 20 72 61 6e 64 6f 6d     /* The random
58c0: 20 63 68 65 63 6b 2d 68 61 73 68 20 69 6e 69 74   check-hash init
58d0: 69 61 6c 69 73 65 72 20 2a 2f 20 0a 20 20 20 20  ialiser */ .    
58e0: 73 71 6c 69 74 65 33 52 61 6e 64 6f 6d 6e 65 73  sqlite3Randomnes
58f0: 73 28 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d  s(sizeof(pPager-
5900: 3e 63 6b 73 75 6d 49 6e 69 74 29 2c 20 26 70 50  >cksumInit), &pP
5910: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
5920: 3b 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65  ;.    rc = write
5930: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
5940: 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73  jfd, pPager->cks
5950: 75 6d 49 6e 69 74 29 3b 0a 20 20 7d 0a 20 20 69  umInit);.  }.  i
5960: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
5970: 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 69   ){.    /* The i
5980: 6e 69 74 69 61 6c 20 64 61 74 61 62 61 73 65 20  nitial database 
5990: 73 69 7a 65 20 2a 2f 0a 20 20 20 20 72 63 20 3d  size */.    rc =
59a0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
59b0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
59c0: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 7d 0a  r->dbSize);.  }.
59d0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
59e0: 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  _OK ){.    /* Th
59f0: 65 20 61 73 73 75 6d 65 64 20 73 65 63 74 6f 72  e assumed sector
5a00: 20 73 69 7a 65 20 66 6f 72 20 74 68 69 73 20 70   size for this p
5a10: 72 6f 63 65 73 73 20 2a 2f 0a 20 20 20 20 72 63  rocess */.    rc
5a20: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
5a30: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61  pPager->jfd, pPa
5a40: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
5a50: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20  ;.  }..  /* The 
5a60: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 68  journal header h
5a70: 61 73 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  as been written 
5a80: 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 20 53 65  successfully. Se
5a90: 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  ek the journal. 
5aa0: 20 2a 2a 20 66 69 6c 65 20 64 65 73 63 72 69 70   ** file descrip
5ab0: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
5ac0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
5ad0: 61 64 65 72 20 73 65 63 74 6f 72 2e 0a 20 20 2a  ader sector..  *
5ae0: 2f 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  /.  if( rc==SQLI
5af0: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
5b00: 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67  ite3OsSeek(&pPag
5b10: 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d  er->jfd, pPager-
5b20: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 3b 0a  >journalOff-1);.
5b30: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
5b40: 4f 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d  OsWrite(&pPager-
5b50: 3e 6a 66 64 2c 20 22 5c 30 30 30 22 2c 20 31 29  >jfd, "\000", 1)
5b60: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
5b70: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  c;.}../*.** The 
5b80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73  journal file mus
5b90: 74 20 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74  t be open when t
5ba0: 68 69 73 20 69 73 20 63 61 6c 6c 65 64 2e 20 41  his is called. A
5bb0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
5bc0: 66 69 6c 65 0a 2a 2a 20 28 4a 4f 55 52 4e 41 4c  file.** (JOURNAL
5bd0: 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20 69  _HDR_SZ bytes) i
5be0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
5bf0: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
5c00: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a   in the journal.
5c10: 2a 2a 20 66 69 6c 65 2e 20 53 65 65 20 63 6f 6d  ** file. See com
5c20: 6d 65 6e 74 73 20 61 62 6f 76 65 20 66 75 6e 63  ments above func
5c30: 74 69 6f 6e 20 77 72 69 74 65 4a 6f 75 72 6e 61  tion writeJourna
5c40: 6c 48 64 72 28 29 20 66 6f 72 20 61 20 64 65 73  lHdr() for a des
5c50: 63 72 69 70 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74  cription of.** t
5c60: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5c70: 72 20 66 6f 72 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20  r format..**.** 
5c80: 49 66 20 74 68 65 20 68 65 61 64 65 72 20 69 73  If the header is
5c90: 20 72 65 61 64 20 73 75 63 63 65 73 73 66 75 6c   read successful
5ca0: 6c 79 2c 20 2a 6e 52 65 63 20 69 73 20 73 65 74  ly, *nRec is set
5cb0: 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
5cc0: 66 0a 2a 2a 20 70 61 67 65 20 72 65 63 6f 72 64  f.** page record
5cd0: 73 20 66 6f 6c 6c 6f 77 69 6e 67 20 74 68 69 73  s following this
5ce0: 20 68 65 61 64 65 72 20 61 6e 64 20 2a 64 62 53   header and *dbS
5cf0: 69 7a 65 20 69 73 20 73 65 74 20 74 6f 20 74 68  ize is set to th
5d00: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a  e size of the.**
5d10: 20 64 61 74 61 62 61 73 65 20 62 65 66 6f 72 65   database before
5d20: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
5d30: 20 62 65 67 61 6e 2c 20 69 6e 20 70 61 67 65 73   began, in pages
5d40: 2e 20 41 6c 73 6f 2c 20 70 50 61 67 65 72 2d 3e  . Also, pPager->
5d50: 63 6b 73 75 6d 49 6e 69 74 0a 2a 2a 20 69 73 20  cksumInit.** is 
5d60: 73 65 74 20 74 6f 20 74 68 65 20 76 61 6c 75 65  set to the value
5d70: 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a   read from the j
5d80: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 2e 20 53  ournal header. S
5d90: 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
5da0: 72 6e 65 64 0a 2a 2a 20 69 6e 20 74 68 69 73 20  rned.** in this 
5db0: 63 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  case..**.** If t
5dc0: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
5dd0: 72 20 66 69 6c 65 20 61 70 70 65 61 72 73 20 74  r file appears t
5de0: 6f 20 62 65 20 63 6f 72 72 75 70 74 65 64 2c 20  o be corrupted, 
5df0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 69 73 0a 2a  SQLITE_DONE is.*
5e00: 2a 20 72 65 74 75 72 6e 65 64 20 61 6e 64 20 2a  * returned and *
5e10: 6e 52 65 63 20 61 6e 64 20 2a 64 62 53 69 7a 65  nRec and *dbSize
5e20: 20 61 72 65 20 6e 6f 74 20 73 65 74 2e 20 20 49   are not set.  I
5e30: 66 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  f JOURNAL_HDR_SZ
5e40: 20 62 79 74 65 73 0a 2a 2a 20 63 61 6e 6e 6f 74   bytes.** cannot
5e50: 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74 68   be read from th
5e60: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61  e journal file a
5e70: 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20  n error code is 
5e80: 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61  returned..*/.sta
5e90: 74 69 63 20 69 6e 74 20 72 65 61 64 4a 6f 75 72  tic int readJour
5ea0: 6e 61 6c 48 64 72 28 0a 20 20 50 61 67 65 72 20  nalHdr(.  Pager 
5eb0: 2a 70 50 61 67 65 72 2c 20 0a 20 20 69 36 34 20  *pPager, .  i64 
5ec0: 6a 6f 75 72 6e 61 6c 53 69 7a 65 2c 0a 20 20 75  journalSize,.  u
5ed0: 33 32 20 2a 70 4e 52 65 63 2c 20 0a 20 20 75 33  32 *pNRec, .  u3
5ee0: 32 20 2a 70 44 62 53 69 7a 65 0a 29 7b 0a 20 20  2 *pDbSize.){.  
5ef0: 69 6e 74 20 72 63 3b 0a 20 20 75 6e 73 69 67 6e  int rc;.  unsign
5f00: 65 64 20 63 68 61 72 20 61 4d 61 67 69 63 5b 38  ed char aMagic[8
5f10: 5d 3b 20 2f 2a 20 41 20 62 75 66 66 65 72 20 74  ]; /* A buffer t
5f20: 6f 20 68 6f 6c 64 20 74 68 65 20 6d 61 67 69 63  o hold the magic
5f30: 20 68 65 61 64 65 72 20 2a 2f 0a 0a 20 20 72 63   header */..  rc
5f40: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
5f50: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
5f60: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
5f70: 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ..  if( pPager->
5f80: 6a 6f 75 72 6e 61 6c 4f 66 66 2b 4a 4f 55 52 4e  journalOff+JOURN
5f90: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
5fa0: 29 20 3e 20 6a 6f 75 72 6e 61 6c 53 69 7a 65 20  ) > journalSize 
5fb0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
5fc0: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 0a  LITE_DONE;.  }..
5fd0: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
5fe0: 52 65 61 64 28 26 70 50 61 67 65 72 2d 3e 6a 66  Read(&pPager->jf
5ff0: 64 2c 20 61 4d 61 67 69 63 2c 20 73 69 7a 65 6f  d, aMagic, sizeo
6000: 66 28 61 4d 61 67 69 63 29 29 3b 0a 20 20 69 66  f(aMagic));.  if
6010: 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
6020: 3b 0a 0a 20 20 69 66 28 20 6d 65 6d 63 6d 70 28  ;..  if( memcmp(
6030: 61 4d 61 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c  aMagic, aJournal
6040: 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d  Magic, sizeof(aM
6050: 61 67 69 63 29 29 21 3d 30 20 29 7b 0a 20 20 20  agic))!=0 ){.   
6060: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44   return SQLITE_D
6070: 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d  ONE;.  }..  rc =
6080: 20 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61   read32bits(&pPa
6090: 67 65 72 2d 3e 6a 66 64 2c 20 70 4e 52 65 63 29  ger->jfd, pNRec)
60a0: 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74  ;.  if( rc ) ret
60b0: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
60c0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
60d0: 65 72 2d 3e 6a 66 64 2c 20 26 70 50 61 67 65 72  er->jfd, &pPager
60e0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20  ->cksumInit);.  
60f0: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
6100: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64  rc;..  rc = read
6110: 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e  32bits(&pPager->
6120: 6a 66 64 2c 20 70 44 62 53 69 7a 65 29 3b 0a 20  jfd, pDbSize);. 
6130: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
6140: 20 72 63 3b 0a 0a 20 20 2f 2a 20 55 70 64 61 74   rc;..  /* Updat
6150: 65 20 74 68 65 20 61 73 73 75 6d 65 64 20 73 65  e the assumed se
6160: 63 74 6f 72 2d 73 69 7a 65 20 74 6f 20 6d 61 74  ctor-size to mat
6170: 63 68 20 74 68 65 20 76 61 6c 75 65 20 75 73 65  ch the value use
6180: 64 20 62 79 20 0a 20 20 2a 2a 20 74 68 65 20 70  d by .  ** the p
6190: 72 6f 63 65 73 73 20 74 68 61 74 20 63 72 65 61  rocess that crea
61a0: 74 65 64 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c  ted this journal
61b0: 2e 20 49 66 20 74 68 69 73 20 6a 6f 75 72 6e 61  . If this journa
61c0: 6c 20 77 61 73 0a 20 20 2a 2a 20 63 72 65 61 74  l was.  ** creat
61d0: 65 64 20 62 79 20 61 20 70 72 6f 63 65 73 73 20  ed by a process 
61e0: 6f 74 68 65 72 20 74 68 61 6e 20 74 68 69 73 20  other than this 
61f0: 6f 6e 65 2c 20 74 68 65 6e 20 74 68 69 73 20 72  one, then this r
6200: 6f 75 74 69 6e 65 0a 20 20 2a 2a 20 69 73 20 62  outine.  ** is b
6210: 65 69 6e 67 20 63 61 6c 6c 65 64 20 66 72 6f 6d  eing called from
6220: 20 77 69 74 68 69 6e 20 70 61 67 65 72 5f 70 6c   within pager_pl
6230: 61 79 62 61 63 6b 28 29 2e 20 54 68 65 20 6c 6f  ayback(). The lo
6240: 63 61 6c 20 76 61 6c 75 65 0a 20 20 2a 2a 20 6f  cal value.  ** o
6250: 66 20 50 61 67 65 72 2e 73 65 63 74 6f 72 53 69  f Pager.sectorSi
6260: 7a 65 20 69 73 20 72 65 73 74 6f 72 65 64 20 61  ze is restored a
6270: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 61  t the end of tha
6280: 74 20 72 6f 75 74 69 6e 65 2e 0a 20 20 2a 2f 0a  t routine..  */.
6290: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
62a0: 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  s(&pPager->jfd, 
62b0: 28 75 33 32 20 2a 29 26 70 50 61 67 65 72 2d 3e  (u32 *)&pPager->
62c0: 73 65 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 69  sectorSize);.  i
62d0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
62e0: 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  c;..  pPager->jo
62f0: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52  urnalOff += JOUR
6300: 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65  NAL_HDR_SZ(pPage
6310: 72 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  r);.  rc = sqlit
6320: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
6330: 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
6340: 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 72 65  ournalOff);.  re
6350: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a  turn rc;.}.../*.
6360: 2a 2a 20 57 72 69 74 65 20 74 68 65 20 73 75 70  ** Write the sup
6370: 70 6c 69 65 64 20 6d 61 73 74 65 72 20 6a 6f 75  plied master jou
6380: 72 6e 61 6c 20 6e 61 6d 65 20 69 6e 74 6f 20 74  rnal name into t
6390: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
63a0: 66 6f 72 20 70 61 67 65 72 0a 2a 2a 20 70 50 61  for pager.** pPa
63b0: 67 65 72 20 61 74 20 74 68 65 20 63 75 72 72 65  ger at the curre
63c0: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 65  nt location. The
63d0: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
63e0: 6e 61 6d 65 20 6d 75 73 74 20 62 65 20 74 68 65  name must be the
63f0: 20 6c 61 73 74 0a 2a 2a 20 74 68 69 6e 67 20 77   last.** thing w
6400: 72 69 74 74 65 6e 20 74 6f 20 61 20 6a 6f 75 72  ritten to a jour
6410: 6e 61 6c 20 66 69 6c 65 2e 20 49 66 20 74 68 65  nal file. If the
6420: 20 70 61 67 65 72 20 69 73 20 69 6e 20 66 75 6c   pager is in ful
6430: 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 74 68 65  l-sync mode, the
6440: 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  .** journal file
6450: 20 64 65 73 63 72 69 70 74 6f 72 20 69 73 20 61   descriptor is a
6460: 64 76 61 6e 63 65 64 20 74 6f 20 74 68 65 20 6e  dvanced to the n
6470: 65 78 74 20 73 65 63 74 6f 72 20 62 6f 75 6e 64  ext sector bound
6480: 61 72 79 20 62 65 66 6f 72 65 0a 2a 2a 20 61 6e  ary before.** an
6490: 79 74 68 69 6e 67 20 69 73 20 77 72 69 74 74 65  ything is writte
64a0: 6e 2e 20 54 68 65 20 66 6f 72 6d 61 74 20 69 73  n. The format is
64b0: 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34 20 62 79 74 65  :.**.** + 4 byte
64c0: 73 3a 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  s: PAGER_MJ_PGNO
64d0: 2e 0a 2a 2a 20 2b 20 4e 20 62 79 74 65 73 3a 20  ..** + N bytes: 
64e0: 6c 65 6e 67 74 68 20 6f 66 20 6d 61 73 74 65 72  length of master
64f0: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a   journal name..*
6500: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4e 0a 2a  * + 4 bytes: N.*
6510: 2a 20 2b 20 34 20 62 79 74 65 73 3a 20 4d 61 73  * + 4 bytes: Mas
6520: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6530: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 2b 20   checksum..** + 
6540: 38 20 62 79 74 65 73 3a 20 61 4a 6f 75 72 6e 61  8 bytes: aJourna
6550: 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a 0a 2a 2a 20  lMagic[]..**.** 
6560: 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  The master journ
6570: 61 6c 20 70 61 67 65 20 63 68 65 63 6b 73 75 6d  al page checksum
6580: 20 69 73 20 74 68 65 20 73 75 6d 20 6f 66 20 74   is the sum of t
6590: 68 65 20 62 79 74 65 73 20 69 6e 20 74 68 65 20  he bytes in the 
65a0: 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61  master.** journa
65b0: 6c 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  l name..*/.stati
65c0: 63 20 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65  c int writeMaste
65d0: 72 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a  rJournal(Pager *
65e0: 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
65f0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
6600: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65  int rc;.  int le
6610: 6e 3b 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20  n; .  int i; .  
6620: 75 33 32 20 63 6b 73 75 6d 20 3d 20 30 3b 20 0a  u32 cksum = 0; .
6630: 0a 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 20  .  if( !zMaster 
6640: 7c 7c 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  || pPager->setMa
6650: 73 74 65 72 29 20 72 65 74 75 72 6e 20 53 51 4c  ster) return SQL
6660: 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61 67 65 72  ITE_OK;.  pPager
6670: 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 31 3b  ->setMaster = 1;
6680: 0a 0a 20 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  ..  len = strlen
6690: 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 66 6f 72  (zMaster);.  for
66a0: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
66b0: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20  ){.    cksum += 
66c0: 7a 4d 61 73 74 65 72 5b 69 5d 3b 0a 20 20 7d 0a  zMaster[i];.  }.
66d0: 0a 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c  .  /* If in full
66e0: 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 61 64 76 61  -sync mode, adva
66f0: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
6700: 64 69 73 6b 20 73 65 63 74 6f 72 20 62 65 66 6f  disk sector befo
6710: 72 65 20 77 72 69 74 69 6e 67 0a 20 20 2a 2a 20  re writing.  ** 
6720: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6730: 61 6c 20 6e 61 6d 65 2e 20 54 68 69 73 20 69 73  al name. This is
6740: 20 69 6e 20 63 61 73 65 20 74 68 65 20 70 72 65   in case the pre
6750: 76 69 6f 75 73 20 70 61 67 65 20 77 72 69 74 74  vious page writt
6760: 65 6e 20 74 6f 0a 20 20 2a 2a 20 74 68 65 20 6a  en to.  ** the j
6770: 6f 75 72 6e 61 6c 20 68 61 73 20 61 6c 72 65 61  ournal has alrea
6780: 64 79 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 0a  dy been synced..
6790: 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65    */.  if( pPage
67a0: 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20  r->fullSync ){. 
67b0: 20 20 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72     rc = seekJour
67c0: 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a  nalHdr(pPager);.
67d0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
67e0: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
67f0: 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  c;.  }.  pPager-
6800: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 28  >journalOff += (
6810: 6c 65 6e 2b 32 30 29 3b 0a 0a 20 20 72 63 20 3d  len+20);..  rc =
6820: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
6830: 61 67 65 72 2d 3e 6a 66 64 2c 20 50 41 47 45 52  ager->jfd, PAGER
6840: 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29  _MJ_PGNO(pPager)
6850: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
6860: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
6870: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
6880: 74 65 33 4f 73 57 72 69 74 65 28 26 70 50 61 67  te3OsWrite(&pPag
6890: 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73 74 65 72  er->jfd, zMaster
68a0: 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63  , len);.  if( rc
68b0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
68c0: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d  turn rc;..  rc =
68d0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
68e0: 61 67 65 72 2d 3e 6a 66 64 2c 20 6c 65 6e 29 3b  ager->jfd, len);
68f0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6900: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6910: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6920: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6930: 66 64 2c 20 63 6b 73 75 6d 29 3b 0a 20 20 69 66  fd, cksum);.  if
6940: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6950: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6960: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
6970: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
6980: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6990: 20 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c   sizeof(aJournal
69a0: 4d 61 67 69 63 29 29 3b 0a 20 20 70 50 61 67 65  Magic));.  pPage
69b0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
69c0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
69d0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 6f 72 20 72 65  ./*.** Add or re
69e0: 6d 6f 76 65 20 61 20 70 61 67 65 20 66 72 6f 6d  move a page from
69f0: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c   the list of all
6a00: 20 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20   pages that are 
6a10: 69 6e 20 74 68 65 0a 2a 2a 20 73 74 61 74 65 6d  in the.** statem
6a20: 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  ent journal..**.
6a30: 2a 2a 20 54 68 65 20 50 61 67 65 72 20 6b 65 65  ** The Pager kee
6a40: 70 73 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  ps a separate li
6a50: 73 74 20 6f 66 20 70 61 67 65 73 20 74 68 61 74  st of pages that
6a60: 20 61 72 65 20 63 75 72 72 65 6e 74 6c 79 20 69   are currently i
6a70: 6e 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 6d 65  n.** the stateme
6a80: 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 69  nt journal.  Thi
6a90: 73 20 68 65 6c 70 73 20 74 68 65 20 73 71 6c 69  s helps the sqli
6aa0: 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
6ab0: 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75 74 69 6e  mmit().** routin
6ac0: 65 20 72 75 6e 20 4d 55 43 48 20 66 61 73 74 65  e run MUCH faste
6ad0: 72 20 66 6f 72 20 74 68 65 20 63 6f 6d 6d 6f 6e  r for the common
6ae0: 20 63 61 73 65 20 77 68 65 72 65 20 74 68 65 72   case where ther
6af0: 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a 20 70 61  e are many.** pa
6b00: 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79 20 62 75  ges in memory bu
6b10: 74 20 6f 6e 6c 79 20 61 20 66 65 77 20 61 72 65  t only a few are
6b20: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
6b30: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74  t journal..*/.st
6b40: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f 61  atic void page_a
6b50: 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28  dd_to_stmt_list(
6b60: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
6b70: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
6b80: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66  Pg->pPager;.  if
6b90: 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 20  ( pPg->inStmt ) 
6ba0: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
6bb0: 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  ( pPg->pPrevStmt
6bc0: 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70 4e 65 78  ==0 && pPg->pNex
6bd0: 74 53 74 6d 74 3d 3d 30 20 29 3b 0a 20 20 70 50  tStmt==0 );.  pP
6be0: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
6bf0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
6c00: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 70 50 61  pStmt ){.    pPa
6c10: 67 65 72 2d 3e 70 53 74 6d 74 2d 3e 70 50 72 65  ger->pStmt->pPre
6c20: 76 53 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 7d  vStmt = pPg;.  }
6c30: 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d  .  pPg->pNextStm
6c40: 74 20 3d 20 70 50 61 67 65 72 2d 3e 70 53 74 6d  t = pPager->pStm
6c50: 74 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 53 74  t;.  pPager->pSt
6c60: 6d 74 20 3d 20 70 50 67 3b 0a 20 20 70 50 67 2d  mt = pPg;.  pPg-
6c70: 3e 69 6e 53 74 6d 74 20 3d 20 31 3b 0a 7d 0a 73  >inStmt = 1;.}.s
6c80: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
6c90: 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
6ca0: 5f 6c 69 73 74 28 50 67 48 64 72 20 2a 70 50 67  _list(PgHdr *pPg
6cb0: 29 7b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e 69  ){.  if( !pPg->i
6cc0: 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b 0a  nStmt ) return;.
6cd0: 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
6ce0: 53 74 6d 74 20 29 7b 0a 20 20 20 20 61 73 73 65  Stmt ){.    asse
6cf0: 72 74 28 20 70 50 67 2d 3e 70 50 72 65 76 53 74  rt( pPg->pPrevSt
6d00: 6d 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d 70  mt->pNextStmt==p
6d10: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
6d20: 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65 78 74 53  PrevStmt->pNextS
6d30: 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  tmt = pPg->pNext
6d40: 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Stmt;.  }else{. 
6d50: 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
6d60: 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3d 3d 70  pPager->pStmt==p
6d70: 50 67 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70  Pg );.    pPg->p
6d80: 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70  Pager->pStmt = p
6d90: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6da0: 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e   }.  if( pPg->pN
6db0: 65 78 74 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  extStmt ){.    a
6dc0: 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78  ssert( pPg->pNex
6dd0: 74 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74  tStmt->pPrevStmt
6de0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 67  ==pPg );.    pPg
6df0: 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e 70 50 72  ->pNextStmt->pPr
6e00: 65 76 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 50  evStmt = pPg->pP
6e10: 72 65 76 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 70  revStmt;.  }.  p
6e20: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
6e30: 30 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 53  0;.  pPg->pPrevS
6e40: 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50 67 2d 3e  tmt = 0;.  pPg->
6e50: 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 7d 0a 0a 2f  inStmt = 0;.}../
6e60: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65  *.** Find a page
6e70: 20 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62   in the hash tab
6e80: 6c 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67  le given its pag
6e90: 65 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72  e number.  Retur
6ea0: 6e 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74  n.** a pointer t
6eb0: 6f 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55  o the page or NU
6ec0: 4c 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e  LL if not found.
6ed0: 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72  .*/.static PgHdr
6ee0: 20 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50   *pager_lookup(P
6ef0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67  ager *pPager, Pg
6f00: 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64  no pgno){.  PgHd
6f10: 72 20 2a 70 20 3d 20 70 50 61 67 65 72 2d 3e 61  r *p = pPager->a
6f20: 48 61 73 68 5b 70 61 67 65 72 5f 68 61 73 68 28  Hash[pager_hash(
6f30: 70 67 6e 6f 29 5d 3b 0a 20 20 77 68 69 6c 65 28  pgno)];.  while(
6f40: 20 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70   p && p->pgno!=p
6f50: 67 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70  gno ){.    p = p
6f60: 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d  ->pNextHash;.  }
6f70: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
6f80: 2f 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65  /*.** Unlock the
6f90: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 6c   database and cl
6fa0: 65 61 72 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ear the in-memor
6fb0: 79 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  y cache.  This r
6fc0: 6f 75 74 69 6e 65 0a 2a 2a 20 73 65 74 73 20 74  outine.** sets t
6fd0: 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  he state of the 
6fe0: 70 61 67 65 72 20 62 61 63 6b 20 74 6f 20 77 68  pager back to wh
6ff0: 61 74 20 69 74 20 77 61 73 20 77 68 65 6e 20 69  at it was when i
7000: 74 20 77 61 73 20 66 69 72 73 74 0a 2a 2a 20 6f  t was first.** o
7010: 70 65 6e 65 64 2e 20 20 41 6e 79 20 6f 75 74 73  pened.  Any outs
7020: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
7030: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 20 61 6e  e invalidated an
7040: 64 20 73 75 62 73 65 71 75 65 6e 74 20 61 74 74  d subsequent att
7050: 65 6d 70 74 73 0a 2a 2a 20 74 6f 20 61 63 63 65  empts.** to acce
7060: 73 73 20 74 68 6f 73 65 20 70 61 67 65 73 20 77  ss those pages w
7070: 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65 73 75 6c  ill likely resul
7080: 74 20 69 6e 20 61 20 63 6f 72 65 64 75 6d 70 2e  t in a coredump.
7090: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
70a0: 70 61 67 65 72 5f 72 65 73 65 74 28 50 61 67 65  pager_reset(Page
70b0: 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67  r *pPager){.  Pg
70c0: 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e 65 78 74  Hdr *pPg, *pNext
70d0: 3b 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  ;.  for(pPg=pPag
70e0: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
70f0: 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20 70  Pg=pNext){.    p
7100: 4e 65 78 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78  Next = pPg->pNex
7110: 74 41 6c 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65  tAll;.    sqlite
7120: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20  Free(pPg);.  }. 
7130: 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
7140: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  = 0;.  pPager->p
7150: 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b  FirstSynced = 0;
7160: 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74  .  pPager->pLast
7170: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
7180: 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 6d 65 6d 73  pAll = 0;.  mems
7190: 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
71a0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
71b0: 65 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 70  er->aHash));.  p
71c0: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
71d0: 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
71e0: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53  state>=PAGER_RES
71f0: 45 52 56 45 44 20 29 7b 0a 20 20 20 20 73 71 6c  ERVED ){.    sql
7200: 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
7210: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
7220: 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f 63    sqlite3OsUnloc
7230: 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  k(&pPager->fd, N
7240: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  O_LOCK);.  pPage
7250: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
7260: 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65  _UNLOCK;.  pPage
7270: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
7280: 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 20 3d    pPager->nRef =
7290: 20 30 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   0;.  assert( pP
72a0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
72b0: 6e 3d 3d 30 20 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n==0 );.}../*.**
72c0: 20 57 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69   When this routi
72d0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
72e0: 65 20 70 61 67 65 72 20 68 61 73 20 74 68 65 20  e pager has the 
72f0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f 70 65  journal file ope
7300: 6e 20 61 6e 64 0a 2a 2a 20 61 20 52 45 53 45 52  n and.** a RESER
7310: 56 45 44 20 6f 72 20 45 58 43 4c 55 53 49 56 45  VED or EXCLUSIVE
7320: 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
7330: 61 62 61 73 65 2e 20 20 54 68 69 73 20 72 6f 75  abase.  This rou
7340: 74 69 6e 65 20 72 65 6c 65 61 73 65 73 0a 2a 2a  tine releases.**
7350: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6c 6f   the database lo
7360: 63 6b 20 61 6e 64 20 61 63 71 75 69 72 65 73 20  ck and acquires 
7370: 61 20 53 48 41 52 45 44 20 6c 6f 63 6b 20 69 6e  a SHARED lock in
7380: 20 69 74 73 20 70 6c 61 63 65 2e 20 20 54 68 65   its place.  The
7390: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
73a0: 20 69 73 20 64 65 6c 65 74 65 64 20 61 6e 64 20   is deleted and 
73b0: 63 6c 6f 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f  closed..**.** TO
73c0: 44 4f 3a 20 43 6f 6e 73 69 64 65 72 20 6b 65 65  DO: Consider kee
73d0: 70 69 6e 67 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ping the journal
73e0: 20 66 69 6c 65 20 6f 70 65 6e 20 66 6f 72 20 74   file open for t
73f0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
7400: 65 73 2e 0a 2a 2a 20 54 68 69 73 20 6d 69 67 68  es..** This migh
7410: 74 20 67 69 76 65 20 61 20 70 65 72 66 6f 72 6d  t give a perform
7420: 61 6e 63 65 20 69 6d 70 72 6f 76 65 6d 65 6e 74  ance improvement
7430: 20 6f 6e 20 77 69 6e 64 6f 77 73 20 77 68 65 72   on windows wher
7440: 65 20 6f 70 65 6e 69 6e 67 0a 2a 2a 20 61 20 66  e opening.** a f
7450: 69 6c 65 20 69 73 20 61 6e 20 65 78 70 65 6e 73  ile is an expens
7460: 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a  ive operation..*
7470: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
7480: 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 50  er_unwritelock(P
7490: 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
74a0: 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
74b0: 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28  nt rc;.  assert(
74c0: 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69 66 28   !MEMDB );.  if(
74d0: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3c 50   pPager->state<P
74e0: 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b  AGER_RESERVED ){
74f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
7500: 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73 71 6c  TE_OK;.  }.  sql
7510: 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
7520: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
7530: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
7540: 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
7550: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
7560: 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 20 20  ger->stfd);.    
7570: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e  pPager->stmtOpen
7580: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
7590: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
75a0: 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
75b0: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
75c0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 70 50 61  r->jfd);.    pPa
75d0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
75e0: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
75f0: 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72  3OsDelete(pPager
7600: 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  ->zJournal);.   
7610: 20 73 71 6c 69 74 65 46 72 65 65 28 20 70 50 61   sqliteFree( pPa
7620: 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
7630: 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
7640: 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  InJournal = 0;. 
7650: 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
7660: 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
7670: 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
7680: 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  {.      pPg->inJ
7690: 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
76a0: 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30    pPg->dirty = 0
76b0: 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
76c0: 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
76d0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72  .    pPager->dir
76e0: 74 79 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20  tyCache = 0;.   
76f0: 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
7700: 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  0;.  }else{.    
7710: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
7720: 64 69 72 74 79 43 61 63 68 65 3d 3d 30 20 7c 7c  dirtyCache==0 ||
7730: 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72   pPager->useJour
7740: 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20  nal==0 );.  }.  
7750: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  rc = sqlite3OsUn
7760: 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
7770: 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a  , SHARED_LOCK);.
7780: 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
7790: 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a  = PAGER_SHARED;.
77a0: 20 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62    pPager->origDb
77b0: 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61 67  Size = 0;.  pPag
77c0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20  er->setMaster = 
77d0: 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  0;.  return rc;.
77e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65  }../*.** Compute
77f0: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 63 68   and return a ch
7800: 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65 20 70  ecksum for the p
7810: 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 0a  age of data..**.
7820: 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20 61  ** This is not a
7830: 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d 2e 20   real checksum. 
7840: 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20 6a 75   It is really ju
7850: 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20 74 68  st the sum of th
7860: 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69 6e 69  e .** random ini
7870: 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64 20 74  tial value and t
7880: 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e 20  he page number. 
7890: 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74 65 64   We experimented
78a0: 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65 63 6b   with.** a check
78b0: 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74 69 72  sum of the entir
78c0: 65 20 64 61 74 61 2c 20 62 75 74 20 74 68 61 74  e data, but that
78d0: 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20 62 65   was found to be
78e0: 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a 2a 2a   too slow..**.**
78f0: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 70   Note that the p
7900: 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20 73 74  age number is st
7910: 6f 72 65 64 20 61 74 20 74 68 65 20 62 65 67 69  ored at the begi
7920: 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20 61 6e  nning of data an
7930: 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b 73 75  d.** the checksu
7940: 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74 20 74  m is stored at t
7950: 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20 69 73  he end.  This is
7960: 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49 66 20   important.  If 
7970: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72 72 75  journal.** corru
7980: 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64 75 65  ption occurs due
7990: 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61 69 6c   to a power fail
79a0: 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20 6c 69  ure, the most li
79b0: 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a 2a 2a  kely scenario.**
79c0: 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65 6e 64   is that one end
79d0: 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20 6f 66   or the other of
79e0: 20 74 68 65 20 72 65 63 6f 72 64 20 77 69 6c 6c   the record will
79f0: 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20 49 74   be changed.  It
7a00: 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65 73 73   is.** much less
7a10: 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74 68 65   likely that the
7a20: 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74 68 65   two ends of the
7a30: 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72 64 20   journal record 
7a40: 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72 72 65  will be.** corre
7a50: 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64 64 6c  ct and the middl
7a60: 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20 20 54  e be corrupt.  T
7a70: 68 75 73 2c 20 74 68 69 73 20 22 63 68 65 63 6b  hus, this "check
7a80: 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a 2a 20  sum" scheme,.** 
7a90: 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e 64 20  though fast and 
7aa0: 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65 73 20  simple, catches 
7ab0: 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b 65 6c  the mostly likel
7ac0: 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72 75 70  y kind of corrup
7ad0: 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49 58 20  tion..**.** FIX 
7ae0: 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20 61 64  ME:  Consider ad
7af0: 64 69 6e 67 20 65 76 65 72 79 20 32 30 30 74 68  ding every 200th
7b00: 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20 6f 66   (or so) byte of
7b10: 20 74 68 65 20 64 61 74 61 20 74 6f 20 74 68 65   the data to the
7b20: 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20 20 54  .** checksum.  T
7b30: 68 61 74 20 77 61 79 20 69 66 20 61 20 73 69 6e  hat way if a sin
7b40: 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73 20 33  gle page spans 3
7b50: 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20 73 65   or more disk se
7b60: 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f 6e 6c  ctors and.** onl
7b70: 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73 65 63  y the middle sec
7b80: 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74 2c 20  tor is corrupt, 
7b90: 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20 68 61  we will still ha
7ba0: 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c 65 0a  ve a reasonable.
7bb0: 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66 61 69  ** chance of fai
7bc0: 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73 75  ling the checksu
7bd0: 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74 65 63  m and thus detec
7be0: 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c 65 6d  ting the problem
7bf0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33 32 20  ..*/.static u32 
7c00: 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61 67 65  pager_cksum(Page
7c10: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
7c20: 70 67 6e 6f 2c 20 63 6f 6e 73 74 20 63 68 61 72  pgno, const char
7c30: 20 2a 61 44 61 74 61 29 7b 0a 20 20 75 33 32 20   *aData){.  u32 
7c40: 63 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  cksum = pPager->
7c50: 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 6e 74  cksumInit;.  int
7c60: 20 69 20 3d 20 70 50 61 67 65 72 2d 3e 70 61 67   i = pPager->pag
7c70: 65 53 69 7a 65 2d 32 30 30 3b 0a 20 20 77 68 69  eSize-200;.  whi
7c80: 6c 65 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 63  le( i>0 ){.    c
7c90: 6b 73 75 6d 20 2b 3d 20 61 44 61 74 61 5b 69 5d  ksum += aData[i]
7ca0: 3b 0a 20 20 20 20 69 20 2d 3d 20 32 30 30 3b 0a  ;.    i -= 200;.
7cb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 63 6b 73    }.  return cks
7cc0: 75 6d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  um;.}../*.** Rea
7cd0: 64 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  d a single page 
7ce0: 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c  from the journal
7cf0: 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20   file opened on 
7d00: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a  file descriptor.
7d10: 2a 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63  ** jfd.  Playbac
7d20: 6b 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e  k this one page.
7d30: 0a 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73  .**.** If useCks
7d40: 75 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74  um==0 it means t
7d50: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73  his journal does
7d60: 20 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75   not use checksu
7d70: 6d 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a  ms.  Checksums.*
7d80: 2a 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69  * are not used i
7d90: 6e 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  n statement jour
7da0: 6e 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61  nals because sta
7db0: 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20  tement journals 
7dc0: 64 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74  do not.** need t
7dd0: 6f 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20  o survive power 
7de0: 66 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61  failures..*/.sta
7df0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c  tic int pager_pl
7e00: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
7e10: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f  Pager *pPager, O
7e20: 73 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20  sFile *jfd, int 
7e30: 75 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74  useCksum){.  int
7e40: 20 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50   rc;.  PgHdr *pP
7e50: 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
7e60: 20 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74       /* An exist
7e70: 69 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20  ing page in the 
7e80: 63 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20  cache */.  Pgno 
7e90: 70 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20  pgno;           
7ea0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
7eb0: 70 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61  page number of a
7ec0: 20 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c   page in journal
7ed0: 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b   */.  u32 cksum;
7ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ef0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20      /* Checksum 
7f00: 75 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20  used for sanity 
7f10: 63 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38  checking */.  u8
7f20: 20 61 44 61 74 61 5b 53 51 4c 49 54 45 5f 4d 41   aData[SQLITE_MA
7f30: 58 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 20 20 2f  X_PAGE_SIZE];  /
7f40: 2a 20 54 65 6d 70 20 73 74 6f 72 61 67 65 20 66  * Temp storage f
7f50: 6f 72 20 61 20 70 61 67 65 20 2a 2f 0a 0a 20 20  or a page */..  
7f60: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
7f70: 6a 66 64 2c 20 26 70 67 6e 6f 29 3b 0a 20 20 69  jfd, &pgno);.  i
7f80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
7f90: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
7fa0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
7fb0: 61 64 28 6a 66 64 2c 20 26 61 44 61 74 61 2c 20  ad(jfd, &aData, 
7fc0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
7fd0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
7fe0: 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
7ff0: 72 63 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f  rc;.  pPager->jo
8000: 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 70 50 61 67  urnalOff += pPag
8010: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 2b 20 34  er->pageSize + 4
8020: 3b 0a 0a 20 20 2f 2a 20 53 61 6e 69 74 79 20 63  ;..  /* Sanity c
8030: 68 65 63 6b 69 6e 67 20 6f 6e 20 74 68 65 20 70  hecking on the p
8040: 61 67 65 2e 20 20 54 68 69 73 20 69 73 20 6d 6f  age.  This is mo
8050: 72 65 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61  re important tha
8060: 74 20 49 20 6f 72 69 67 69 6e 61 6c 6c 79 0a 20  t I originally. 
8070: 20 2a 2a 20 74 68 6f 75 67 68 74 2e 20 20 49 66   ** thought.  If
8080: 20 61 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65   a power failure
8090: 20 6f 63 63 75 72 73 20 77 68 69 6c 65 20 74 68   occurs while th
80a0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65 69  e journal is bei
80b0: 6e 67 20 77 72 69 74 74 65 6e 2c 0a 20 20 2a 2a  ng written,.  **
80c0: 20 69 74 20 63 6f 75 6c 64 20 63 61 75 73 65 20   it could cause 
80d0: 69 6e 76 61 6c 69 64 20 64 61 74 61 20 74 6f 20  invalid data to 
80e0: 62 65 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  be written into 
80f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 57 65  the journal.  We
8100: 20 6e 65 65 64 20 74 6f 0a 20 20 2a 2a 20 64 65   need to.  ** de
8110: 74 65 63 74 20 74 68 69 73 20 69 6e 76 61 6c 69  tect this invali
8120: 64 20 64 61 74 61 20 28 77 69 74 68 20 68 69 67  d data (with hig
8130: 68 20 70 72 6f 62 61 62 69 6c 69 74 79 29 20 61  h probability) a
8140: 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 20 20  nd ignore it..  
8150: 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d 30  */.  if( pgno==0
8160: 20 7c 7c 20 70 67 6e 6f 3d 3d 50 41 47 45 52 5f   || pgno==PAGER_
8170: 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 20  MJ_PGNO(pPager) 
8180: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
8190: 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20 7d 0a 20  LITE_DONE;.  }. 
81a0: 20 69 66 28 20 70 67 6e 6f 3e 28 75 6e 73 69 67   if( pgno>(unsig
81b0: 6e 65 64 29 70 50 61 67 65 72 2d 3e 64 62 53 69  ned)pPager->dbSi
81c0: 7a 65 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  ze ){.    return
81d0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
81e0: 20 20 69 66 28 20 75 73 65 43 6b 73 75 6d 20 29    if( useCksum )
81f0: 7b 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 33  {.    rc = read3
8200: 32 62 69 74 73 28 6a 66 64 2c 20 26 63 6b 73 75  2bits(jfd, &cksu
8210: 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  m);.    if( rc )
8220: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
8230: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
8240: 66 66 20 2b 3d 20 34 3b 0a 20 20 20 20 69 66 28  ff += 4;.    if(
8250: 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70 50 61   pager_cksum(pPa
8260: 67 65 72 2c 20 70 67 6e 6f 2c 20 61 44 61 74 61  ger, pgno, aData
8270: 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20 20  )!=cksum ){.    
8280: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
8290: 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  DONE;.    }.  }.
82a0: 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
82b0: 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f  r->state==PAGER_
82c0: 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61 67  RESERVED || pPag
82d0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
82e0: 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a 20  _EXCLUSIVE );.. 
82f0: 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65 72   /* If the pager
8300: 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44 20   is in RESERVED 
8310: 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65 72  state, then ther
8320: 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70 79  e must be a copy
8330: 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70 61   of this.  ** pa
8340: 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72 20  ge in the pager 
8350: 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20 63  cache. In this c
8360: 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65 20  ase just update 
8370: 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2c  the pager cache,
8380: 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64 61  .  ** not the da
8390: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68 65  tabase file. The
83a0: 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d 61   page is left ma
83b0: 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74 68  rked dirty in th
83c0: 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20 20  is case..  **.  
83d0: 2a 2a 20 49 66 20 69 6e 20 45 58 43 4c 55 53 49  ** If in EXCLUSI
83e0: 56 45 20 73 74 61 74 65 2c 20 74 68 65 6e 20 77  VE state, then w
83f0: 65 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  e update the pag
8400: 65 72 20 63 61 63 68 65 20 69 66 20 69 74 20 65  er cache if it e
8410: 78 69 73 74 73 0a 20 20 2a 2a 20 61 6e 64 20 74  xists.  ** and t
8420: 68 65 20 6d 61 69 6e 20 66 69 6c 65 2e 20 54 68  he main file. Th
8430: 65 20 70 61 67 65 20 69 73 20 74 68 65 6e 20 6d  e page is then m
8440: 61 72 6b 65 64 20 6e 6f 74 20 64 69 72 74 79 2e  arked not dirty.
8450: 0a 20 20 2a 2f 0a 20 20 70 50 67 20 3d 20 70 61  .  */.  pPg = pa
8460: 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
8470: 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 61 73 73 65  r, pgno);.  asse
8480: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
8490: 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53 49  e>=PAGER_EXCLUSI
84a0: 56 45 20 7c 7c 20 70 50 67 20 29 3b 0a 20 20 54  VE || pPg );.  T
84b0: 52 41 43 45 33 28 22 50 4c 41 59 42 41 43 4b 20  RACE3("PLAYBACK 
84c0: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
84d0: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
84e0: 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 61  pgno);.  if( pPa
84f0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
8500: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a 20  R_EXCLUSIVE ){. 
8510: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
8520: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
8530: 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
8540: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
8550: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
8560: 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
8570: 66 64 2c 20 61 44 61 74 61 2c 20 70 50 61 67 65  fd, aData, pPage
8580: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
8590: 7d 0a 20 20 69 66 28 20 70 50 67 20 29 7b 0a 20  }.  if( pPg ){. 
85a0: 20 20 20 2f 2a 20 4e 6f 20 70 61 67 65 20 73 68     /* No page sh
85b0: 6f 75 6c 64 20 65 76 65 72 20 62 65 20 65 78 70  ould ever be exp
85c0: 6c 69 63 69 74 6c 79 20 72 6f 6c 6c 65 64 20 62  licitly rolled b
85d0: 61 63 6b 20 74 68 61 74 20 69 73 20 69 6e 20 75  ack that is in u
85e0: 73 65 2c 20 65 78 63 65 70 74 0a 20 20 20 20 2a  se, except.    *
85f0: 2a 20 66 6f 72 20 70 61 67 65 20 31 20 77 68 69  * for page 1 whi
8600: 63 68 20 69 73 20 68 65 6c 64 20 69 6e 20 75 73  ch is held in us
8610: 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 6b 65  e in order to ke
8620: 65 70 20 74 68 65 20 6c 6f 63 6b 20 6f 6e 20 74  ep the lock on t
8630: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
8640: 73 65 20 61 63 74 69 76 65 2e 20 48 6f 77 65 76  se active. Howev
8650: 65 72 20 73 75 63 68 20 61 20 70 61 67 65 20 6d  er such a page m
8660: 61 79 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ay be rolled bac
8670: 6b 20 61 73 20 61 20 72 65 73 75 6c 74 0a 20 20  k as a result.  
8680: 20 20 2a 2a 20 6f 66 20 61 6e 20 69 6e 74 65 72    ** of an inter
8690: 6e 61 6c 20 65 72 72 6f 72 20 72 65 73 75 6c 74  nal error result
86a0: 69 6e 67 20 69 6e 20 61 6e 20 61 75 74 6f 6d 61  ing in an automa
86b0: 74 69 63 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20  tic call to.    
86c0: 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  ** sqlite3pager_
86d0: 72 6f 6c 6c 62 61 63 6b 28 29 2e 0a 20 20 20 20  rollback()..    
86e0: 2a 2f 0a 20 20 20 20 76 6f 69 64 20 2a 70 44 61  */.    void *pDa
86f0: 74 61 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72  ta;.    /* asser
8700: 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20  t( pPg->nRef==0 
8710: 7c 7c 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 31 20  || pPg->pgno==1 
8720: 29 3b 20 2a 2f 0a 20 20 20 20 70 44 61 74 61 20  ); */.    pData 
8730: 3d 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28  = PGHDR_TO_DATA(
8740: 70 50 67 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79  pPg);.    memcpy
8750: 28 70 44 61 74 61 2c 20 61 44 61 74 61 2c 20 70  (pData, aData, p
8760: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
8770: 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
8780: 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29 7b  ->xDestructor ){
8790: 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 3a 20 20    /*** FIX ME:  
87a0: 53 68 6f 75 6c 64 20 74 68 69 73 20 62 65 20 78  Should this be x
87b0: 52 65 69 6e 69 74 3f 20 2a 2a 2a 2f 0a 20 20 20  Reinit? ***/.   
87c0: 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
87d0: 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
87e0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
87f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70  .    }.    if( p
8800: 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
8810: 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b  GER_EXCLUSIVE ){
8820: 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74  .      pPg->dirt
8830: 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  y = 0;.      pPg
8840: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
8850: 20 20 20 20 7d 0a 20 20 20 20 43 4f 44 45 43 28      }.    CODEC(
8860: 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70  pPager, pData, p
8870: 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
8880: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
8890: 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65  ../*.** Paramete
88a0: 72 20 7a 4d 61 73 74 65 72 20 69 73 20 74 68 65  r zMaster is the
88b0: 20 6e 61 6d 65 20 6f 66 20 61 20 6d 61 73 74 65   name of a maste
88c0: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
88d0: 41 20 73 69 6e 67 6c 65 20 6a 6f 75 72 6e 61 6c  A single journal
88e0: 0a 2a 2a 20 66 69 6c 65 20 74 68 61 74 20 72 65  .** file that re
88f0: 66 65 72 72 65 64 20 74 6f 20 74 68 65 20 6d 61  ferred to the ma
8900: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
8910: 65 20 68 61 73 20 6a 75 73 74 20 62 65 65 6e 20  e has just been 
8920: 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 20  rolled back..** 
8930: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68 65  This routine che
8940: 63 6b 73 20 69 66 20 69 74 20 69 73 20 70 6f 73  cks if it is pos
8950: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
8960: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
8970: 61 6c 20 66 69 6c 65 2c 0a 2a 2a 20 61 6e 64 20  al file,.** and 
8980: 64 6f 65 73 20 73 6f 20 69 66 20 69 74 20 69 73  does so if it is
8990: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74  ..**.** The mast
89a0: 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  er journal file 
89b0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 6e 61 6d  contains the nam
89c0: 65 73 20 6f 66 20 61 6c 6c 20 63 68 69 6c 64 20  es of all child 
89d0: 6a 6f 75 72 6e 61 6c 73 2e 0a 2a 2a 20 54 6f 20  journals..** To 
89e0: 74 65 6c 6c 20 69 66 20 61 20 6d 61 73 74 65 72  tell if a master
89f0: 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65 20   journal can be 
8a00: 64 65 6c 65 74 65 64 2c 20 63 68 65 63 6b 20 74  deleted, check t
8a10: 6f 20 65 61 63 68 20 6f 66 20 74 68 65 0a 2a 2a  o each of the.**
8a20: 20 63 68 69 6c 64 72 65 6e 2e 20 20 49 66 20 61   children.  If a
8a30: 6c 6c 20 63 68 69 6c 64 72 65 6e 20 61 72 65 20  ll children are 
8a40: 65 69 74 68 65 72 20 6d 69 73 73 69 6e 67 20 6f  either missing o
8a50: 72 20 64 6f 20 6e 6f 74 20 72 65 66 65 72 20 74  r do not refer t
8a60: 6f 0a 2a 2a 20 61 20 64 69 66 66 65 72 65 6e 74  o.** a different
8a70: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2c   master journal,
8a80: 20 74 68 65 6e 20 74 68 69 73 20 6d 61 73 74 65   then this maste
8a90: 72 20 6a 6f 75 72 6e 61 6c 20 63 61 6e 20 62 65  r journal can be
8aa0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2f 0a 73 74 61   deleted..*/.sta
8ab0: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 64 65  tic int pager_de
8ac0: 6c 6d 61 73 74 65 72 28 63 6f 6e 73 74 20 63 68  lmaster(const ch
8ad0: 61 72 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20  ar *zMaster){.  
8ae0: 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 6d 61  int rc;.  int ma
8af0: 73 74 65 72 5f 6f 70 65 6e 20 3d 20 30 3b 0a 20  ster_open = 0;. 
8b00: 20 4f 73 46 69 6c 65 20 6d 61 73 74 65 72 3b 0a   OsFile master;.
8b10: 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a    char *zMasterJ
8b20: 6f 75 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43  ournal = 0; /* C
8b30: 6f 6e 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65  ontents of maste
8b40: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a  r journal file *
8b50: 2f 0a 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a  /.  i64 nMasterJ
8b60: 6f 75 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a  ournal;       /*
8b70: 20 53 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20   Size of master 
8b80: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
8b90: 0a 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d  .  /* Open the m
8ba0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69  aster journal fi
8bb0: 6c 65 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69  le exclusively i
8bc0: 6e 20 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65  n case some othe
8bd0: 72 20 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69  r process.  ** i
8be0: 73 20 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72  s running this r
8bf0: 6f 75 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74  outine also. Not
8c00: 20 74 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74   that it makes t
8c10: 6f 6f 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e  oo much differen
8c20: 63 65 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65  ce..  */.  memse
8c30: 74 28 26 6d 61 73 74 65 72 2c 20 30 2c 20 73 69  t(&master, 0, si
8c40: 7a 65 6f 66 28 6d 61 73 74 65 72 29 29 3b 0a 20  zeof(master));. 
8c50: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f   rc = sqlite3OsO
8c60: 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a 4d 61 73  penReadOnly(zMas
8c70: 74 65 72 2c 20 26 6d 61 73 74 65 72 29 3b 0a 20  ter, &master);. 
8c80: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
8c90: 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73  OK ) goto delmas
8ca0: 74 65 72 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65  ter_out;.  maste
8cb0: 72 5f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63  r_open = 1;.  rc
8cc0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
8cd0: 53 69 7a 65 28 26 6d 61 73 74 65 72 2c 20 26 6e  Size(&master, &n
8ce0: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a  MasterJournal);.
8cf0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
8d00: 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65 6c 6d 61  _OK ) goto delma
8d10: 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20 69 66 28  ster_out;..  if(
8d20: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3e   nMasterJournal>
8d30: 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  0 ){.    char *z
8d40: 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20 20 63 68 61  Journal;.    cha
8d50: 72 20 2a 7a 4d 61 73 74 65 72 50 74 72 20 3d 20  r *zMasterPtr = 
8d60: 30 3b 0a 0a 20 20 20 20 2f 2a 20 4c 6f 61 64 20  0;..    /* Load 
8d70: 74 68 65 20 65 6e 74 69 72 65 20 6d 61 73 74 65  the entire maste
8d80: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69  r journal file i
8d90: 6e 74 6f 20 73 70 61 63 65 20 6f 62 74 61 69 6e  nto space obtain
8da0: 65 64 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 73  ed from.    ** s
8db0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29 20 61 6e  qliteMalloc() an
8dc0: 64 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20  d pointed to by 
8dd0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2e 20  zMasterJournal. 
8de0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 4d 61 73  .    */.    zMas
8df0: 74 65 72 4a 6f 75 72 6e 61 6c 20 3d 20 28 63 68  terJournal = (ch
8e00: 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f  ar *)sqliteMallo
8e10: 63 28 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  c(nMasterJournal
8e20: 29 3b 0a 20 20 20 20 69 66 28 20 21 7a 4d 61 73  );.    if( !zMas
8e30: 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  terJournal ){.  
8e40: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
8e50: 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 67 6f 74  NOMEM;.      got
8e60: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
8e70: 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
8e80: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 6d  sqlite3OsRead(&m
8e90: 61 73 74 65 72 2c 20 7a 4d 61 73 74 65 72 4a 6f  aster, zMasterJo
8ea0: 75 72 6e 61 6c 2c 20 6e 4d 61 73 74 65 72 4a 6f  urnal, nMasterJo
8eb0: 75 72 6e 61 6c 29 3b 0a 20 20 20 20 69 66 28 20  urnal);.    if( 
8ec0: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
8ed0: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
8ee0: 75 74 3b 0a 0a 20 20 20 20 7a 4a 6f 75 72 6e 61  ut;..    zJourna
8ef0: 6c 20 3d 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  l = zMasterJourn
8f00: 61 6c 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28  al;.    while( (
8f10: 7a 4a 6f 75 72 6e 61 6c 2d 7a 4d 61 73 74 65 72  zJournal-zMaster
8f20: 4a 6f 75 72 6e 61 6c 29 3c 6e 4d 61 73 74 65 72  Journal)<nMaster
8f30: 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20  Journal ){.     
8f40: 20 69 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69   if( sqlite3OsFi
8f50: 6c 65 45 78 69 73 74 73 28 7a 4a 6f 75 72 6e 61  leExists(zJourna
8f60: 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  l) ){.        /*
8f70: 20 4f 6e 65 20 6f 66 20 74 68 65 20 6a 6f 75 72   One of the jour
8f80: 6e 61 6c 73 20 70 6f 69 6e 74 65 64 20 74 6f 20  nals pointed to 
8f90: 62 79 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  by the master jo
8fa0: 75 72 6e 61 6c 20 65 78 69 73 74 73 2e 0a 20 20  urnal exists..  
8fb0: 20 20 20 20 20 20 2a 2a 20 4f 70 65 6e 20 69 74        ** Open it
8fc0: 20 61 6e 64 20 63 68 65 63 6b 20 69 66 20 69 74   and check if it
8fd0: 20 70 6f 69 6e 74 73 20 61 74 20 74 68 65 20 6d   points at the m
8fe0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 49  aster journal. I
8ff0: 66 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 6f 2c  f.        ** so,
9000: 20 72 65 74 75 72 6e 20 77 69 74 68 6f 75 74 20   return without 
9010: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 6d 61 73  deleting the mas
9020: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
9030: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
9040: 20 20 20 20 20 4f 73 46 69 6c 65 20 6a 6f 75 72       OsFile jour
9050: 6e 61 6c 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  nal;.        int
9060: 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 6d 65 6d   c;..        mem
9070: 73 65 74 28 26 6a 6f 75 72 6e 61 6c 2c 20 30 2c  set(&journal, 0,
9080: 20 73 69 7a 65 6f 66 28 6a 6f 75 72 6e 61 6c 29   sizeof(journal)
9090: 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
90a0: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61  sqlite3OsOpenRea
90b0: 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c 2c 20  dOnly(zJournal, 
90c0: 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20  &journal);.     
90d0: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
90e0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
90f0: 20 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72    goto delmaster
9100: 5f 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  _out;.        }.
9110: 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 72 65  .        rc = re
9120: 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28  adMasterJournal(
9130: 26 6a 6f 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74  &journal, &zMast
9140: 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20  erPtr);.        
9150: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
9160: 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20  journal);.      
9170: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
9180: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
9190: 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f   goto delmaster_
91a0: 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  out;.        }..
91b0: 20 20 20 20 20 20 20 20 63 20 3d 20 7a 4d 61 73          c = zMas
91c0: 74 65 72 50 74 72 21 3d 30 20 26 26 20 73 74 72  terPtr!=0 && str
91d0: 63 6d 70 28 7a 4d 61 73 74 65 72 50 74 72 2c 20  cmp(zMasterPtr, 
91e0: 7a 4d 61 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20  zMaster)==0;.   
91f0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
9200: 7a 4d 61 73 74 65 72 50 74 72 29 3b 0a 20 20 20  zMasterPtr);.   
9210: 20 20 20 20 20 69 66 28 20 63 20 29 7b 0a 20 20       if( c ){.  
9220: 20 20 20 20 20 20 20 20 2f 2a 20 57 65 20 68 61          /* We ha
9230: 76 65 20 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e  ve a match. Do n
9240: 6f 74 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61  ot delete the ma
9250: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
9260: 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  e. */.          
9270: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
9280: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ut;.        }.  
9290: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75      }.      zJou
92a0: 72 6e 61 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28  rnal += (strlen(
92b0: 7a 4a 6f 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20  zJournal)+1);.  
92c0: 20 20 7d 0a 20 20 7d 0a 20 20 0a 20 20 73 71 6c    }.  }.  .  sql
92d0: 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a 4d 61  ite3OsDelete(zMa
92e0: 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73 74 65  ster);..delmaste
92f0: 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a 4d 61  r_out:.  if( zMa
9300: 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20  sterJournal ){. 
9310: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d     sqliteFree(zM
9320: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
9330: 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73 74 65   }  .  if( maste
9340: 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71  r_open ){.    sq
9350: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6d 61  lite3OsClose(&ma
9360: 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ster);.  }.  ret
9370: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
9380: 20 4d 61 6b 65 20 65 76 65 72 79 20 70 61 67 65   Make every page
9390: 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 61 67   in the cache ag
93a0: 72 65 65 20 77 69 74 68 20 77 68 61 74 20 69 73  ree with what is
93b0: 20 6f 6e 20 64 69 73 6b 2e 20 20 49 6e 20 6f 74   on disk.  In ot
93c0: 68 65 72 20 77 6f 72 64 73 2c 0a 2a 2a 20 72 65  her words,.** re
93d0: 72 65 61 64 20 74 68 65 20 64 69 73 6b 20 74 6f  read the disk to
93e0: 20 72 65 73 65 74 20 74 68 65 20 73 74 61 74 65   reset the state
93f0: 20 6f 66 20 74 68 65 20 63 61 63 68 65 2e 0a 2a   of the cache..*
9400: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
9410: 65 20 69 73 20 63 61 6c 6c 65 64 20 61 66 74 65  e is called afte
9420: 72 20 61 20 72 6f 6c 6c 62 61 63 6b 20 69 6e 20  r a rollback in 
9430: 77 68 69 63 68 20 73 6f 6d 65 20 6f 66 20 74 68  which some of th
9440: 65 20 64 69 72 74 79 20 63 61 63 68 65 0a 2a 2a  e dirty cache.**
9450: 20 70 61 67 65 73 20 68 61 64 20 6e 65 76 65 72   pages had never
9460: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 6f 75   been written ou
9470: 74 20 74 6f 20 64 69 73 6b 2e 20 20 57 65 20 6e  t to disk.  We n
9480: 65 65 64 20 74 6f 20 72 6f 6c 6c 20 62 61 63 6b  eed to roll back
9490: 20 74 68 65 0a 2a 2a 20 63 61 63 68 65 20 63 6f   the.** cache co
94a0: 6e 74 65 6e 74 20 61 6e 64 20 74 68 65 20 65 61  ntent and the ea
94b0: 73 69 65 73 74 20 77 61 79 20 74 6f 20 64 6f 20  siest way to do 
94c0: 74 68 61 74 20 69 73 20 74 6f 20 72 65 72 65 61  that is to rerea
94d0: 64 20 74 68 65 20 6f 6c 64 20 63 6f 6e 74 65 6e  d the old conten
94e0: 74 0a 2a 2a 20 62 61 63 6b 20 66 72 6f 6d 20 74  t.** back from t
94f0: 68 65 20 64 69 73 6b 2e 0a 2a 2f 0a 73 74 61 74  he disk..*/.stat
9500: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 72 65 6c  ic int pager_rel
9510: 6f 61 64 5f 63 61 63 68 65 28 50 61 67 65 72 20  oad_cache(Pager 
9520: 2a 70 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64  *pPager){.  PgHd
9530: 72 20 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63  r *pPg;.  int rc
9540: 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
9550: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
9560: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
9570: 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20  Pg->pNextAll){. 
9580: 20 20 20 63 68 61 72 20 7a 42 75 66 5b 53 51 4c     char zBuf[SQL
9590: 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a  ITE_MAX_PAGE_SIZ
95a0: 45 5d 3b 0a 20 20 20 20 69 66 28 20 21 70 50 67  E];.    if( !pPg
95b0: 2d 3e 64 69 72 74 79 20 29 20 63 6f 6e 74 69 6e  ->dirty ) contin
95c0: 75 65 3b 0a 20 20 20 20 69 66 28 20 28 69 6e 74  ue;.    if( (int
95d0: 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50  )pPg->pgno <= pP
95e0: 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
95f0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
9600: 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d  3OsSeek(&pPager-
9610: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
9620: 65 53 69 7a 65 2a 28 69 36 34 29 28 70 50 67 2d  eSize*(i64)(pPg-
9630: 3e 70 67 6e 6f 2d 31 29 29 3b 0a 20 20 20 20 20  >pgno-1));.     
9640: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52   rc = sqlite3OsR
9650: 65 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ead(&pPager->fd,
9660: 20 7a 42 75 66 2c 20 70 50 61 67 65 72 2d 3e 70   zBuf, pPager->p
9670: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
9680: 54 52 41 43 45 33 28 22 52 45 46 45 54 43 48 20  TRACE3("REFETCH 
9690: 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
96a0: 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
96b0: 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
96c0: 20 20 69 66 28 20 72 63 20 29 20 62 72 65 61 6b    if( rc ) break
96d0: 3b 0a 20 20 20 20 20 20 43 4f 44 45 43 28 70 50  ;.      CODEC(pP
96e0: 61 67 65 72 2c 20 7a 42 75 66 2c 20 70 50 67 2d  ager, zBuf, pPg-
96f0: 3e 70 67 6e 6f 2c 20 32 29 3b 0a 20 20 20 20 7d  >pgno, 2);.    }
9700: 65 6c 73 65 7b 0a 20 20 20 20 20 20 6d 65 6d 73  else{.      mems
9710: 65 74 28 7a 42 75 66 2c 20 30 2c 20 70 50 61 67  et(zBuf, 0, pPag
9720: 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
9730: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67     }.    if( pPg
9740: 2d 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 6d 65 6d  ->nRef==0 || mem
9750: 63 6d 70 28 7a 42 75 66 2c 20 50 47 48 44 52 5f  cmp(zBuf, PGHDR_
9760: 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50  TO_DATA(pPg), pP
9770: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20  ager->pageSize) 
9780: 29 7b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  ){.      memcpy(
9790: 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
97a0: 67 29 2c 20 7a 42 75 66 2c 20 70 50 61 67 65 72  g), zBuf, pPager
97b0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
97c0: 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78     if( pPager->x
97d0: 52 65 69 6e 69 74 65 72 20 29 7b 0a 20 20 20 20  Reiniter ){.    
97e0: 20 20 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69      pPager->xRei
97f0: 6e 69 74 65 72 28 50 47 48 44 52 5f 54 4f 5f 44  niter(PGHDR_TO_D
9800: 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72  ATA(pPg), pPager
9810: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
9820: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9830: 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
9840: 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50 61  O_EXTRA(pPg, pPa
9850: 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72 2d  ger), 0, pPager-
9860: 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 20 20  >nExtra);.      
9870: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  }.    }.    pPg-
9880: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
9890: 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20     pPg->dirty = 
98a0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
98b0: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75  rc;.}../*.** Tru
98c0: 6e 63 61 74 65 20 74 68 65 20 6d 61 69 6e 20 66  ncate the main f
98d0: 69 6c 65 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ile of the given
98e0: 20 70 61 67 65 72 20 74 6f 20 74 68 65 20 6e 75   pager to the nu
98f0: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 0a 2a 2a  mber of pages.**
9900: 20 69 6e 64 69 63 61 74 65 64 2e 0a 2a 2f 0a 73   indicated..*/.s
9910: 74 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f  tatic int pager_
9920: 74 72 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a  truncate(Pager *
9930: 70 50 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67  pPager, int nPag
9940: 65 29 7b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  e){.  return sql
9950: 69 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26  ite3OsTruncate(&
9960: 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
9970: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28 69 36  er->pageSize*(i6
9980: 34 29 6e 50 61 67 65 29 3b 0a 7d 0a 0a 2f 2a 0a  4)nPage);.}../*.
9990: 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74 68 65 20  ** Playback the 
99a0: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 74 68 75 73  journal and thus
99b0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
99c0: 61 62 61 73 65 20 66 69 6c 65 20 74 6f 0a 2a 2a  abase file to.**
99d0: 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
99e0: 73 20 69 6e 20 62 65 66 6f 72 65 20 77 65 20 73  s in before we s
99f0: 74 61 72 74 65 64 20 6d 61 6b 69 6e 67 20 63 68  tarted making ch
9a00: 61 6e 67 65 73 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  anges.  .**.** T
9a10: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
9a20: 66 6f 72 6d 61 74 20 69 73 20 61 73 20 66 6f 6c  format is as fol
9a30: 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a 2a 20 20 28 31  lows: .**.**  (1
9a40: 29 20 20 38 20 62 79 74 65 20 70 72 65 66 69 78  )  8 byte prefix
9a50: 2e 20 20 41 20 63 6f 70 79 20 6f 66 20 61 4a 6f  .  A copy of aJo
9a60: 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a 2a  urnalMagic[]..**
9a70: 20 20 28 32 29 20 20 34 20 62 79 74 65 20 62 69    (2)  4 byte bi
9a80: 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65 72  g-endian integer
9a90: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75   which is the nu
9aa0: 6d 62 65 72 20 6f 66 20 76 61 6c 69 64 20 70 61  mber of valid pa
9ab0: 67 65 20 72 65 63 6f 72 64 73 0a 2a 2a 20 20 20  ge records.**   
9ac0: 20 20 20 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e      in the journ
9ad0: 61 6c 2e 20 20 49 66 20 74 68 69 73 20 76 61 6c  al.  If this val
9ae0: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
9af0: 2c 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 20 74  , then compute t
9b00: 68 65 0a 2a 2a 20 20 20 20 20 20 20 6e 75 6d 62  he.**       numb
9b10: 65 72 20 6f 66 20 70 61 67 65 20 72 65 63 6f 72  er of page recor
9b20: 64 73 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ds from the jour
9b30: 6e 61 6c 20 73 69 7a 65 2e 0a 2a 2a 20 20 28 33  nal size..**  (3
9b40: 29 20 20 34 20 62 79 74 65 20 62 69 67 2d 65 6e  )  4 byte big-en
9b50: 64 69 61 6e 20 69 6e 74 65 67 65 72 20 77 68 69  dian integer whi
9b60: 63 68 20 69 73 20 74 68 65 20 69 6e 69 74 69 61  ch is the initia
9b70: 6c 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20  l value for the 
9b80: 0a 2a 2a 20 20 20 20 20 20 20 73 61 6e 69 74 79  .**       sanity
9b90: 20 63 68 65 63 6b 73 75 6d 2e 0a 2a 2a 20 20 28   checksum..**  (
9ba0: 34 29 20 20 34 20 62 79 74 65 20 69 6e 74 65 67  4)  4 byte integ
9bb0: 65 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20  er which is the 
9bc0: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
9bd0: 74 6f 20 74 72 75 6e 63 61 74 65 20 74 68 65 0a  to truncate the.
9be0: 2a 2a 20 20 20 20 20 20 20 64 61 74 61 62 61 73  **       databas
9bf0: 65 20 74 6f 20 64 75 72 69 6e 67 20 61 20 72 6f  e to during a ro
9c00: 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 20 28 35 29 20  llback..**  (5) 
9c10: 20 34 20 62 79 74 65 20 69 6e 74 65 67 65 72 20   4 byte integer 
9c20: 77 68 69 63 68 20 69 73 20 74 68 65 20 6e 75 6d  which is the num
9c30: 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20  ber of bytes in 
9c40: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
9c50: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 6e 61 6d 65  al.**       name
9c60: 2e 20 20 54 68 65 20 76 61 6c 75 65 20 6d 61 79  .  The value may
9c70: 20 62 65 20 7a 65 72 6f 20 28 69 6e 64 69 63 61   be zero (indica
9c80: 74 65 20 74 68 61 74 20 74 68 65 72 65 20 69 73  te that there is
9c90: 20 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20   no master.**   
9ca0: 20 20 20 20 6a 6f 75 72 6e 61 6c 2e 29 0a 2a 2a      journal.).**
9cb0: 20 20 28 36 29 20 20 4e 20 62 79 74 65 73 20 6f    (6)  N bytes o
9cc0: 66 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  f the master jou
9cd0: 72 6e 61 6c 20 6e 61 6d 65 2e 20 20 54 68 65 20  rnal name.  The 
9ce0: 6e 61 6d 65 20 77 69 6c 6c 20 62 65 20 6e 75 6c  name will be nul
9cf0: 2d 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 20  -terminated.**  
9d00: 20 20 20 20 20 61 6e 64 20 6d 69 67 68 74 20 62       and might b
9d10: 65 20 73 68 6f 72 74 65 72 20 74 68 61 6e 20 74  e shorter than t
9d20: 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66 72  he value read fr
9d30: 6f 6d 20 28 35 29 2e 20 20 49 66 20 74 68 65 20  om (5).  If the 
9d40: 66 69 72 73 74 20 62 79 74 65 0a 2a 2a 20 20 20  first byte.**   
9d50: 20 20 20 20 6f 66 20 74 68 65 20 6e 61 6d 65 20      of the name 
9d60: 69 73 20 5c 30 30 30 20 74 68 65 6e 20 74 68 65  is \000 then the
9d70: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 20  re is no master 
9d80: 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 20 6d 61  journal.  The ma
9d90: 73 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f  ster.**       jo
9da0: 75 72 6e 61 6c 20 6e 61 6d 65 20 69 73 20 73 74  urnal name is st
9db0: 6f 72 65 64 20 69 6e 20 55 54 46 2d 38 2e 0a 2a  ored in UTF-8..*
9dc0: 2a 20 20 28 37 29 20 20 5a 65 72 6f 20 6f 72 20  *  (7)  Zero or 
9dd0: 6d 6f 72 65 20 70 61 67 65 73 20 69 6e 73 74 61  more pages insta
9de0: 6e 63 65 73 2c 20 65 61 63 68 20 61 73 20 66 6f  nces, each as fo
9df0: 6c 6c 6f 77 73 3a 0a 2a 2a 20 20 20 20 20 20 20  llows:.**       
9e00: 20 2b 20 20 34 20 62 79 74 65 20 70 61 67 65 20   +  4 byte page 
9e10: 6e 75 6d 62 65 72 2e 0a 2a 2a 20 20 20 20 20 20  number..**      
9e20: 20 20 2b 20 20 70 50 61 67 65 72 2d 3e 70 61 67    +  pPager->pag
9e30: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
9e40: 61 74 61 2e 0a 2a 2a 20 20 20 20 20 20 20 20 2b  ata..**        +
9e50: 20 20 34 20 62 79 74 65 20 63 68 65 63 6b 73 75    4 byte checksu
9e60: 6d 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 77 65 20  m.**.** When we 
9e70: 73 70 65 61 6b 20 6f 66 20 74 68 65 20 6a 6f 75  speak of the jou
9e80: 72 6e 61 6c 20 68 65 61 64 65 72 2c 20 77 65 20  rnal header, we 
9e90: 6d 65 61 6e 20 74 68 65 20 66 69 72 73 74 20 36  mean the first 6
9ea0: 20 69 74 65 6d 73 20 61 62 6f 76 65 2e 0a 2a 2a   items above..**
9eb0: 20 45 61 63 68 20 65 6e 74 72 79 20 69 6e 20 74   Each entry in t
9ec0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 61 6e  he journal is an
9ed0: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
9ee0: 20 37 74 68 20 69 74 65 6d 2e 0a 2a 2a 0a 2a 2a   7th item..**.**
9ef0: 20 43 61 6c 6c 20 74 68 65 20 76 61 6c 75 65 20   Call the value 
9f00: 66 72 6f 6d 20 74 68 65 20 73 65 63 6f 6e 64 20  from the second 
9f10: 62 75 6c 6c 65 74 20 22 6e 52 65 63 22 2e 20 20  bullet "nRec".  
9f20: 6e 52 65 63 20 69 73 20 74 68 65 20 6e 75 6d 62  nRec is the numb
9f30: 65 72 20 6f 66 0a 2a 2a 20 76 61 6c 69 64 20 70  er of.** valid p
9f40: 61 67 65 20 65 6e 74 72 69 65 73 20 69 6e 20 74  age entries in t
9f50: 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20  he journal.  In 
9f60: 6d 6f 73 74 20 63 61 73 65 73 2c 20 79 6f 75 20  most cases, you 
9f70: 63 61 6e 20 63 6f 6d 70 75 74 65 20 74 68 65 0a  can compute the.
9f80: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63  ** value of nRec
9f90: 20 66 72 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f   from the size o
9fa0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  f the journal fi
9fb0: 6c 65 2e 20 20 42 75 74 20 69 66 20 61 20 70 6f  le.  But if a po
9fc0: 77 65 72 0a 2a 2a 20 66 61 69 6c 75 72 65 20 6f  wer.** failure o
9fd0: 63 63 75 72 72 65 64 20 77 68 69 6c 65 20 74 68  ccurred while th
9fe0: 65 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20 62 65  e journal was be
9ff0: 69 6e 67 20 77 72 69 74 74 65 6e 2c 20 69 74 20  ing written, it 
a000: 63 6f 75 6c 64 20 62 65 20 74 68 65 0a 2a 2a 20  could be the.** 
a010: 63 61 73 65 20 74 68 61 74 20 74 68 65 20 73 69  case that the si
a020: 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ze of the journa
a030: 6c 20 66 69 6c 65 20 68 61 64 20 61 6c 72 65 61  l file had alrea
a040: 64 79 20 62 65 65 6e 20 69 6e 63 72 65 61 73 65  dy been increase
a050: 64 20 62 75 74 0a 2a 2a 20 74 68 65 20 65 78 74  d but.** the ext
a060: 72 61 20 65 6e 74 72 69 65 73 20 68 61 64 20 6e  ra entries had n
a070: 6f 74 20 79 65 74 20 6d 61 64 65 20 69 74 20 73  ot yet made it s
a080: 61 66 65 6c 79 20 74 6f 20 64 69 73 6b 2e 20 20  afely to disk.  
a090: 49 6e 20 73 75 63 68 20 61 20 63 61 73 65 2c 0a  In such a case,.
a0a0: 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ** the value of 
a0b0: 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
a0c0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
a0d0: 20 77 6f 75 6c 64 20 62 65 20 74 6f 6f 20 6c 61   would be too la
a0e0: 72 67 65 2e 20 20 46 6f 72 0a 2a 2a 20 74 68 61  rge.  For.** tha
a0f0: 74 20 72 65 61 73 6f 6e 2c 20 77 65 20 61 6c 77  t reason, we alw
a100: 61 79 73 20 75 73 65 20 74 68 65 20 6e 52 65 63  ays use the nRec
a110: 20 76 61 6c 75 65 20 69 6e 20 74 68 65 20 68 65   value in the he
a120: 61 64 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  ader..**.** If t
a130: 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20 69 73  he nRec value is
a140: 20 30 78 66 66 66 66 66 66 66 66 20 69 74 20 6d   0xffffffff it m
a150: 65 61 6e 73 20 74 68 61 74 20 6e 52 65 63 20 73  eans that nRec s
a160: 68 6f 75 6c 64 20 62 65 20 63 6f 6d 70 75 74 65  hould be compute
a170: 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
a180: 6c 65 20 73 69 7a 65 2e 20 20 54 68 69 73 20 76  le size.  This v
a190: 61 6c 75 65 20 69 73 20 75 73 65 64 20 77 68 65  alue is used whe
a1a0: 6e 20 74 68 65 20 75 73 65 72 20 73 65 6c 65 63  n the user selec
a1b0: 74 73 20 74 68 65 0a 2a 2a 20 6e 6f 2d 73 79 6e  ts the.** no-syn
a1c0: 63 20 6f 70 74 69 6f 6e 20 66 6f 72 20 74 68 65  c option for the
a1d0: 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 20 70 6f 77   journal.  A pow
a1e0: 65 72 20 66 61 69 6c 75 72 65 20 63 6f 75 6c 64  er failure could
a1f0: 20 6c 65 61 64 20 74 6f 20 63 6f 72 72 75 70 74   lead to corrupt
a200: 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 69 73 20 63  ion.** in this c
a210: 61 73 65 2e 20 20 42 75 74 20 66 6f 72 20 74 68  ase.  But for th
a220: 69 6e 67 73 20 6c 69 6b 65 20 74 65 6d 70 6f 72  ings like tempor
a230: 61 72 79 20 74 61 62 6c 65 20 28 77 68 69 63 68  ary table (which
a240: 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 64 65 6c 65   will be.** dele
a250: 74 65 64 20 77 68 65 6e 20 74 68 65 20 70 6f 77  ted when the pow
a260: 65 72 20 69 73 20 72 65 73 74 6f 72 65 64 29 20  er is restored) 
a270: 77 65 20 64 6f 6e 27 74 20 63 61 72 65 2e 20 20  we don't care.  
a280: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 69  .**.** If the fi
a290: 6c 65 20 6f 70 65 6e 65 64 20 61 73 20 74 68 65  le opened as the
a2a0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 73   journal file is
a2b0: 20 6e 6f 74 20 61 20 77 65 6c 6c 2d 66 6f 72 6d   not a well-form
a2c0: 65 64 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  ed.** journal fi
a2d0: 6c 65 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65  le then all page
a2e0: 73 20 75 70 20 74 6f 20 74 68 65 20 66 69 72 73  s up to the firs
a2f0: 74 20 63 6f 72 72 75 70 74 65 64 20 70 61 67 65  t corrupted page
a300: 20 61 72 65 20 72 6f 6c 6c 65 64 0a 2a 2a 20 62   are rolled.** b
a310: 61 63 6b 20 28 6f 72 20 6e 6f 20 70 61 67 65 73  ack (or no pages
a320: 20 69 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   if the journal 
a330: 68 65 61 64 65 72 20 69 73 20 63 6f 72 72 75 70  header is corrup
a340: 74 65 64 29 2e 20 54 68 65 20 6a 6f 75 72 6e 61  ted). The journa
a350: 6c 20 66 69 6c 65 0a 2a 2a 20 69 73 20 74 68 65  l file.** is the
a360: 6e 20 64 65 6c 65 74 65 64 20 61 6e 64 20 53 51  n deleted and SQ
a370: 4c 49 54 45 5f 4f 4b 20 72 65 74 75 72 6e 65 64  LITE_OK returned
a380: 2c 20 6a 75 73 74 20 61 73 20 69 66 20 6e 6f 20  , just as if no 
a390: 63 6f 72 72 75 70 74 69 6f 6e 20 68 61 64 0a 2a  corruption had.*
a3a0: 2a 20 62 65 65 6e 20 65 6e 63 6f 75 6e 74 65 72  * been encounter
a3b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20  ed..**.** If an 
a3c0: 49 2f 4f 20 6f 72 20 6d 61 6c 6c 6f 63 28 29 20  I/O or malloc() 
a3d0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74 68  error occurs, th
a3e0: 65 20 6a 6f 75 72 6e 61 6c 2d 66 69 6c 65 20 69  e journal-file i
a3f0: 73 20 6e 6f 74 20 64 65 6c 65 74 65 64 0a 2a 2a  s not deleted.**
a400: 20 61 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f   and an error co
a410: 64 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  de is returned..
a420: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
a430: 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 50 61 67  ger_playback(Pag
a440: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69  er *pPager){.  i
a450: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
a460: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
a470: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
a480: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
a490: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
a4a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
a4b0: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
a4c0: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
a4d0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
a4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a4f0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
a500: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
a510: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
a520: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
a530: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
a540: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a560: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
a570: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
a580: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
a590: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
a5a0: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
a5b0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
a5c0: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
a5d0: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
a5e0: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
a5f0: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
a600: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
a610: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
a620: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
a630: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
a640: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
a650: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
a660: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
a670: 64 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  d, &szJ);.  if( 
a680: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
a690: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
a6a0: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
a6b0: 2a 20 52 65 61 64 20 74 68 65 20 6d 61 73 74 65  * Read the maste
a6c0: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 66  r journal name f
a6d0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c  rom the journal,
a6e0: 20 69 66 20 69 74 20 69 73 20 70 72 65 73 65 6e   if it is presen
a6f0: 74 2e 0a 20 20 2a 2a 20 49 66 20 61 20 6d 61 73  t..  ** If a mas
a700: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
a710: 20 6e 61 6d 65 20 69 73 20 73 70 65 63 69 66 69   name is specifi
a720: 65 64 2c 20 62 75 74 20 74 68 65 20 66 69 6c 65  ed, but the file
a730: 20 69 73 20 6e 6f 74 0a 20 20 2a 2a 20 70 72 65   is not.  ** pre
a740: 73 65 6e 74 20 6f 6e 20 64 69 73 6b 2c 20 74 68  sent on disk, th
a750: 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  en the journal i
a760: 73 20 6e 6f 74 20 68 6f 74 20 61 6e 64 20 64 6f  s not hot and do
a770: 65 73 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62  es not need to b
a780: 65 0a 20 20 2a 2a 20 70 6c 61 79 65 64 20 62 61  e.  ** played ba
a790: 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
a7a0: 72 65 61 64 4d 61 73 74 65 72 4a 6f 75 72 6e 61  readMasterJourna
a7b0: 6c 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  l(&pPager->jfd, 
a7c0: 26 7a 4d 61 73 74 65 72 29 3b 0a 20 20 61 73 73  &zMaster);.  ass
a7d0: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
a7e0: 44 4f 4e 45 20 29 3b 0a 20 20 69 66 28 20 72 63  DONE );.  if( rc
a7f0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 28  !=SQLITE_OK || (
a800: 7a 4d 61 73 74 65 72 20 26 26 20 21 73 71 6c 69  zMaster && !sqli
a810: 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
a820: 7a 4d 61 73 74 65 72 29 29 20 29 7b 0a 20 20 20  zMaster)) ){.   
a830: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61 73   sqliteFree(zMas
a840: 74 65 72 29 3b 0a 20 20 20 20 7a 4d 61 73 74 65  ter);.    zMaste
a850: 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 72  r = 0;.    if( r
a860: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
a870: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
a880: 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c  .    goto end_pl
a890: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 73 71  ayback;.  }.  sq
a8a0: 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
a8b0: 67 65 72 2d 3e 6a 66 64 2c 20 30 29 3b 0a 20 20  ger->jfd, 0);.  
a8c0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
a8d0: 66 66 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68  ff = 0;..  /* Th
a8e0: 69 73 20 6c 6f 6f 70 20 74 65 72 6d 69 6e 61 74  is loop terminat
a8f0: 65 73 20 65 69 74 68 65 72 20 77 68 65 6e 20 74  es either when t
a900: 68 65 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  he readJournalHd
a910: 72 28 29 20 63 61 6c 6c 20 72 65 74 75 72 6e 73  r() call returns
a920: 0a 20 20 2a 2a 20 53 51 4c 49 54 45 5f 44 4f 4e  .  ** SQLITE_DON
a930: 45 20 6f 72 20 61 6e 20 49 4f 20 65 72 72 6f 72  E or an IO error
a940: 20 6f 63 63 75 72 73 2e 20 2a 2f 0a 20 20 77 68   occurs. */.  wh
a950: 69 6c 65 28 20 31 20 29 7b 0a 0a 20 20 20 20 2f  ile( 1 ){..    /
a960: 2a 20 52 65 61 64 20 74 68 65 20 6e 65 78 74 20  * Read the next 
a970: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66  journal header f
a980: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a990: 66 69 6c 65 2e 20 20 49 66 20 74 68 65 72 65 20  file.  If there 
a9a0: 61 72 65 0a 20 20 20 20 2a 2a 20 6e 6f 74 20 65  are.    ** not e
a9b0: 6e 6f 75 67 68 20 62 79 74 65 73 20 6c 65 66 74  nough bytes left
a9c0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
a9d0: 66 69 6c 65 20 66 6f 72 20 61 20 63 6f 6d 70 6c  file for a compl
a9e0: 65 74 65 20 68 65 61 64 65 72 2c 20 6f 72 0a 20  ete header, or. 
a9f0: 20 20 20 2a 2a 20 69 74 20 69 73 20 63 6f 72 72     ** it is corr
aa00: 75 70 74 65 64 2c 20 74 68 65 6e 20 61 20 70 72  upted, then a pr
aa10: 6f 63 65 73 73 20 6d 75 73 74 20 6f 66 20 66 61  ocess must of fa
aa20: 69 6c 65 64 20 77 68 69 6c 65 20 77 72 69 74 69  iled while writi
aa30: 6e 67 20 69 74 2e 0a 20 20 20 20 2a 2a 20 54 68  ng it..    ** Th
aa40: 69 73 20 69 6e 64 69 63 61 74 65 73 20 6e 6f 74  is indicates not
aa50: 68 69 6e 67 20 6d 6f 72 65 20 6e 65 65 64 73 20  hing more needs 
aa60: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
aa70: 6b 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72 63  k..    */.    rc
aa80: 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64   = readJournalHd
aa90: 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26  r(pPager, szJ, &
aaa0: 6e 52 65 63 2c 20 26 6d 78 50 67 29 3b 0a 20 20  nRec, &mxPg);.  
aab0: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
aac0: 5f 4f 4b 20 29 7b 20 0a 20 20 20 20 20 20 69 66  _OK ){ .      if
aad0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
aae0: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  E ){.        rc 
aaf0: 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20  = SQLITE_OK;.   
ab00: 20 20 20 7d 0a 20 20 20 20 20 20 67 6f 74 6f 20     }.      goto 
ab10: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
ab20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e    }..    /* If n
ab30: 52 65 63 20 69 73 20 30 78 66 66 66 66 66 66 66  Rec is 0xfffffff
ab40: 66 2c 20 74 68 65 6e 20 74 68 69 73 20 6a 6f 75  f, then this jou
ab50: 72 6e 61 6c 20 77 61 73 20 63 72 65 61 74 65 64  rnal was created
ab60: 20 62 79 20 61 20 70 72 6f 63 65 73 73 0a 20 20   by a process.  
ab70: 20 20 2a 2a 20 77 6f 72 6b 69 6e 67 20 69 6e 20    ** working in 
ab80: 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2e 20 54 68  no-sync mode. Th
ab90: 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  is means that th
aba0: 65 20 72 65 73 74 20 6f 66 20 74 68 65 20 6a 6f  e rest of the jo
abb0: 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 66 69 6c  urnal.    ** fil
abc0: 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 70 61  e consists of pa
abd0: 67 65 73 2c 20 74 68 65 72 65 20 61 72 65 20 6e  ges, there are n
abe0: 6f 20 6d 6f 72 65 20 6a 6f 75 72 6e 61 6c 20 68  o more journal h
abf0: 65 61 64 65 72 73 2e 20 43 6f 6d 70 75 74 65 0a  eaders. Compute.
ac00: 20 20 20 20 2a 2a 20 74 68 65 20 76 61 6c 75 65      ** the value
ac10: 20 6f 66 20 6e 52 65 63 20 62 61 73 65 64 20 6f   of nRec based o
ac20: 6e 20 74 68 69 73 20 61 73 73 75 6d 70 74 69 6f  n this assumptio
ac30: 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  n..    */.    if
ac40: 28 20 6e 52 65 63 3d 3d 30 78 66 66 66 66 66 66  ( nRec==0xffffff
ac50: 66 66 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  ff ){.      asse
ac60: 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
ac70: 6e 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f  nalOff==JOURNAL_
ac80: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29  HDR_SZ(pPager) )
ac90: 3b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28  ;.      nRec = (
aca0: 73 7a 4a 20 2d 20 4a 4f 55 52 4e 41 4c 5f 48 44  szJ - JOURNAL_HD
acb0: 52 5f 53 5a 28 70 50 61 67 65 72 29 29 2f 4a 4f  R_SZ(pPager))/JO
acc0: 55 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67  URNAL_PG_SZ(pPag
acd0: 65 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  er);.    }..    
ace0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
acf0: 65 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72  e first header r
ad00: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
ad10: 72 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74  rnal, truncate t
ad20: 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61  he.    ** databa
ad30: 73 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20  se file back to 
ad40: 69 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69  it's original si
ad50: 7a 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ze..    */.    i
ad60: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
ad70: 61 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48  alOff==JOURNAL_H
ad80: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b  DR_SZ(pPager) ){
ad90: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
ada0: 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
adb0: 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72 2d 3e  e==0 || pPager->
adc0: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 6d 78 50 67  origDbSize==mxPg
add0: 20 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   );.      rc = p
ade0: 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50  ager_truncate(pP
adf0: 61 67 65 72 2c 20 6d 78 50 67 29 3b 0a 20 20 20  ager, mxPg);.   
ae00: 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
ae10: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
ae20: 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63  goto end_playbac
ae30: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
ae40: 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20   pPager->dbSize 
ae50: 3d 20 6d 78 50 67 3b 0a 20 20 20 20 7d 0a 0a 20  = mxPg;.    }.. 
ae60: 20 20 20 2f 2a 20 72 63 20 3d 20 73 71 6c 69 74     /* rc = sqlit
ae70: 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
ae80: 2d 3e 6a 66 64 2c 20 4a 4f 55 52 4e 41 4c 5f 48  ->jfd, JOURNAL_H
ae90: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 29 3b 20  DR_SZ(pPager)); 
aea0: 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  */.    if( rc!=S
aeb0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
aec0: 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  end_playback;.  
aed0: 0a 20 20 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69  .    /* Copy ori
aee0: 67 69 6e 61 6c 20 70 61 67 65 73 20 6f 75 74 20  ginal pages out 
aef0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61  of the journal a
af00: 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74 68 65  nd back into the
af10: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
af20: 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69      */.    for(i
af30: 3d 30 3b 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29  =0; i<nRec; i++)
af40: 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
af50: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
af60: 70 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50  page(pPager, &pP
af70: 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20  ager->jfd, 1);. 
af80: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
af90: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
afa0: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
afb0: 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20 20  _DONE ){.       
afc0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
afd0: 4b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  K;.          pPa
afe0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
aff0: 3d 20 73 7a 4a 3b 0a 20 20 20 20 20 20 20 20 20  = szJ;.         
b000: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
b010: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
b020: 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61   goto end_playba
b030: 63 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ck;.        }.  
b040: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
b050: 0a 20 20 2f 2a 20 50 61 67 65 73 20 74 68 61 74  .  /* Pages that
b060: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
b070: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
b080: 6c 20 62 75 74 20 6e 65 76 65 72 20 73 79 6e 63  l but never sync
b090: 65 64 0a 20 20 2a 2a 20 77 68 65 72 65 20 6e 6f  ed.  ** where no
b0a0: 74 20 72 65 73 74 6f 72 65 64 20 62 79 20 74 68  t restored by th
b0b0: 65 20 6c 6f 6f 70 20 61 62 6f 76 65 2e 20 20 57  e loop above.  W
b0c0: 65 20 68 61 76 65 20 74 6f 20 72 65 73 74 6f 72  e have to restor
b0d0: 65 20 74 68 6f 73 65 0a 20 20 2a 2a 20 70 61 67  e those.  ** pag
b0e0: 65 73 20 62 79 20 72 65 61 64 69 6e 67 20 74 68  es by reading th
b0f0: 65 6d 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65  em back from the
b100: 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
b110: 73 65 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72  se..  */.  asser
b120: 74 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  t( rc==SQLITE_OK
b130: 20 29 3b 0a 20 20 70 61 67 65 72 5f 72 65 6c 6f   );.  pager_relo
b140: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
b150: 3b 0a 0a 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3a  ;..end_playback:
b160: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
b170: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
b180: 20 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f   pager_unwritelo
b190: 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  ck(pPager);.  }.
b1a0: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b    if( zMaster ){
b1b0: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
b1c0: 20 77 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f   was a master jo
b1d0: 75 72 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72  urnal and this r
b1e0: 6f 75 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75  outine will retu
b1f0: 72 6e 20 74 72 75 65 2c 0a 20 20 20 20 2a 2a 20  rn true,.    ** 
b200: 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f 73  see if it is pos
b210: 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20  sible to delete 
b220: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
b230: 61 6c 2e 20 49 66 20 65 72 72 6f 72 73 20 0a 20  al. If errors . 
b240: 20 20 20 2a 2a 20 6f 63 63 75 72 20 64 75 72 69     ** occur duri
b250: 6e 67 20 74 68 69 73 20 70 72 6f 63 65 73 73 2c  ng this process,
b260: 20 69 67 6e 6f 72 65 20 74 68 65 6d 2e 0a 20 20   ignore them..  
b270: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d    */.    if( rc=
b280: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
b290: 20 20 20 20 70 61 67 65 72 5f 64 65 6c 6d 61 73      pager_delmas
b2a0: 74 65 72 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ter(zMaster);.  
b2b0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 46 72    }.    sqliteFr
b2c0: 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20 7d  ee(zMaster);.  }
b2d0: 0a 0a 20 20 2f 2a 20 54 68 65 20 50 61 67 65 72  ..  /* The Pager
b2e0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 76 61 72 69  .sectorSize vari
b2f0: 61 62 6c 65 20 6d 61 79 20 68 61 76 65 20 62 65  able may have be
b300: 65 6e 20 75 70 64 61 74 65 64 20 77 68 69 6c 65  en updated while
b310: 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a 2a 20 62 61   rolling.  ** ba
b320: 63 6b 20 61 20 6a 6f 75 72 6e 61 6c 20 63 72 65  ck a journal cre
b330: 61 74 65 64 20 62 79 20 61 20 70 72 6f 63 65 73  ated by a proces
b340: 73 20 77 69 74 68 20 61 20 64 69 66 66 65 72 65  s with a differe
b350: 6e 74 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f  nt PAGER_SECTOR_
b360: 53 49 5a 45 0a 20 20 2a 2a 20 76 61 6c 75 65 2e  SIZE.  ** value.
b370: 20 52 65 73 65 74 20 69 74 20 74 6f 20 74 68 65   Reset it to the
b380: 20 63 6f 72 72 65 63 74 20 76 61 6c 75 65 20 66   correct value f
b390: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 2e  or this process.
b3a0: 0a 20 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e  .  */.  pPager->
b3b0: 73 65 63 74 6f 72 53 69 7a 65 20 3d 20 50 41 47  sectorSize = PAG
b3c0: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a  ER_SECTOR_SIZE;.
b3d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
b3e0: 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b 20 74  /*.** Playback t
b3f0: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
b400: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rnal..**.** This
b410: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
b420: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
b430: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
b440: 6e 61 6c 20 62 75 74 20 77 69 74 68 0a 2a 2a 20  nal but with.** 
b450: 61 20 66 65 77 20 65 78 74 72 61 20 74 77 69 73  a few extra twis
b460: 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 31 29  ts..**.**    (1)
b470: 20 20 54 68 65 20 6e 75 6d 62 65 72 20 6f 66 20    The number of 
b480: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 61 74  pages in the dat
b490: 61 62 61 73 65 20 66 69 6c 65 20 61 74 20 74 68  abase file at th
b4a0: 65 20 73 74 61 72 74 20 6f 66 0a 2a 2a 20 20 20  e start of.**   
b4b0: 20 20 20 20 20 20 74 68 65 20 73 74 61 74 65 6d        the statem
b4c0: 65 6e 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ent is stored in
b4d0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
b4e0: 65 2c 20 6e 6f 74 20 69 6e 20 74 68 65 0a 2a 2a  e, not in the.**
b4f0: 20 20 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c           journal
b500: 20 66 69 6c 65 20 69 74 73 65 6c 66 2e 0a 2a 2a   file itself..**
b510: 0a 2a 2a 20 20 20 20 28 32 29 20 20 49 6e 20 61  .**    (2)  In a
b520: 64 64 69 74 69 6f 6e 20 74 6f 20 70 6c 61 79 69  ddition to playi
b530: 6e 67 20 62 61 63 6b 20 74 68 65 20 73 74 61 74  ng back the stat
b540: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2c 20 61  ement journal, a
b550: 6c 73 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20 70  lso.**         p
b560: 6c 61 79 62 61 63 6b 20 61 6c 6c 20 70 61 67 65  layback all page
b570: 73 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63  s of the transac
b580: 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 62 65 67  tion journal beg
b590: 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  inning.**       
b5a0: 20 20 61 74 20 6f 66 66 73 65 74 20 70 50 61 67    at offset pPag
b5b0: 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 2e 0a 2a  er->stmtJSize..*
b5c0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
b5d0: 65 72 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b  er_stmt_playback
b5e0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
b5f0: 0a 20 20 69 36 34 20 73 7a 4a 3b 20 20 20 20 20  .  i64 szJ;     
b600: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
b610: 69 7a 65 20 6f 66 20 74 68 65 20 66 75 6c 6c 20  ize of the full 
b620: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36 34  journal */.  i64
b630: 20 68 64 72 4f 66 66 3b 0a 20 20 69 6e 74 20 6e   hdrOff;.  int n
b640: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
b650: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
b660: 20 52 65 63 6f 72 64 73 20 2a 2f 0a 20 20 69 6e   Records */.  in
b670: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
b680: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
b690: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
b6a0: 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d 20 70 50 61  rc;..  szJ = pPa
b6b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b  ger->journalOff;
b6c0: 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 20  .#ifndef NDEBUG 
b6d0: 0a 20 20 7b 0a 20 20 20 20 69 36 34 20 6f 73 5f  .  {.    i64 os_
b6e0: 73 7a 4a 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  szJ;.    rc = sq
b6f0: 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
b700: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 6f  &pPager->jfd, &o
b710: 73 5f 73 7a 4a 29 3b 0a 20 20 20 20 69 66 28 20  s_szJ);.    if( 
b720: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
b730: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 61  return rc;.    a
b740: 73 73 65 72 74 28 20 73 7a 4a 3d 3d 6f 73 5f 73  ssert( szJ==os_s
b750: 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  zJ );.  }.#endif
b760: 0a 0a 20 20 2f 2a 20 53 65 74 20 68 64 72 4f 66  ..  /* Set hdrOf
b770: 66 20 74 6f 20 62 65 20 74 68 65 20 6f 66 66 73  f to be the offs
b780: 65 74 20 74 6f 20 74 68 65 20 66 69 72 73 74 20  et to the first 
b790: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77  journal header w
b7a0: 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74 68 69 73  ritten.  ** this
b7b0: 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73   statement trans
b7c0: 61 63 74 69 6f 6e 2c 20 6f 72 20 74 68 65 20 65  action, or the e
b7d0: 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  nd of the file i
b7e0: 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c 0a 20 20 2a  f no journal.  *
b7f0: 2a 20 68 65 61 64 65 72 20 77 61 73 20 77 72 69  * header was wri
b800: 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20 20 68 64 72  tten..  */.  hdr
b810: 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Off = pPager->st
b820: 6d 74 48 64 72 4f 66 66 3b 0a 20 20 61 73 73 65  mtHdrOff;.  asse
b830: 72 74 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  rt( pPager->full
b840: 53 79 6e 63 20 7c 7c 20 21 68 64 72 4f 66 66 20  Sync || !hdrOff 
b850: 29 3b 0a 20 20 69 66 28 20 21 68 64 72 4f 66 66  );.  if( !hdrOff
b860: 20 29 7b 0a 20 20 20 20 68 64 72 4f 66 66 20 3d   ){.    hdrOff =
b870: 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20 0a 0a 20 20   szJ;.  }.  ..  
b880: 2f 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20  /* Truncate the 
b890: 64 61 74 61 62 61 73 65 20 62 61 63 6b 20 74 6f  database back to
b8a0: 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 20 73 69   its original si
b8b0: 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ze..  */.  rc = 
b8c0: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 28 70  pager_truncate(p
b8d0: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 73  Pager, pPager->s
b8e0: 74 6d 74 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  tmtSize);.  pPag
b8f0: 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61  er->dbSize = pPa
b900: 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 0a  ger->stmtSize;..
b910: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
b920: 68 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73  how many records
b930: 20 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74   are in the stat
b940: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20  ement journal.. 
b950: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
b960: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
b970: 26 26 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  && pPager->journ
b980: 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 73 71 6c 69  alOpen );.  sqli
b990: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
b9a0: 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20 20 6e  r->stfd, 0);.  n
b9b0: 52 65 63 20 3d 20 70 50 61 67 65 72 2d 3e 73 74  Rec = pPager->st
b9c0: 6d 74 4e 52 65 63 3b 0a 20 20 0a 20 20 2f 2a 20  mtNRec;.  .  /* 
b9d0: 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70 61  Copy original pa
b9e0: 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20 73  ges out of the s
b9f0: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
ba00: 20 61 6e 64 20 62 61 63 6b 20 69 6e 74 6f 20 74   and back into t
ba10: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
ba20: 20 66 69 6c 65 2e 20 20 4e 6f 74 65 20 74 68 61   file.  Note tha
ba30: 74 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20  t the statement 
ba40: 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74 73 20 63 68  journal omits ch
ba50: 65 63 6b 73 75 6d 73 20 66 72 6f 6d 0a 20 20 2a  ecksums from.  *
ba60: 2a 20 65 61 63 68 20 72 65 63 6f 72 64 20 73 69  * each record si
ba70: 6e 63 65 20 70 6f 77 65 72 2d 66 61 69 6c 75 72  nce power-failur
ba80: 65 20 72 65 63 6f 76 65 72 79 20 69 73 20 6e 6f  e recovery is no
ba90: 74 20 69 6d 70 6f 72 74 61 6e 74 20 74 6f 20 73  t important to s
baa0: 74 61 74 65 6d 65 6e 74 0a 20 20 2a 2a 20 6a 6f  tatement.  ** jo
bab0: 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f 0a 20 20 66  urnals..  */.  f
bac0: 6f 72 28 69 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d  or(i=nRec-1; i>=
bad0: 30 3b 20 69 2d 2d 29 7b 0a 20 20 20 20 72 63 20  0; i--){.    rc 
bae0: 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
baf0: 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65 72  _one_page(pPager
bb00: 2c 20 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c  , &pPager->stfd,
bb10: 20 30 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   0);.    assert(
bb20: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
bb30: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
bb40: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
bb50: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
bb60: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 4e 6f  ck;.  }..  /* No
bb70: 77 20 72 6f 6c 6c 20 73 6f 6d 65 20 70 61 67 65  w roll some page
bb80: 73 20 62 61 63 6b 20 66 72 6f 6d 20 74 68 65 20  s back from the 
bb90: 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72  transaction jour
bba0: 6e 61 6c 2e 20 50 61 67 65 72 2e 73 74 6d 74 4a  nal. Pager.stmtJ
bbb0: 53 69 7a 65 0a 20 20 2a 2a 20 77 61 73 20 74 68  Size.  ** was th
bbc0: 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f  e size of the jo
bbd0: 75 72 6e 61 6c 20 66 69 6c 65 20 77 68 65 6e 20  urnal file when 
bbe0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 77  this statement w
bbf0: 61 73 20 73 74 61 72 74 65 64 2c 20 73 6f 0a 20  as started, so. 
bc00: 20 2a 2a 20 65 76 65 72 79 74 68 69 6e 67 20 61   ** everything a
bc10: 66 74 65 72 20 74 68 61 74 20 6e 65 65 64 73 20  fter that needs 
bc20: 74 6f 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  to be rolled bac
bc30: 6b 2c 20 65 69 74 68 65 72 20 69 6e 74 6f 20 74  k, either into t
bc40: 68 65 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65  he.  ** database
bc50: 2c 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 61 63  , the memory cac
bc60: 68 65 2c 20 6f 72 20 62 6f 74 68 2e 0a 20 20 2a  he, or both..  *
bc70: 2a 0a 20 20 2a 2a 20 49 66 20 69 74 20 69 73 20  *.  ** If it is 
bc80: 6e 6f 74 20 7a 65 72 6f 2c 20 74 68 65 6e 20 50  not zero, then P
bc90: 61 67 65 72 2e 73 74 6d 74 48 64 72 4f 66 66 20  ager.stmtHdrOff 
bca0: 69 73 20 74 68 65 20 6f 66 66 73 65 74 20 74 6f  is the offset to
bcb0: 20 74 68 65 20 73 74 61 72 74 0a 20 20 2a 2a 20   the start.  ** 
bcc0: 6f 66 20 74 68 65 20 66 69 72 73 74 20 6a 6f 75  of the first jou
bcd0: 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69 74  rnal header writ
bce0: 74 65 6e 20 64 75 72 69 6e 67 20 74 68 69 73 20  ten during this 
bcf0: 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e 73 61  statement transa
bd00: 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a 20 20 72 63  ction..  */.  rc
bd10: 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b   = sqlite3OsSeek
bd20: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70  (&pPager->jfd, p
bd30: 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
bd40: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
bd50: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
bd60: 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79  to end_stmt_play
bd70: 62 61 63 6b 3b 0a 20 20 7d 0a 20 20 70 50 61 67  back;.  }.  pPag
bd80: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d  er->journalOff =
bd90: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
bda0: 7a 65 3b 0a 20 20 70 50 61 67 65 72 2d 3e 63 6b  ze;.  pPager->ck
bdb0: 73 75 6d 49 6e 69 74 20 3d 20 70 50 61 67 65 72  sumInit = pPager
bdc0: 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b 0a 20 20 61  ->stmtCksum;.  a
bdd0: 73 73 65 72 74 28 20 4a 4f 55 52 4e 41 4c 5f 48  ssert( JOURNAL_H
bde0: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3c 28 70  DR_SZ(pPager)<(p
bdf0: 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b  Pager->pageSize+
be00: 38 29 20 29 3b 0a 20 20 77 68 69 6c 65 28 20 70  8) );.  while( p
be10: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
be20: 66 20 3c 3d 20 28 68 64 72 4f 66 66 2d 28 70 50  f <= (hdrOff-(pP
be30: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38  ager->pageSize+8
be40: 29 29 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  )) ){.    rc = p
be50: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e  ager_playback_on
be60: 65 5f 70 61 67 65 28 70 50 61 67 65 72 2c 20 26  e_page(pPager, &
be70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b  pPager->jfd, 1);
be80: 0a 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21  .    assert( rc!
be90: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
bea0: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
beb0: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
bec0: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
bed0: 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20 70 50    }..  while( pP
bee0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
bef0: 20 3c 20 73 7a 4a 20 29 7b 0a 20 20 20 20 75 33   < szJ ){.    u3
bf00: 32 20 6e 52 65 63 3b 0a 20 20 20 20 75 33 32 20  2 nRec;.    u32 
bf10: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
bf20: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
bf30: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 52 65  Pager, szJ, &nRe
bf40: 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20 20  c, &dummy);.    
bf50: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
bf60: 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  K ){.      asser
bf70: 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  t( rc!=SQLITE_DO
bf80: 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  NE );.      goto
bf90: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
bfa0: 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ck;.    }.    if
bfb0: 28 20 6e 52 65 63 3d 3d 30 20 29 7b 0a 20 20 20  ( nRec==0 ){.   
bfc0: 20 20 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d     nRec = (szJ -
bfd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
bfe0: 4f 66 66 29 20 2f 20 28 70 50 61 67 65 72 2d 3e  Off) / (pPager->
bff0: 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a 20 20 20  pageSize+8);.   
c000: 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 6e 52 65   }.    for(i=nRe
c010: 63 2d 31 3b 20 69 3e 3d 30 20 26 26 20 70 50 61  c-1; i>=0 && pPa
c020: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
c030: 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b 0a 20 20 20  < szJ; i--){.   
c040: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c     rc = pager_pl
c050: 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28  ayback_one_page(
c060: 70 50 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d  pPager, &pPager-
c070: 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  >jfd, 1);.      
c080: 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49  assert( rc!=SQLI
c090: 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20  TE_DONE );.     
c0a0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
c0b0: 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73 74  OK ) goto end_st
c0c0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  mt_playback;.   
c0d0: 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61 67 65 72   }.  }..  pPager
c0e0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73  ->journalOff = s
c0f0: 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74 6d 74 5f  zJ;.  .end_stmt_
c100: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
c110: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
c120: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
c130: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
c140: 52 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20 72  R_CORRUPT;.    r
c150: 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  c = SQLITE_CORRU
c160: 50 54 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52  PT;  /* bkpt-COR
c170: 52 55 50 54 20 2a 2f 0a 20 20 7d 65 6c 73 65 7b  RUPT */.  }else{
c180: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  .    pPager->jou
c190: 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20  rnalOff = szJ;. 
c1a0: 20 20 20 2f 2a 20 70 61 67 65 72 5f 72 65 6c 6f     /* pager_relo
c1b0: 61 64 5f 63 61 63 68 65 28 70 50 61 67 65 72 29  ad_cache(pPager)
c1c0: 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65 74 75 72  ; */.  }.  retur
c1d0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  n rc;.}../*.** C
c1e0: 68 61 6e 67 65 20 74 68 65 20 6d 61 78 69 6d 75  hange the maximu
c1f0: 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69 6e 2d 6d  m number of in-m
c200: 65 6d 6f 72 79 20 70 61 67 65 73 20 74 68 61 74  emory pages that
c210: 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2a   are allowed..**
c220: 0a 2a 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d 20  .** The maximum 
c230: 6e 75 6d 62 65 72 20 69 73 20 74 68 65 20 61 62  number is the ab
c240: 73 6f 6c 75 74 65 20 76 61 6c 75 65 20 6f 66 20  solute value of 
c250: 74 68 65 20 6d 78 50 61 67 65 20 70 61 72 61 6d  the mxPage param
c260: 65 74 65 72 2e 0a 2a 2a 20 49 66 20 6d 78 50 61  eter..** If mxPa
c270: 67 65 20 69 73 20 6e 65 67 61 74 69 76 65 2c 20  ge is negative, 
c280: 74 68 65 20 6e 6f 53 79 6e 63 20 66 6c 61 67 20  the noSync flag 
c290: 69 73 20 61 6c 73 6f 20 73 65 74 2e 20 20 6e 6f  is also set.  no
c2a0: 53 79 6e 63 20 62 79 70 61 73 73 65 73 0a 2a 2a  Sync bypasses.**
c2b0: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
c2c0: 33 4f 73 53 79 6e 63 28 29 2e 20 20 54 68 65 20  3OsSync().  The 
c2d0: 70 61 67 65 72 20 72 75 6e 73 20 6d 75 63 68 20  pager runs much 
c2e0: 66 61 73 74 65 72 20 77 69 74 68 20 6e 6f 53 79  faster with noSy
c2f0: 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75 74 20 69 66  nc on,.** but if
c300: 20 74 68 65 20 6f 70 65 72 61 74 69 6e 67 20 73   the operating s
c310: 79 73 74 65 6d 20 63 72 61 73 68 65 73 20 6f 72  ystem crashes or
c320: 20 74 68 65 72 65 20 69 73 20 61 6e 20 61 62 72   there is an abr
c330: 75 70 74 20 70 6f 77 65 72 20 0a 2a 2a 20 66 61  upt power .** fa
c340: 69 6c 75 72 65 2c 20 74 68 65 20 64 61 74 61 62  ilure, the datab
c350: 61 73 65 20 66 69 6c 65 20 6d 69 67 68 74 20 62  ase file might b
c360: 65 20 6c 65 66 74 20 69 6e 20 61 6e 20 69 6e 63  e left in an inc
c370: 6f 6e 73 69 73 74 65 6e 74 20 61 6e 64 0a 2a 2a  onsistent and.**
c380: 20 75 6e 72 65 70 61 69 72 61 62 6c 65 20 73 74   unrepairable st
c390: 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f 69 64 20 73  ate.  .*/.void s
c3a0: 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f  qlite3pager_set_
c3b0: 63 61 63 68 65 73 69 7a 65 28 50 61 67 65 72 20  cachesize(Pager 
c3c0: 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 6d 78 50  *pPager, int mxP
c3d0: 61 67 65 29 7b 0a 20 20 69 66 28 20 6d 78 50 61  age){.  if( mxPa
c3e0: 67 65 3e 3d 30 20 29 7b 0a 20 20 20 20 70 50 61  ge>=0 ){.    pPa
c3f0: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 70 50  ger->noSync = pP
c400: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a  ager->tempFile;.
c410: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
c420: 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65 72 2d  noSync ) pPager-
c430: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 20 0a  >needSync = 0; .
c440: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61    }else{.    pPa
c450: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 31 3b  ger->noSync = 1;
c460: 0a 20 20 20 20 6d 78 50 61 67 65 20 3d 20 2d 6d  .    mxPage = -m
c470: 78 50 61 67 65 3b 0a 20 20 7d 0a 20 20 69 66 28  xPage;.  }.  if(
c480: 20 6d 78 50 61 67 65 3e 31 30 20 29 7b 0a 20 20   mxPage>10 ){.  
c490: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
c4a0: 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 65 6c   = mxPage;.  }el
c4b0: 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  se{.    pPager->
c4c0: 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a 20 20 7d  mxPage = 10;.  }
c4d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a 75 73 74  .}../*.** Adjust
c4e0: 20 74 68 65 20 72 6f 62 75 73 74 6e 65 73 73 20   the robustness 
c4f0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
c500: 74 6f 20 64 61 6d 61 67 65 20 64 75 65 20 74 6f  to damage due to
c510: 20 4f 53 20 63 72 61 73 68 65 73 0a 2a 2a 20 6f   OS crashes.** o
c520: 72 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 73  r power failures
c530: 20 62 79 20 63 68 61 6e 67 69 6e 67 20 74 68 65   by changing the
c540: 20 6e 75 6d 62 65 72 20 6f 66 20 73 79 6e 63 73   number of syncs
c550: 28 29 73 20 77 68 65 6e 20 77 72 69 74 69 6e 67  ()s when writing
c560: 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b  .** the rollback
c570: 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68 65 72 65   journal.  There
c580: 20 61 72 65 20 74 68 72 65 65 20 6c 65 76 65 6c   are three level
c590: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f 46 46 20  s:.**.**    OFF 
c5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53        sqlite3OsS
c5b0: 79 6e 63 28 29 20 69 73 20 6e 65 76 65 72 20 63  ync() is never c
c5c0: 61 6c 6c 65 64 2e 20 20 54 68 69 73 20 69 73 20  alled.  This is 
c5d0: 74 68 65 20 64 65 66 61 75 6c 74 0a 2a 2a 20 20  the default.**  
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
c5f0: 74 65 6d 70 6f 72 61 72 79 20 61 6e 64 20 74 72  temporary and tr
c600: 61 6e 73 69 65 6e 74 20 66 69 6c 65 73 2e 0a 2a  ansient files..*
c610: 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41 4c 20 20  *.**    NORMAL  
c620: 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73    The journal is
c630: 20 73 79 6e 63 65 64 20 6f 6e 63 65 20 62 65 66   synced once bef
c640: 6f 72 65 20 77 72 69 74 65 73 20 62 65 67 69 6e  ore writes begin
c650: 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   on the.**      
c660: 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
c670: 2e 20 20 54 68 69 73 20 69 73 20 6e 6f 72 6d 61  .  This is norma
c680: 6c 6c 79 20 61 64 65 71 75 61 74 65 20 70 72 6f  lly adequate pro
c690: 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20  tection, but.** 
c6a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 74 20               it 
c6b0: 69 73 20 74 68 65 6f 72 65 74 69 63 61 6c 6c 79  is theoretically
c6c0: 20 70 6f 73 73 69 62 6c 65 2c 20 74 68 6f 75 67   possible, thoug
c6d0: 68 20 76 65 72 79 20 75 6e 6c 69 6b 65 6c 79 2c  h very unlikely,
c6e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c6f0: 20 74 68 61 74 20 61 6e 20 69 6e 6f 70 65 72 74   that an inopert
c700: 75 6e 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72  une power failur
c710: 65 20 63 6f 75 6c 64 20 6c 65 61 76 65 20 74 68  e could leave th
c720: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20  e journal.**    
c730: 20 20 20 20 20 20 20 20 20 20 69 6e 20 61 20 73            in a s
c740: 74 61 74 65 20 77 68 69 63 68 20 77 6f 75 6c 64  tate which would
c750: 20 63 61 75 73 65 20 64 61 6d 61 67 65 20 74 6f   cause damage to
c760: 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
c770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 68                wh
c780: 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c 65 64 20  en it is rolled 
c790: 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 46  back..**.**    F
c7a0: 55 4c 4c 20 20 20 20 20 20 54 68 65 20 6a 6f 75  ULL      The jou
c7b0: 72 6e 61 6c 20 69 73 20 73 79 6e 63 65 64 20 74  rnal is synced t
c7c0: 77 69 63 65 20 62 65 66 6f 72 65 20 77 72 69 74  wice before writ
c7d0: 65 73 20 62 65 67 69 6e 20 6f 6e 20 74 68 65 0a  es begin on the.
c7e0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c7f0: 64 61 74 61 62 61 73 65 20 28 77 69 74 68 20 73  database (with s
c800: 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  ome additional i
c810: 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20 74 68 65  nformation - the
c820: 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a 2a 20 20   nRec field.**  
c830: 20 20 20 20 20 20 20 20 20 20 20 20 6f 66 20 74              of t
c840: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65  he journal heade
c850: 72 20 2d 20 62 65 69 6e 67 20 77 72 69 74 74 65  r - being writte
c860: 6e 20 69 6e 20 62 65 74 77 65 65 6e 20 74 68 65  n in between the
c870: 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20 20 20 20   two.**         
c880: 20 20 20 20 20 73 79 6e 63 73 29 2e 20 20 49 66       syncs).  If
c890: 20 77 65 20 61 73 73 75 6d 65 20 74 68 61 74 20   we assume that 
c8a0: 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20 20 20 20  writing a.**    
c8b0: 20 20 20 20 20 20 20 20 20 20 73 69 6e 67 6c 65            single
c8c0: 20 64 69 73 6b 20 73 65 63 74 6f 72 20 69 73 20   disk sector is 
c8d0: 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20 74 68 69  atomic, then thi
c8e0: 73 20 6d 6f 64 65 20 70 72 6f 76 69 64 65 73 0a  s mode provides.
c8f0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c900: 61 73 73 75 72 61 6e 63 65 20 74 68 61 74 20 74  assurance that t
c910: 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69 6c 6c 20  he journal will 
c920: 6e 6f 74 20 62 65 20 63 6f 72 72 75 70 74 65 64  not be corrupted
c930: 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20   to the.**      
c940: 20 20 20 20 20 20 20 20 70 6f 69 6e 74 20 6f 66          point of
c950: 20 63 61 75 73 69 6e 67 20 64 61 6d 61 67 65 20   causing damage 
c960: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
c970: 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b 2e  during rollback.
c980: 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69 63 20 76  .**.** Numeric v
c990: 61 6c 75 65 73 20 61 73 73 6f 63 69 61 74 65 64  alues associated
c9a0: 20 77 69 74 68 20 74 68 65 73 65 20 73 74 61 74   with these stat
c9b0: 65 73 20 61 72 65 20 4f 46 46 3d 3d 31 2c 20 4e  es are OFF==1, N
c9c0: 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61 6e 64 20  ORMAL=2,.** and 
c9d0: 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 76 6f 69 64 20  FULL=3..*/.void 
c9e0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
c9f0: 5f 73 61 66 65 74 79 5f 6c 65 76 65 6c 28 50 61  _safety_level(Pa
ca00: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
ca10: 20 6c 65 76 65 6c 29 7b 0a 20 20 70 50 61 67 65   level){.  pPage
ca20: 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c 65 76  r->noSync =  lev
ca30: 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65 72 2d  el==1 || pPager-
ca40: 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70 50 61  >tempFile;.  pPa
ca50: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 3d 20  ger->fullSync = 
ca60: 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70 50 61  level==3 && !pPa
ca70: 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20  ger->tempFile;. 
ca80: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 6f 53   if( pPager->noS
ca90: 79 6e 63 20 29 20 70 50 61 67 65 72 2d 3e 6e 65  ync ) pPager->ne
caa0: 65 64 53 79 6e 63 20 3d 20 30 3b 0a 7d 0a 0a 2f  edSync = 0;.}../
cab0: 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70  *.** Open a temp
cac0: 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 57 72 69  orary file.  Wri
cad0: 74 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  te the name of t
cae0: 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61  he file into zNa
caf0: 6d 65 0a 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73  me.** (zName mus
cb00: 74 20 62 65 20 61 74 20 6c 65 61 73 74 20 53 51  t be at least SQ
cb10: 4c 49 54 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49  LITE_TEMPNAME_SI
cb20: 5a 45 20 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20  ZE bytes long.) 
cb30: 20 57 72 69 74 65 0a 2a 2a 20 74 68 65 20 66 69   Write.** the fi
cb40: 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20 69 6e  le descriptor in
cb50: 74 6f 20 2a 66 64 2e 20 20 52 65 74 75 72 6e 20  to *fd.  Return 
cb60: 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
cb70: 63 65 73 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20  cess or some.** 
cb80: 6f 74 68 65 72 20 65 72 72 6f 72 20 63 6f 64 65  other error code
cb90: 20 69 66 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a   if we fail..**.
cba0: 2a 2a 20 54 68 65 20 4f 53 20 77 69 6c 6c 20 61  ** The OS will a
cbb0: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c  utomatically del
cbc0: 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
cbd0: 79 20 66 69 6c 65 20 77 68 65 6e 20 69 74 20 69  y file when it i
cbe0: 73 0a 2a 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a  s.** closed..*/.
cbf0: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
cc00: 65 33 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70  e3pager_opentemp
cc10: 28 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73  (char *zFile, Os
cc20: 46 69 6c 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74  File *fd){.  int
cc30: 20 63 6e 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20   cnt = 8;.  int 
cc40: 72 63 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e  rc;.  do{.    cn
cc50: 74 2d 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  t--;.    sqlite3
cc60: 4f 73 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a  OsTempFileName(z
cc70: 46 69 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20  File);.    rc = 
cc80: 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63  sqlite3OsOpenExc
cc90: 6c 75 73 69 76 65 28 7a 46 69 6c 65 2c 20 66 64  lusive(zFile, fd
cca0: 2c 20 31 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  , 1);.  }while( 
ccb0: 63 6e 74 3e 30 20 26 26 20 72 63 21 3d 53 51 4c  cnt>0 && rc!=SQL
ccc0: 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
ccd0: 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20  LITE_NOMEM );.  
cce0: 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
ccf0: 0a 2a 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77  .** Create a new
cd00: 20 70 61 67 65 20 63 61 63 68 65 20 61 6e 64 20   page cache and 
cd10: 70 75 74 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  put a pointer to
cd20: 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 20   the page cache 
cd30: 69 6e 20 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20  in *ppPager..** 
cd40: 54 68 65 20 66 69 6c 65 20 74 6f 20 62 65 20 63  The file to be c
cd50: 61 63 68 65 64 20 6e 65 65 64 20 6e 6f 74 20 65  ached need not e
cd60: 78 69 73 74 2e 20 20 54 68 65 20 66 69 6c 65 20  xist.  The file 
cd70: 69 73 20 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e  is not locked un
cd80: 74 69 6c 0a 2a 2a 20 74 68 65 20 66 69 72 73 74  til.** the first
cd90: 20 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33   call to sqlite3
cda0: 70 61 67 65 72 5f 67 65 74 28 29 20 61 6e 64 20  pager_get() and 
cdb0: 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65  is only held ope
cdc0: 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c  n until the.** l
cdd0: 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
cde0: 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74  ased using sqlit
cdf0: 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e  e3pager_unref().
ce00: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e  .**.** If zFilen
ce10: 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e  ame is NULL then
ce20: 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65   a randomly-name
ce30: 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  d temporary file
ce40: 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a 20 61   is created.** a
ce50: 6e 64 20 75 73 65 64 20 61 73 20 74 68 65 20 66  nd used as the f
ce60: 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68 65 64  ile to be cached
ce70: 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69 6c 6c  .  The file will
ce80: 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61   be deleted.** a
ce90: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77 68 65  utomatically whe
cea0: 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a  n it is closed..
ceb0: 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61  **.** If zFilena
cec0: 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22  me is ":memory:"
ced0: 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d   then all inform
cee0: 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e  ation is held in
cef0: 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73   cache..** It is
cf00: 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e 20 74   never written t
cf10: 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20 63 61  o disk.  This ca
cf20: 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69 6d 70  n be used to imp
cf30: 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d  lement an.** in-
cf40: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
cf50: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
cf60: 61 67 65 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67  ager_open(.  Pag
cf70: 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20 20  er **ppPager,   
cf80: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
cf90: 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
cfa0: 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f  ure here */.  co
cfb0: 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e  nst char *zFilen
cfc0: 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ame,   /* Name o
cfd0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
cfe0: 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20  ile to open */. 
cff0: 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20 20   int nExtra,    
d000: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 74            /* Ext
d010: 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64 20  ra bytes append 
d020: 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72  to each in-memor
d030: 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20  y page */.  int 
d040: 75 73 65 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20  useJournal      
d050: 20 20 20 20 20 2f 2a 20 54 52 55 45 20 74 6f 20       /* TRUE to 
d060: 75 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  use a rollback j
d070: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
d080: 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65  ile */.){.  Page
d090: 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 63 68 61  r *pPager;.  cha
d0a0: 72 20 2a 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  r *zFullPathname
d0b0: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65   = 0;.  int name
d0c0: 4c 65 6e 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64  Len;.  OsFile fd
d0d0: 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
d0e0: 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b  ITE_OK;.  int i;
d0f0: 0a 20 20 69 6e 74 20 74 65 6d 70 46 69 6c 65 20  .  int tempFile 
d100: 3d 20 30 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62  = 0;.  int memDb
d110: 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
d120: 4f 6e 6c 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  Only = 0;.  char
d130: 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45   zTemp[SQLITE_TE
d140: 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20  MPNAME_SIZE];.. 
d150: 20 2a 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 20   *ppPager = 0;. 
d160: 20 6d 65 6d 73 65 74 28 26 66 64 2c 20 30 2c 20   memset(&fd, 0, 
d170: 73 69 7a 65 6f 66 28 66 64 29 29 3b 0a 20 20 69  sizeof(fd));.  i
d180: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
d190: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
d1a0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
d1b0: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  MEM;.  }.  if( z
d1c0: 46 69 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c  Filename && zFil
d1d0: 65 6e 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e  ename[0] ){.#ifn
d1e0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
d1f0: 4d 45 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28  MEMORYDB.    if(
d200: 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d   strcmp(zFilenam
d210: 65 2c 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30  e,":memory:")==0
d220: 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20   ){.      memDb 
d230: 3d 20 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c  = 1;.      zFull
d240: 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74  Pathname = sqlit
d250: 65 53 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20  eStrDup("");.   
d260: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f     rc = SQLITE_O
d270: 4b 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e  K;.    }else.#en
d280: 64 69 66 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  dif.    {.      
d290: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
d2a0: 73 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74  sqlite3OsFullPat
d2b0: 68 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29  hname(zFilename)
d2c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 75 6c  ;.      if( zFul
d2d0: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
d2e0: 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
d2f0: 33 4f 73 4f 70 65 6e 52 65 61 64 57 72 69 74 65  3OsOpenReadWrite
d300: 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20  (zFullPathname, 
d310: 26 66 64 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b  &fd, &readOnly);
d320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
d330: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
d340: 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 70   sqlite3pager_op
d350: 65 6e 74 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66  entemp(zTemp, &f
d360: 64 29 3b 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d  d);.    zFilenam
d370: 65 20 3d 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a  e = zTemp;.    z
d380: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73  FullPathname = s
d390: 71 6c 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68  qlite3OsFullPath
d3a0: 6e 61 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  name(zFilename);
d3b0: 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
d3c0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
d3d0: 74 65 6d 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20  tempFile = 1;.  
d3e0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a    }.  }.  if( !z
d3f0: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a  FullPathname ){.
d400: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
d410: 73 65 28 26 66 64 29 3b 0a 20 20 20 20 72 65 74  se(&fd);.    ret
d420: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d430: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 21 3d  ;.  }.  if( rc!=
d440: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
d450: 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28   sqlite3OsClose(
d460: 26 66 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  &fd);.    sqlite
d470: 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61  Free(zFullPathna
d480: 6d 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  me);.    return 
d490: 72 63 3b 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65  rc;.  }.  nameLe
d4a0: 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c  n = strlen(zFull
d4b0: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
d4c0: 67 65 72 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ger = sqliteMall
d4d0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 50 61 67  oc( sizeof(*pPag
d4e0: 65 72 29 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20  er) + nameLen*3 
d4f0: 2b 20 33 30 20 29 3b 0a 20 20 69 66 28 20 70 50  + 30 );.  if( pP
d500: 61 67 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  ager==0 ){.    s
d510: 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66  qlite3OsClose(&f
d520: 64 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  d);.    sqliteFr
d530: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
d540: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  );.    return SQ
d550: 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
d560: 20 20 54 52 41 43 45 33 28 22 4f 50 45 4e 20 25    TRACE3("OPEN %
d570: 64 20 25 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e  d %s\n", FILEHAN
d580: 44 4c 45 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c  DLEID(fd), zFull
d590: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61  Pathname);.  pPa
d5a0: 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d  ger->zFilename =
d5b0: 20 28 63 68 61 72 2a 29 26 70 50 61 67 65 72 5b   (char*)&pPager[
d5c0: 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44  1];.  pPager->zD
d5d0: 69 72 65 63 74 6f 72 79 20 3d 20 26 70 50 61 67  irectory = &pPag
d5e0: 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61  er->zFilename[na
d5f0: 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67  meLen+1];.  pPag
d600: 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26  er->zJournal = &
d610: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
d620: 72 79 5b 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20  ry[nameLen+1];. 
d630: 20 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e   strcpy(pPager->
d640: 7a 46 69 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c  zFilename, zFull
d650: 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72  Pathname);.  str
d660: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 44 69 72  cpy(pPager->zDir
d670: 65 63 74 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74  ectory, zFullPat
d680: 68 6e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  hname);.  for(i=
d690: 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20  nameLen; i>0 && 
d6a0: 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
d6b0: 72 79 5b 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d  ry[i-1]!='/'; i-
d6c0: 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3e 30 20 29  -){}.  if( i>0 )
d6d0: 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74   pPager->zDirect
d6e0: 6f 72 79 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20  ory[i-1] = 0;.  
d6f0: 73 74 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a  strcpy(pPager->z
d700: 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61  Journal, zFullPa
d710: 74 68 6e 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74  thname);.  sqlit
d720: 65 46 72 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e  eFree(zFullPathn
d730: 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79 28 26  ame);.  strcpy(&
d740: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
d750: 5b 6e 61 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75  [nameLen], "-jou
d760: 72 6e 61 6c 22 29 3b 0a 20 20 70 50 61 67 65 72  rnal");.  pPager
d770: 2d 3e 66 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f  ->fd = fd;.#if O
d780: 53 5f 55 4e 49 58 0a 20 20 70 50 61 67 65 72 2d  S_UNIX.  pPager-
d790: 3e 66 64 2e 70 50 61 67 65 72 20 3d 20 70 50 61  >fd.pPager = pPa
d7a0: 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50  ger;.#endif.  pP
d7b0: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
d7c0: 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  n = 0;.  pPager-
d7d0: 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73  >useJournal = us
d7e0: 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d  eJournal && !mem
d7f0: 44 62 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74  Db;.  pPager->st
d800: 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50  mtOpen = 0;.  pP
d810: 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
d820: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
d830: 52 65 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  Ref = 0;.  pPage
d840: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44  r->dbSize = memD
d850: 62 2d 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70  b-1;.  pPager->p
d860: 61 67 65 53 69 7a 65 20 3d 20 53 51 4c 49 54 45  ageSize = SQLITE
d870: 5f 44 45 46 41 55 4c 54 5f 50 41 47 45 5f 53 49  _DEFAULT_PAGE_SI
d880: 5a 45 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73  ZE;.  pPager->ps
d890: 41 6c 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f  Aligned = FORCE_
d8a0: 41 4c 49 47 4e 4d 45 4e 54 28 70 50 61 67 65 72  ALIGNMENT(pPager
d8b0: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 70  ->pageSize);.  p
d8c0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
d8d0: 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73  = 0;.  pPager->s
d8e0: 74 6d 74 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20  tmtJSize = 0;.  
d8f0: 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20  pPager->nPage = 
d900: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  0;.  pPager->mxP
d910: 61 67 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61  age = 100;.  pPa
d920: 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
d930: 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61  ER_UNLOCK;.  pPa
d940: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30  ger->errMask = 0
d950: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  ;.  pPager->temp
d960: 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b  File = tempFile;
d970: 0a 20 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62  .  pPager->memDb
d980: 20 3d 20 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67   = memDb;.  pPag
d990: 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72  er->readOnly = r
d9a0: 65 61 64 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65  eadOnly;.  pPage
d9b0: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
d9c0: 0a 20 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e  .  pPager->noSyn
d9d0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70  c = pPager->temp
d9e0: 46 69 6c 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72  File || !useJour
d9f0: 6e 61 6c 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  nal;.  pPager->f
da00: 75 6c 6c 53 79 6e 63 20 3d 20 28 70 50 61 67 65  ullSync = (pPage
da10: 72 2d 3e 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a  r->noSync?0:1);.
da20: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
da30: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
da40: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
da50: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
da60: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
da70: 3e 6e 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f  >nExtra = FORCE_
da80: 41 4c 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61  ALIGNMENT(nExtra
da90: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 63  );.  pPager->sec
daa0: 74 6f 72 53 69 7a 65 20 3d 20 50 41 47 45 52 5f  torSize = PAGER_
dab0: 53 45 43 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70  SECTOR_SIZE;.  p
dac0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
dad0: 6c 65 72 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65  ler = 0;.  memse
dae0: 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68 2c  t(pPager->aHash,
daf0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67 65   0, sizeof(pPage
db00: 72 2d 3e 61 48 61 73 68 29 29 3b 0a 20 20 2a 70  r->aHash));.  *p
db10: 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
db20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
db30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  _OK;.}../*.** Se
db40: 74 20 74 68 65 20 62 75 73 79 20 68 61 6e 64 6c  t the busy handl
db50: 65 72 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  er function..*/.
db60: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
db70: 72 5f 73 65 74 5f 62 75 73 79 68 61 6e 64 6c 65  r_set_busyhandle
db80: 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
db90: 20 42 75 73 79 48 61 6e 64 6c 65 72 20 2a 70 42   BusyHandler *pB
dba0: 75 73 79 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70  usyHandler){.  p
dbb0: 50 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64  Pager->pBusyHand
dbc0: 6c 65 72 20 3d 20 70 42 75 73 79 48 61 6e 64 6c  ler = pBusyHandl
dbd0: 65 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  er;.}../*.** Set
dbe0: 20 74 68 65 20 64 65 73 74 72 75 63 74 6f 72 20   the destructor 
dbf0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 72 2e 20  for this pager. 
dc00: 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68   If not NULL, th
dc10: 65 20 64 65 73 74 72 75 63 74 6f 72 20 69 73 20  e destructor is 
dc20: 63 61 6c 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74  called.** when t
dc30: 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75  he reference cou
dc40: 6e 74 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20  nt on each page 
dc50: 72 65 61 63 68 65 73 20 7a 65 72 6f 2e 20 20 54  reaches zero.  T
dc60: 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 63 61  he destructor ca
dc70: 6e 0a 2a 2a 20 62 65 20 75 73 65 64 20 74 6f 20  n.** be used to 
dc80: 63 6c 65 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61  clean up informa
dc90: 74 69 6f 6e 20 69 6e 20 74 68 65 20 65 78 74 72  tion in the extr
dca0: 61 20 73 65 67 6d 65 6e 74 20 61 70 70 65 6e 64  a segment append
dcb0: 65 64 20 74 6f 20 65 61 63 68 20 70 61 67 65 2e  ed to each page.
dcc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 64 65 73 74 72  .**.** The destr
dcd0: 75 63 74 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c  uctor is not cal
dce0: 6c 65 64 20 61 73 20 61 20 72 65 73 75 6c 74 20  led as a result 
dcf0: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6c 6f  sqlite3pager_clo
dd00: 73 65 28 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72  se().  .** Destr
dd10: 75 63 74 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20  uctors are only 
dd20: 63 61 6c 6c 65 64 20 62 79 20 73 71 6c 69 74 65  called by sqlite
dd30: 33 70 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a  3pager_unref()..
dd40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
dd50: 61 67 65 72 5f 73 65 74 5f 64 65 73 74 72 75 63  ager_set_destruc
dd60: 74 6f 72 28 50 61 67 65 72 20 2a 70 50 61 67 65  tor(Pager *pPage
dd70: 72 2c 20 76 6f 69 64 20 28 2a 78 44 65 73 63 29  r, void (*xDesc)
dd80: 28 76 6f 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20  (void*,int)){.  
dd90: 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
dda0: 74 6f 72 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a  tor = xDesc;.}..
ddb0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 72 65  /*.** Set the re
ddc0: 69 6e 69 74 69 61 6c 69 7a 65 72 20 66 6f 72 20  initializer for 
ddd0: 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66 20  this pager.  If 
dde0: 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65  not NULL, the re
ddf0: 69 6e 69 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69  initializer.** i
de00: 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 74 68  s called when th
de10: 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70  e content of a p
de20: 61 67 65 20 69 6e 20 63 61 63 68 65 20 69 73 20  age in cache is 
de30: 72 65 73 74 6f 72 65 64 20 74 6f 20 69 74 73 20  restored to its 
de40: 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75  original.** valu
de50: 65 20 61 73 20 61 20 72 65 73 75 6c 74 20 6f 66  e as a result of
de60: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68   a rollback.  Th
de70: 65 20 63 61 6c 6c 62 61 63 6b 20 67 69 76 65 73  e callback gives
de80: 20 68 69 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f   higher-level co
de90: 64 65 0a 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75  de.** an opportu
dea0: 6e 69 74 79 20 74 6f 20 72 65 73 74 6f 72 65 20  nity to restore 
deb0: 74 68 65 20 45 58 54 52 41 20 73 65 63 74 69 6f  the EXTRA sectio
dec0: 6e 20 74 6f 20 61 67 72 65 65 20 77 69 74 68 20  n to agree with 
ded0: 74 68 65 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20  the restored.** 
dee0: 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f  page data..*/.vo
def0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
df00: 73 65 74 5f 72 65 69 6e 69 74 65 72 28 50 61 67  set_reiniter(Pag
df10: 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
df20: 20 28 2a 78 52 65 69 6e 69 74 29 28 76 6f 69 64   (*xReinit)(void
df30: 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61 67 65  *,int)){.  pPage
df40: 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 3d 20 78  r->xReiniter = x
df50: 52 65 69 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Reinit;.}../*.**
df60: 20 53 65 74 20 74 68 65 20 70 61 67 65 20 73 69   Set the page si
df70: 7a 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61  ze..**.** The pa
df80: 67 65 20 73 69 7a 65 20 6d 75 73 74 20 6f 6e 6c  ge size must onl
df90: 79 20 62 65 20 63 68 61 6e 67 65 64 20 77 68 65  y be changed whe
dfa0: 6e 20 74 68 65 20 63 61 63 68 65 20 69 73 20 65  n the cache is e
dfb0: 6d 70 74 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  mpty..*/.void sq
dfc0: 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74 5f 70  lite3pager_set_p
dfd0: 61 67 65 73 69 7a 65 28 50 61 67 65 72 20 2a 70  agesize(Pager *p
dfe0: 50 61 67 65 72 2c 20 69 6e 74 20 70 61 67 65 53  Pager, int pageS
dff0: 69 7a 65 29 7b 0a 20 20 61 73 73 65 72 74 28 20  ize){.  assert( 
e000: 70 61 67 65 53 69 7a 65 3e 3d 35 31 32 20 26 26  pageSize>=512 &&
e010: 20 70 61 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54   pageSize<=SQLIT
e020: 45 5f 4d 41 58 5f 50 41 47 45 5f 53 49 5a 45 20  E_MAX_PAGE_SIZE 
e030: 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67  );.  pPager->pag
e040: 65 53 69 7a 65 20 3d 20 70 61 67 65 53 69 7a 65  eSize = pageSize
e050: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41 6c  ;.  pPager->psAl
e060: 69 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c  igned = FORCE_AL
e070: 49 47 4e 4d 45 4e 54 28 70 61 67 65 53 69 7a 65  IGNMENT(pageSize
e080: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  );.}../*.** Read
e090: 20 74 68 65 20 66 69 72 73 74 20 4e 20 62 79 74   the first N byt
e0a0: 65 73 20 66 72 6f 6d 20 74 68 65 20 62 65 67 69  es from the begi
e0b0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 66 69 6c  nning of the fil
e0c0: 65 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a  e into memory.**
e0d0: 20 74 68 61 74 20 70 44 65 73 74 20 70 6f 69 6e   that pDest poin
e0e0: 74 73 20 74 6f 2e 20 20 4e 6f 20 65 72 72 6f 72  ts to.  No error
e0f0: 20 63 68 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e   checking is don
e100: 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  e..*/.void sqlit
e110: 65 33 70 61 67 65 72 5f 72 65 61 64 5f 66 69 6c  e3pager_read_fil
e120: 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
e130: 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
e140: 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
e150: 73 74 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44  st){.  memset(pD
e160: 65 73 74 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66  est, 0, N);.  if
e170: 28 20 4d 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20  ( MEMDB==0 ){.  
e180: 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
e190: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b  &pPager->fd, 0);
e1a0: 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 52 65  .    sqlite3OsRe
e1b0: 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
e1c0: 70 44 65 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d  pDest, N);.  }.}
e1d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
e1e0: 68 65 20 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20  he total number 
e1f0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
e200: 64 69 73 6b 20 66 69 6c 65 20 61 73 73 6f 63 69  disk file associ
e210: 61 74 65 64 20 77 69 74 68 0a 2a 2a 20 70 50 61  ated with.** pPa
e220: 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
e230: 74 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75  te3pager_pagecou
e240: 6e 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  nt(Pager *pPager
e250: 29 7b 0a 20 20 69 36 34 20 6e 3b 0a 20 20 61 73  ){.  i64 n;.  as
e260: 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20  sert( pPager!=0 
e270: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
e280: 3e 64 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20  >dbSize>=0 ){.  
e290: 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
e2a0: 3e 64 62 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69  >dbSize;.  }.  i
e2b0: 66 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65  f( sqlite3OsFile
e2c0: 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 66 64  Size(&pPager->fd
e2d0: 2c 20 26 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  , &n)!=SQLITE_OK
e2e0: 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
e2f0: 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
e300: 5f 45 52 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72  _ERR_DISK;.    r
e310: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e  eturn 0;.  }.  n
e320: 20 2f 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65   /= pPager->page
e330: 53 69 7a 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d  Size;.  if( !MEM
e340: 44 42 20 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47  DB && n==PENDING
e350: 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61  _BYTE/pPager->pa
e360: 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b  geSize ){.    n+
e370: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  +;.  }.  if( pPa
e380: 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
e390: 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20  R_UNLOCK ){.    
e3a0: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
e3b0: 20 6e 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   n;.  }.  return
e3c0: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72   n;.}../*.** For
e3d0: 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f 6e  ward declaration
e3e0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
e3f0: 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72  yncJournal(Pager
e400: 2a 29 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69  *);.../*.** Unli
e410: 6e 6b 20 70 50 67 20 66 72 6f 6d 20 69 74 27 73  nk pPg from it's
e420: 20 68 61 73 68 20 63 68 61 69 6e 2e 20 41 6c 73   hash chain. Als
e430: 6f 20 73 65 74 20 74 68 65 20 70 61 67 65 20 6e  o set the page n
e440: 75 6d 62 65 72 20 74 6f 20 30 20 74 6f 20 69 6e  umber to 0 to in
e450: 64 69 63 61 74 65 0a 2a 2a 20 74 68 61 74 20 74  dicate.** that t
e460: 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 70  he page is not p
e470: 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68 20  art of any hash 
e480: 63 68 61 69 6e 2e 20 54 68 69 73 20 69 73 20 72  chain. This is r
e490: 65 71 75 69 72 65 64 20 62 65 63 61 75 73 65 20  equired because 
e4a0: 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61  the.** sqlite3pa
e4b0: 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 29 20 72  ger_movepage() r
e4c0: 6f 75 74 69 6e 65 20 63 61 6e 20 6c 65 61 76 65  outine can leave
e4d0: 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20 0a   a page in the .
e4e0: 2a 2a 20 70 4e 65 78 74 46 72 65 65 2f 70 50 72  ** pNextFree/pPr
e4f0: 65 76 46 72 65 65 20 6c 69 73 74 20 74 68 61 74  evFree list that
e500: 20 69 73 20 6e 6f 74 20 61 20 70 61 72 74 20 6f   is not a part o
e510: 66 20 61 6e 79 20 68 61 73 68 2d 63 68 61 69 6e  f any hash-chain
e520: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
e530: 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
e540: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
e550: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69  PgHdr *pPg){.  i
e560: 66 28 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20  f( pPg->pgno==0 
e570: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
e580: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
e590: 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 69 73 20  zero, then this 
e5a0: 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 61  page is not in a
e5b0: 6e 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 2a  ny hash chain. *
e5c0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
e5d0: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
e5e0: 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 70 50  xtHash ){.    pP
e5f0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70 50  g->pNextHash->pP
e600: 72 65 76 48 61 73 68 20 3d 20 70 50 67 2d 3e 70  revHash = pPg->p
e610: 50 72 65 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20  PrevHash;.  }.  
e620: 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76 48 61  if( pPg->pPrevHa
e630: 73 68 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  sh ){.    assert
e640: 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b  ( pPager->aHash[
e650: 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d 3e  pager_hash(pPg->
e660: 70 67 6e 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20  pgno)]!=pPg );. 
e670: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73     pPg->pPrevHas
e680: 68 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70  h->pNextHash = p
e690: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
e6a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20   }else{.    int 
e6b0: 68 20 3d 20 70 61 67 65 72 5f 68 61 73 68 28 70  h = pager_hash(p
e6c0: 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61  Pg->pgno);.    a
e6d0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
e6e0: 48 61 73 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a  Hash[h]==pPg );.
e6f0: 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
e700: 68 5b 68 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78  h[h] = pPg->pNex
e710: 74 48 61 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50  tHash;.  }..  pP
e720: 67 2d 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70  g->pgno = 0;.  p
e730: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20  Pg->pNextHash = 
e740: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d  pPg->pPrevHash =
e750: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c   0;.}../*.** Unl
e760: 69 6e 6b 20 61 20 70 61 67 65 20 66 72 6f 6d 20  ink a page from 
e770: 74 68 65 20 66 72 65 65 20 6c 69 73 74 20 28 74  the free list (t
e780: 68 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70  he list of all p
e790: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
e7a0: 3d 30 29 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20  =0).** and from 
e7b0: 69 74 73 20 68 61 73 68 20 63 6f 6c 6c 69 73 69  its hash collisi
e7c0: 6f 6e 20 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61  on chain..*/.sta
e7d0: 74 69 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50  tic void unlinkP
e7e0: 61 67 65 28 50 67 48 64 72 20 2a 70 50 67 29 7b  age(PgHdr *pPg){
e7f0: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
e800: 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
e810: 0a 20 20 2f 2a 20 4b 65 65 70 20 74 68 65 20 70  .  /* Keep the p
e820: 46 69 72 73 74 53 79 6e 63 65 64 20 70 6f 69 6e  FirstSynced poin
e830: 74 65 72 20 70 6f 69 6e 74 69 6e 67 20 61 74 20  ter pointing at 
e840: 74 68 65 20 66 69 72 73 74 20 73 79 6e 63 68 72  the first synchr
e850: 6f 6e 69 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20  onized page */. 
e860: 20 69 66 28 20 70 50 67 3d 3d 70 50 61 67 65 72   if( pPg==pPager
e870: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
e880: 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d  {.    PgHdr *p =
e890: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
e8a0: 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26  .    while( p &&
e8b0: 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
e8c0: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
e8d0: 3b 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ; }.    pPager->
e8e0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70  pFirstSynced = p
e8f0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69  ;.  }..  /* Unli
e900: 6e 6b 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  nk from the free
e910: 6c 69 73 74 20 2a 2f 0a 20 20 69 66 28 20 70 50  list */.  if( pP
e920: 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
e930: 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72      pPg->pPrevFr
e940: 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  ee->pNextFree = 
e950: 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a  pPg->pNextFree;.
e960: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
e970: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69  ert( pPager->pFi
e980: 72 73 74 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20  rst==pPg );.    
e990: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
e9a0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b   pPg->pNextFree;
e9b0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e  .  }.  if( pPg->
e9c0: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
e9d0: 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d   pPg->pNextFree-
e9e0: 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50 67  >pPrevFree = pPg
e9f0: 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d  ->pPrevFree;.  }
ea00: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
ea10: 28 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d  ( pPager->pLast=
ea20: 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61 67  =pPg );.    pPag
ea30: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d  er->pLast = pPg-
ea40: 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a  >pPrevFree;.  }.
ea50: 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65    pPg->pNextFree
ea60: 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65   = pPg->pPrevFre
ea70: 65 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c  e = 0;..  /* Unl
ea80: 69 6e 6b 20 66 72 6f 6d 20 74 68 65 20 70 67 6e  ink from the pgn
ea90: 6f 20 68 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a  o hash table */.
eaa0: 20 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69    unlinkHashChai
eab0: 6e 28 70 50 61 67 65 72 2c 20 70 50 67 29 3b 0a  n(pPager, pPg);.
eac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ead0: 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74 6f  utine is used to
eae0: 20 74 72 75 6e 63 61 74 65 20 61 6e 20 69 6e 2d   truncate an in-
eaf0: 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e  memory database.
eb00: 20 20 44 65 6c 65 74 65 0a 2a 2a 20 61 6c 6c 20    Delete.** all 
eb10: 70 61 67 65 73 20 77 68 6f 73 65 20 70 67 6e 6f  pages whose pgno
eb20: 20 69 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20   is larger than 
eb30: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
eb40: 6e 64 20 69 73 20 75 6e 72 65 66 65 72 65 6e 63  nd is unreferenc
eb50: 65 64 2e 0a 2a 2a 20 52 65 66 65 72 65 6e 63 65  ed..** Reference
eb60: 64 20 70 61 67 65 73 20 6c 61 72 67 65 72 20 74  d pages larger t
eb70: 68 61 6e 20 70 50 61 67 65 72 2d 3e 64 62 53 69  han pPager->dbSi
eb80: 7a 65 20 61 72 65 20 7a 65 72 6f 65 64 2e 0a 2a  ze are zeroed..*
eb90: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 65  /.static void me
eba0: 6d 6f 72 79 54 72 75 6e 63 61 74 65 28 50 61 67  moryTruncate(Pag
ebb0: 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
ebc0: 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 50 67 48  gHdr *pPg;.  PgH
ebd0: 64 72 20 2a 2a 70 70 50 67 3b 0a 20 20 69 6e 74  dr **ppPg;.  int
ebe0: 20 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65 72   dbSize = pPager
ebf0: 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 70 70 50  ->dbSize;..  ppP
ec00: 67 20 3d 20 26 70 50 61 67 65 72 2d 3e 70 41 6c  g = &pPager->pAl
ec10: 6c 3b 0a 20 20 77 68 69 6c 65 28 20 28 70 50 67  l;.  while( (pPg
ec20: 20 3d 20 2a 70 70 50 67 29 21 3d 30 20 29 7b 0a   = *ppPg)!=0 ){.
ec30: 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 67 6e      if( pPg->pgn
ec40: 6f 3c 3d 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  o<=dbSize ){.   
ec50: 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d 3e     ppPg = &pPg->
ec60: 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d 65  pNextAll;.    }e
ec70: 6c 73 65 20 69 66 28 20 70 50 67 2d 3e 6e 52 65  lse if( pPg->nRe
ec80: 66 3e 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d  f>0 ){.      mem
ec90: 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 44 41 54  set(PGHDR_TO_DAT
eca0: 41 28 70 50 67 29 2c 20 30 2c 20 70 50 61 67 65  A(pPg), 0, pPage
ecb0: 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
ecc0: 20 20 20 20 70 70 50 67 20 3d 20 26 70 50 67 2d      ppPg = &pPg-
ecd0: 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20 7d  >pNextAll;.    }
ece0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 2a 70 70 50  else{.      *ppP
ecf0: 67 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  g = pPg->pNextAl
ed00: 6c 3b 0a 20 20 20 20 20 20 75 6e 6c 69 6e 6b 50  l;.      unlinkP
ed10: 61 67 65 28 70 50 67 29 3b 0a 20 20 20 20 20 20  age(pPg);.      
ed20: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
ed30: 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
ed40: 50 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20  Page--;.    }.  
ed50: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e 63  }.}../*.** Trunc
ed60: 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f 20  ate the file to 
ed70: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70 61  the number of pa
ed80: 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a 2a  ges specified..*
ed90: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
eda0: 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67 65  er_truncate(Page
edb0: 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
edc0: 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  nPage){.  int rc
edd0: 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65 72  ;.  sqlite3pager
ede0: 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65  _pagecount(pPage
edf0: 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  r);.  if( pPager
ee00: 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b 0a  ->errMask!=0 ){.
ee10: 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 65      rc = pager_e
ee20: 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a  rrcode(pPager);.
ee30: 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
ee40: 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d   }.  if( nPage>=
ee50: 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72  (unsigned)pPager
ee60: 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
ee70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
ee80: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44  ;.  }.  if( MEMD
ee90: 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
eea0: 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b  >dbSize = nPage;
eeb0: 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63  .    memoryTrunc
eec0: 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ate(pPager);.   
eed0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
eee0: 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 79  K;.  }.  rc = sy
eef0: 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  ncJournal(pPager
ef00: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ef10: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65  ITE_OK ){.    re
ef20: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
ef30: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
ef40: 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67 65  te(pPager, nPage
ef50: 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
ef60: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 50  ITE_OK ){.    pP
ef70: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e  ager->dbSize = n
ef80: 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Page;.  }.  retu
ef90: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
efa0: 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61 67  Shutdown the pag
efb0: 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20 61  e cache.  Free a
efc0: 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c  ll memory and cl
efd0: 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a  ose all files..*
efe0: 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73 61  *.** If a transa
eff0: 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f  ction was in pro
f000: 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73 20  gress when this 
f010: 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
f020: 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73  d, that.** trans
f030: 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64  action is rolled
f040: 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73   back.  All outs
f050: 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61 72  tanding pages ar
f060: 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a  e invalidated.**
f070: 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f 72   and their memor
f080: 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e 79  y is freed.  Any
f090: 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65 20   attempt to use 
f0a0: 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74 65  a page associate
f0b0: 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20 70  d.** with this p
f0c0: 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72 20  age cache after 
f0d0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72 65  this function re
f0e0: 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c  turns will likel
f0f0: 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20 61  y.** result in a
f100: 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69 6e   coredump..*/.in
f110: 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63  t sqlite3pager_c
f120: 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61 67  lose(Pager *pPag
f130: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
f140: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77 69  g, *pNext;.  swi
f150: 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74 61  tch( pPager->sta
f160: 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20 50  te ){.    case P
f170: 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a 20  AGER_RESERVED:. 
f180: 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 59     case PAGER_SY
f190: 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65 20  NCED: .    case 
f1a0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3a  PAGER_EXCLUSIVE:
f1b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
f1c0: 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70  pager_rollback(p
f1d0: 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66  Pager);.      if
f1e0: 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
f1f0: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c      sqlite3OsUnl
f200: 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
f210: 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20   NO_LOCK);.     
f220: 20 7d 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   }.      assert(
f230: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
f240: 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Open==0 );.     
f250: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f260: 20 20 63 61 73 65 20 50 41 47 45 52 5f 53 48 41    case PAGER_SHA
f270: 52 45 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  RED: {.      if(
f280: 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
f290: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
f2a0: 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ck(&pPager->fd, 
f2b0: 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  NO_LOCK);.      
f2c0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
f2d0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
f2e0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 44 6f 20  : {.      /* Do 
f2f0: 6e 6f 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20 20  nothing */.     
f300: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
f310: 7d 0a 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67  }.  for(pPg=pPag
f320: 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
f330: 50 67 3d 70 4e 65 78 74 29 7b 0a 23 69 66 6e 64  Pg=pNext){.#ifnd
f340: 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 69 66  ef NDEBUG.    if
f350: 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
f360: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
f370: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
f380: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
f390: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 70        assert( !p
f3a0: 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  Pg->alwaysRollba
f3b0: 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ck );.      asse
f3c0: 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f 72 69  rt( !pHist->pOri
f3d0: 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  g );.      asser
f3e0: 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74 6d 74  t( !pHist->pStmt
f3f0: 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66   );.    }.#endif
f400: 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70 50 67  .    pNext = pPg
f410: 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20 20  ->pNextAll;.    
f420: 73 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b  sqliteFree(pPg);
f430: 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28 22 43  .  }.  TRACE2("C
f440: 4c 4f 53 45 20 25 64 5c 6e 22 2c 20 50 41 47 45  LOSE %d\n", PAGE
f450: 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
f460: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
f470: 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20 20 61  pPager->fd);.  a
f480: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
f490: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
f4a0: 0a 20 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73  .  /* Temp files
f4b0: 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c   are automatical
f4c0: 6c 79 20 64 65 6c 65 74 65 64 20 62 79 20 74 68  ly deleted by th
f4d0: 65 20 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50  e OS.  ** if( pP
f4e0: 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29  ager->tempFile )
f4f0: 7b 0a 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33  {.  **   sqlite3
f500: 4f 73 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d  OsDelete(pPager-
f510: 3e 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a  >zFilename);.  *
f520: 2a 20 7d 0a 20 20 2a 2f 0a 0a 20 20 73 71 6c 69  * }.  */..  sqli
f530: 74 65 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a  teFree(pPager);.
f540: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f550: 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  OK;.}../*.** Ret
f560: 75 72 6e 20 74 68 65 20 70 61 67 65 20 6e 75 6d  urn the page num
f570: 62 65 72 20 66 6f 72 20 74 68 65 20 67 69 76 65  ber for the give
f580: 6e 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a  n page data..*/.
f590: 50 67 6e 6f 20 73 71 6c 69 74 65 33 70 61 67 65  Pgno sqlite3page
f5a0: 72 5f 70 61 67 65 6e 75 6d 62 65 72 28 76 6f 69  r_pagenumber(voi
f5b0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
f5c0: 64 72 20 2a 70 20 3d 20 44 41 54 41 5f 54 4f 5f  dr *p = DATA_TO_
f5d0: 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
f5e0: 72 65 74 75 72 6e 20 70 2d 3e 70 67 6e 6f 3b 0a  return p->pgno;.
f5f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70 61 67  }../*.** The pag
f600: 65 5f 72 65 66 28 29 20 66 75 6e 63 74 69 6f 6e  e_ref() function
f610: 20 69 6e 63 72 65 6d 65 6e 74 73 20 74 68 65 20   increments the 
f620: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
f630: 66 6f 72 20 61 20 70 61 67 65 2e 0a 2a 2a 20 49  for a page..** I
f640: 66 20 74 68 65 20 70 61 67 65 20 69 73 20 63 75  f the page is cu
f650: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
f660: 72 65 65 6c 69 73 74 20 28 74 68 65 20 72 65 66  reelist (the ref
f670: 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20  erence count is 
f680: 7a 65 72 6f 29 20 74 68 65 6e 0a 2a 2a 20 72 65  zero) then.** re
f690: 6d 6f 76 65 20 69 74 20 66 72 6f 6d 20 74 68 65  move it from the
f6a0: 20 66 72 65 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a   freelist..**.**
f6b0: 20 46 6f 72 20 6e 6f 6e 2d 74 65 73 74 20 73 79   For non-test sy
f6c0: 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66 28  stems, page_ref(
f6d0: 29 20 69 73 20 61 20 6d 61 63 72 6f 20 74 68 61  ) is a macro tha
f6e0: 74 20 63 61 6c 6c 73 20 5f 70 61 67 65 5f 72 65  t calls _page_re
f6f0: 66 28 29 0a 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66  f().** online of
f700: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63   the reference c
f710: 6f 75 6e 74 20 69 73 20 7a 65 72 6f 2e 20 20 46  ount is zero.  F
f720: 6f 72 20 74 65 73 74 20 73 79 73 74 65 6d 73 2c  or test systems,
f730: 20 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 69   page_ref().** i
f740: 73 20 61 20 72 65 61 6c 20 66 75 6e 63 74 69 6f  s a real functio
f750: 6e 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e  n so that we can
f760: 20 73 65 74 20 62 72 65 61 6b 70 6f 69 6e 74 73   set breakpoints
f770: 20 61 6e 64 20 74 72 61 63 65 20 69 74 2e 0a 2a   and trace it..*
f780: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 5f 70  /.static void _p
f790: 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a 70  age_ref(PgHdr *p
f7a0: 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
f7b0: 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  nRef==0 ){.    /
f7c0: 2a 20 54 68 65 20 70 61 67 65 20 69 73 20 63 75  * The page is cu
f7d0: 72 72 65 6e 74 6c 79 20 6f 6e 20 74 68 65 20 66  rrently on the f
f7e0: 72 65 65 6c 69 73 74 2e 20 20 52 65 6d 6f 76 65  reelist.  Remove
f7f0: 20 69 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20   it. */.    if( 
f800: 70 50 67 3d 3d 70 50 67 2d 3e 70 50 61 67 65 72  pPg==pPg->pPager
f810: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 29  ->pFirstSynced )
f820: 7b 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70  {.      PgHdr *p
f830: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65   = pPg->pNextFre
f840: 65 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  e;.      while( 
f850: 70 20 26 26 20 70 2d 3e 6e 65 65 64 53 79 6e 63  p && p->needSync
f860: 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74   ){ p = p->pNext
f870: 46 72 65 65 3b 20 7d 0a 20 20 20 20 20 20 70 50  Free; }.      pP
f880: 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73  g->pPager->pFirs
f890: 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20 20 20  tSynced = p;.   
f8a0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
f8b0: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
f8c0: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65     pPg->pPrevFre
f8d0: 65 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70  e->pNextFree = p
f8e0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
f8f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
f900: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46 69  pPg->pPager->pFi
f910: 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  rst = pPg->pNext
f920: 46 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Free;.    }.    
f930: 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72  if( pPg->pNextFr
f940: 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ee ){.      pPg-
f950: 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50 72 65  >pNextFree->pPre
f960: 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 50 72  vFree = pPg->pPr
f970: 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73  evFree;.    }els
f980: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50  e{.      pPg->pP
f990: 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50  ager->pLast = pP
f9a0: 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20 20  g->pPrevFree;.  
f9b0: 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e 70 50 61    }.    pPg->pPa
f9c0: 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d  ger->nRef++;.  }
f9d0: 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a  .  pPg->nRef++;.
f9e0: 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
f9f0: 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  }.#ifdef SQLITE_
fa00: 44 45 42 55 47 0a 20 20 73 74 61 74 69 63 20 76  DEBUG.  static v
fa10: 6f 69 64 20 70 61 67 65 5f 72 65 66 28 50 67 48  oid page_ref(PgH
fa20: 64 72 20 2a 70 50 67 29 7b 0a 20 20 20 20 69 66  dr *pPg){.    if
fa30: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
fa40: 7b 0a 20 20 20 20 20 20 5f 70 61 67 65 5f 72 65  {.      _page_re
fa50: 66 28 70 50 67 29 3b 0a 20 20 20 20 7d 65 6c 73  f(pPg);.    }els
fa60: 65 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 52  e{.      pPg->nR
fa70: 65 66 2b 2b 3b 0a 20 20 20 20 20 20 52 45 46 49  ef++;.      REFI
fa80: 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a  NFO(pPg);.    }.
fa90: 20 20 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69    }.#else.# defi
faa0: 6e 65 20 70 61 67 65 5f 72 65 66 28 50 29 20 20  ne page_ref(P)  
fab0: 20 28 28 50 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f   ((P)->nRef==0?_
fac0: 70 61 67 65 5f 72 65 66 28 50 29 3a 28 76 6f 69  page_ref(P):(voi
fad0: 64 29 28 50 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23  d)(P)->nRef++).#
fae0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63  endif../*.** Inc
faf0: 72 65 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72  rement the refer
fb00: 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 61  ence count for a
fb10: 20 70 61 67 65 2e 20 20 54 68 65 20 69 6e 70 75   page.  The inpu
fb20: 74 20 70 6f 69 6e 74 65 72 20 69 73 0a 2a 2a 20  t pointer is.** 
fb30: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
fb40: 68 65 20 70 61 67 65 20 64 61 74 61 2e 0a 2a 2f  he page data..*/
fb50: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
fb60: 72 5f 72 65 66 28 76 6f 69 64 20 2a 70 44 61 74  r_ref(void *pDat
fb70: 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
fb80: 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
fb90: 28 70 44 61 74 61 29 3b 0a 20 20 70 61 67 65 5f  (pData);.  page_
fba0: 72 65 66 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ref(pPg);.  retu
fbb0: 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
fbc0: 0a 2f 2a 0a 2a 2a 20 53 79 6e 63 20 74 68 65 20  ./*.** Sync the 
fbd0: 6a 6f 75 72 6e 61 6c 2e 20 20 49 6e 20 6f 74 68  journal.  In oth
fbe0: 65 72 20 77 6f 72 64 73 2c 20 6d 61 6b 65 20 73  er words, make s
fbf0: 75 72 65 20 61 6c 6c 20 74 68 65 20 70 61 67 65  ure all the page
fc00: 73 20 74 68 61 74 20 68 61 76 65 0a 2a 2a 20 62  s that have.** b
fc10: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
fc20: 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 76 65 20  he journal have 
fc30: 61 63 74 75 61 6c 6c 79 20 72 65 61 63 68 65 64  actually reached
fc40: 20 74 68 65 20 73 75 72 66 61 63 65 20 6f 66 20   the surface of 
fc50: 74 68 65 0a 2a 2a 20 64 69 73 6b 2e 20 20 49 74  the.** disk.  It
fc60: 20 69 73 20 6e 6f 74 20 73 61 66 65 20 74 6f 20   is not safe to 
fc70: 6d 6f 64 69 66 79 20 74 68 65 20 6f 72 69 67 69  modify the origi
fc80: 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
fc90: 65 20 75 6e 74 69 6c 20 61 66 74 65 72 0a 2a 2a  e until after.**
fca0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73   the journal has
fcb0: 20 62 65 65 6e 20 73 79 6e 63 65 64 2e 20 20 49   been synced.  I
fcc0: 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64  f the original d
fcd0: 61 74 61 62 61 73 65 20 69 73 20 6d 6f 64 69 66  atabase is modif
fce0: 69 65 64 20 62 65 66 6f 72 65 0a 2a 2a 20 74 68  ied before.** th
fcf0: 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e  e journal is syn
fd00: 63 65 64 20 61 6e 64 20 61 20 70 6f 77 65 72 20  ced and a power 
fd10: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 2c 20  failure occurs, 
fd20: 74 68 65 20 75 6e 73 79 6e 63 65 64 20 6a 6f 75  the unsynced jou
fd30: 72 6e 61 6c 0a 2a 2a 20 64 61 74 61 20 77 6f 75  rnal.** data wou
fd40: 6c 64 20 62 65 20 6c 6f 73 74 20 61 6e 64 20 77  ld be lost and w
fd50: 65 20 77 6f 75 6c 64 20 62 65 20 75 6e 61 62 6c  e would be unabl
fd60: 65 20 74 6f 20 63 6f 6d 70 6c 65 74 65 6c 79 20  e to completely 
fd70: 72 6f 6c 6c 62 61 63 6b 20 74 68 65 0a 2a 2a 20  rollback the.** 
fd80: 64 61 74 61 62 61 73 65 20 63 68 61 6e 67 65 73  database changes
fd90: 2e 20 20 44 61 74 61 62 61 73 65 20 63 6f 72 72  .  Database corr
fda0: 75 70 74 69 6f 6e 20 77 6f 75 6c 64 20 6f 63 63  uption would occ
fdb0: 75 72 2e 0a 2a 2a 20 0a 2a 2a 20 54 68 69 73 20  ur..** .** This 
fdc0: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 75 70 64  routine also upd
fdd0: 61 74 65 73 20 74 68 65 20 6e 52 65 63 20 66 69  ates the nRec fi
fde0: 65 6c 64 20 69 6e 20 74 68 65 20 68 65 61 64 65  eld in the heade
fdf0: 72 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  r of the journal
fe00: 2e 0a 2a 2a 20 28 53 65 65 20 63 6f 6d 6d 65 6e  ..** (See commen
fe10: 74 73 20 6f 6e 20 74 68 65 20 70 61 67 65 72 5f  ts on the pager_
fe20: 70 6c 61 79 62 61 63 6b 28 29 20 72 6f 75 74 69  playback() routi
fe30: 6e 65 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  ne for additiona
fe40: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 29 0a  l information.).
fe50: 2a 2a 20 49 66 20 74 68 65 20 73 79 6e 63 20 6d  ** If the sync m
fe60: 6f 64 65 20 69 73 20 46 55 4c 4c 2c 20 74 77 6f  ode is FULL, two
fe70: 20 73 79 6e 63 73 20 77 69 6c 6c 20 6f 63 63 75   syncs will occu
fe80: 72 2e 20 20 46 69 72 73 74 20 74 68 65 20 77 68  r.  First the wh
fe90: 6f 6c 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 69  ole journal.** i
fea0: 73 20 73 79 6e 63 65 64 2c 20 74 68 65 6e 20 74  s synced, then t
feb0: 68 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73  he nRec field is
fec0: 20 75 70 64 61 74 65 64 2c 20 74 68 65 6e 20 61   updated, then a
fed0: 20 73 65 63 6f 6e 64 20 73 79 6e 63 20 6f 63 63   second sync occ
fee0: 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74  urs..**.** For t
fef0: 65 6d 70 6f 72 61 72 79 20 64 61 74 61 62 61 73  emporary databas
ff00: 65 73 2c 20 77 65 20 64 6f 20 6e 6f 74 20 63 61  es, we do not ca
ff10: 72 65 20 69 66 20 77 65 20 61 72 65 20 61 62 6c  re if we are abl
ff20: 65 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  e to rollback.**
ff30: 20 61 66 74 65 72 20 61 20 70 6f 77 65 72 20 66   after a power f
ff40: 61 69 6c 75 72 65 2c 20 73 6f 20 73 79 6e 63 20  ailure, so sync 
ff50: 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a 20 54 68  occurs..**.** Th
ff60: 69 73 20 72 6f 75 74 69 6e 65 20 63 6c 65 61 72  is routine clear
ff70: 73 20 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66  s the needSync f
ff80: 69 65 6c 64 20 6f 66 20 65 76 65 72 79 20 70 61  ield of every pa
ff90: 67 65 20 63 75 72 72 65 6e 74 20 68 65 6c 64 20  ge current held 
ffa0: 69 6e 0a 2a 2a 20 6d 65 6d 6f 72 79 2e 0a 2a 2f  in.** memory..*/
ffb0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
ffc0: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70  Journal(Pager *p
ffd0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
ffe0: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 20 3d  *pPg;.  int rc =
fff0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20 20 2f   SQLITE_OK;..  /
10000 2a 20 53 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e  * Sync the journ
10010 61 6c 20 62 65 66 6f 72 65 20 6d 6f 64 69 66 79  al before modify
10020 69 6e 67 20 74 68 65 20 6d 61 69 6e 20 64 61 74  ing the main dat
10030 61 62 61 73 65 0a 20 20 2a 2a 20 28 61 73 73 75  abase.  ** (assu
10040 6d 69 6e 67 20 74 68 65 72 65 20 69 73 20 61 20  ming there is a 
10050 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 74 20 6e  journal and it n
10060 65 65 64 73 20 74 6f 20 62 65 20 73 79 6e 63 65  eeds to be synce
10070 64 2e 29 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  d.).  */.  if( p
10080 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20  Pager->needSync 
10090 29 7b 0a 20 20 20 20 69 66 28 20 21 70 50 61 67  ){.    if( !pPag
100a0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
100b0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
100c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
100d0 6e 20 29 3b 0a 20 20 20 20 20 20 2f 2a 20 61 73  n );.      /* as
100e0 73 65 72 74 28 20 21 70 50 61 67 65 72 2d 3e 6e  sert( !pPager->n
100f0 6f 53 79 6e 63 20 29 3b 20 2f 2f 20 6e 6f 53 79  oSync ); // noSy
10100 6e 63 20 6d 69 67 68 74 20 62 65 20 73 65 74 20  nc might be set 
10110 69 66 20 73 79 6e 63 68 72 6f 6e 6f 75 73 0a 20  if synchronous. 
10120 20 20 20 20 20 2a 2a 20 77 61 73 20 74 75 72 6e       ** was turn
10130 65 64 20 6f 66 66 20 61 66 74 65 72 20 74 68 65  ed off after the
10140 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
10150 20 73 74 61 72 74 65 64 2e 20 20 54 69 63 6b 65   started.  Ticke
10160 74 20 23 36 31 35 20 2a 2f 0a 23 69 66 6e 64 65  t #615 */.#ifnde
10170 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 7b  f NDEBUG.      {
10180 0a 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65  .        /* Make
10190 20 73 75 72 65 20 74 68 65 20 70 50 61 67 65 72   sure the pPager
101a0 2d 3e 6e 52 65 63 20 63 6f 75 6e 74 65 72 20 77  ->nRec counter w
101b0 65 20 61 72 65 20 6b 65 65 70 69 6e 67 20 61 67  e are keeping ag
101c0 72 65 65 73 0a 20 20 20 20 20 20 20 20 2a 2a 20  rees.        ** 
101d0 77 69 74 68 20 74 68 65 20 6e 52 65 63 20 63 6f  with the nRec co
101e0 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
101f0 73 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72  size of the jour
10200 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20 20  nal file..      
10210 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 36 34    */.        i64
10220 20 6a 53 7a 3b 0a 20 20 20 20 20 20 20 20 72 63   jSz;.        rc
10230 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
10240 53 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66  Size(&pPager->jf
10250 64 2c 20 26 6a 53 7a 29 3b 0a 20 20 20 20 20 20  d, &jSz);.      
10260 20 20 69 66 28 20 72 63 21 3d 30 20 29 20 72 65    if( rc!=0 ) re
10270 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
10280 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
10290 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 6a 53 7a  >journalOff==jSz
102a0 20 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   );.      }.#end
102b0 69 66 0a 20 20 20 20 20 20 7b 0a 20 20 20 20 20  if.      {.     
102c0 20 20 20 2f 2a 20 57 72 69 74 65 20 74 68 65 20     /* Write the 
102d0 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 74 6f 20  nRec value into 
102e0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
102f0 20 68 65 61 64 65 72 2e 20 49 66 20 69 6e 0a 20   header. If in. 
10300 20 20 20 20 20 20 20 2a 2a 20 66 75 6c 6c 2d 73         ** full-s
10310 79 6e 63 68 72 6f 6e 6f 75 73 20 6d 6f 64 65 2c  ynchronous mode,
10320 20 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61   sync the journa
10330 6c 20 66 69 72 73 74 2e 20 54 68 69 73 20 65 6e  l first. This en
10340 73 75 72 65 73 20 74 68 61 74 0a 20 20 20 20 20  sures that.     
10350 20 20 20 2a 2a 20 61 6c 6c 20 64 61 74 61 20 68     ** all data h
10360 61 73 20 72 65 61 6c 6c 79 20 68 69 74 20 74 68  as really hit th
10370 65 20 64 69 73 6b 20 62 65 66 6f 72 65 20 6e 52  e disk before nR
10380 65 63 20 69 73 20 75 70 64 61 74 65 64 20 74 6f  ec is updated to
10390 20 6d 61 72 6b 0a 20 20 20 20 20 20 20 20 2a 2a   mark.        **
103a0 20 69 74 20 61 73 20 61 20 63 61 6e 64 69 64 61   it as a candida
103b0 74 65 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b 2e  te for rollback.
103c0 20 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20   .        */.   
103d0 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
103e0 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
103f0 20 20 20 20 20 20 20 54 52 41 43 45 32 28 22 53         TRACE2("S
10400 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f 66 20 25  YNC journal of %
10410 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
10420 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 20 20  ager));.        
10430 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
10440 53 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66  Sync(&pPager->jf
10450 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  d);.          if
10460 28 20 72 63 21 3d 30 20 29 20 72 65 74 75 72 6e  ( rc!=0 ) return
10470 20 72 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   rc;.        }. 
10480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
10490 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
104a0 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  d, pPager->journ
104b0 61 6c 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61  alHdr + sizeof(a
104c0 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
104d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72 69          rc = wri
104e0 74 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72  te32bits(&pPager
104f0 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
10500 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
10510 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
10520 3b 0a 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;..        sqlit
10530 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72  e3OsSeek(&pPager
10540 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a  ->jfd, pPager->j
10550 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 20 20 20 20  ournalOff);.    
10560 20 20 7d 0a 20 20 20 20 20 20 54 52 41 43 45 32    }.      TRACE2
10570 28 22 53 59 4e 43 20 6a 6f 75 72 6e 61 6c 20 6f  ("SYNC journal o
10580 66 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  f %d\n", PAGERID
10590 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20  (pPager));.     
105a0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53   rc = sqlite3OsS
105b0 79 6e 63 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ync(&pPager->jfd
105c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
105d0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
105e0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
105f0 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31  urnalStarted = 1
10600 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67  ;.    }.    pPag
10610 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
10620 3b 0a 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20  ;..    /* Erase 
10630 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
10640 67 20 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67  g from every pag
10650 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f  e..    */.    fo
10660 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
10670 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
10680 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
10690 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
106a0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
106b0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
106c0 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70  nced = pPager->p
106d0 46 69 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e  First;.  }..#ifn
106e0 64 65 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20  def NDEBUG.  /* 
106f0 49 66 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  If the Pager.nee
10700 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c  dSync flag is cl
10710 65 61 72 20 74 68 65 6e 20 74 68 65 20 50 67 48  ear then the PgH
10720 64 72 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a  dr.needSync.  **
10730 20 66 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20   flag must also 
10740 62 65 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c  be clear for all
10750 20 70 61 67 65 73 2e 20 20 56 65 72 69 66 79 20   pages.  Verify 
10760 74 68 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69  that this.  ** i
10770 6e 76 61 72 69 61 6e 74 20 69 73 20 74 72 75 65  nvariant is true
10780 2e 0a 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20  ..  */.  else{. 
10790 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
107a0 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
107b0 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
107c0 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
107d0 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30  pPg->needSync==0
107e0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73   );.    }.    as
107f0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46  sert( pPager->pF
10800 69 72 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67  irstSynced==pPag
10810 65 72 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20  er->pFirst );.  
10820 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75  }.#endif..  retu
10830 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
10840 54 72 79 20 74 6f 20 6f 62 74 61 69 6e 20 61 20  Try to obtain a 
10850 6c 6f 63 6b 20 6f 6e 20 61 20 66 69 6c 65 2e 20  lock on a file. 
10860 20 49 6e 76 6f 6b 65 20 74 68 65 20 62 75 73 79   Invoke the busy
10870 20 63 61 6c 6c 62 61 63 6b 20 69 66 20 74 68 65   callback if the
10880 20 6c 6f 63 6b 0a 2a 2a 20 69 73 20 63 75 72 72   lock.** is curr
10890 65 6e 74 6c 79 20 6e 6f 74 20 61 76 61 69 6c 61  ently not availa
108a0 62 6c 65 2e 20 20 52 65 70 65 61 74 65 20 75 6e  ble.  Repeate un
108b0 74 69 6c 20 74 68 65 20 62 75 73 79 20 63 61 6c  til the busy cal
108c0 6c 62 61 63 6b 20 72 65 74 75 72 6e 73 0a 2a 2a  lback returns.**
108d0 20 66 61 6c 73 65 20 6f 72 20 75 6e 74 69 6c 20   false or until 
108e0 74 68 65 20 6c 6f 63 6b 20 73 75 63 63 65 65 64  the lock succeed
108f0 73 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  s..**.** Return 
10900 53 51 4c 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63  SQLITE_OK on suc
10910 63 65 73 73 20 61 6e 64 20 61 6e 20 65 72 72 6f  cess and an erro
10920 72 20 63 6f 64 65 20 69 66 20 77 65 20 63 61 6e  r code if we can
10930 6e 6f 74 20 6f 62 74 61 69 6e 0a 2a 2a 20 74 68  not obtain.** th
10940 65 20 6c 6f 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69  e lock..*/.stati
10950 63 20 69 6e 74 20 70 61 67 65 72 5f 77 61 69 74  c int pager_wait
10960 5f 6f 6e 5f 6c 6f 63 6b 28 50 61 67 65 72 20 2a  _on_lock(Pager *
10970 70 50 61 67 65 72 2c 20 69 6e 74 20 6c 6f 63 6b  pPager, int lock
10980 74 79 70 65 29 7b 0a 20 20 69 6e 74 20 72 63 3b  type){.  int rc;
10990 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52  .  assert( PAGER
109a0 5f 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f  _SHARED==SHARED_
109b0 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74  LOCK );.  assert
109c0 28 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44  ( PAGER_RESERVED
109d0 3d 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20  ==RESERVED_LOCK 
109e0 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  );.  assert( PAG
109f0 45 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58  ER_EXCLUSIVE==EX
10a00 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a  CLUSIVE_LOCK );.
10a10 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
10a20 61 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b  ate>=locktype ){
10a30 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45  .    rc = SQLITE
10a40 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  _OK;.  }else{.  
10a50 20 20 69 6e 74 20 62 75 73 79 20 3d 20 31 3b 0a    int busy = 1;.
10a60 20 20 20 20 64 6f 20 7b 0a 20 20 20 20 20 20 72      do {.      r
10a70 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63  c = sqlite3OsLoc
10a80 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 6c  k(&pPager->fd, l
10a90 6f 63 6b 74 79 70 65 29 3b 0a 20 20 20 20 7d 77  ocktype);.    }w
10aa0 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
10ab0 5f 42 55 53 59 20 26 26 20 0a 20 20 20 20 20 20  _BUSY && .      
10ac0 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
10ad0 61 6e 64 6c 65 72 20 26 26 20 0a 20 20 20 20 20  andler && .     
10ae0 20 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79     pPager->pBusy
10af0 48 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 20 26  Handler->xFunc &
10b00 26 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  & .        pPage
10b10 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d  r->pBusyHandler-
10b20 3e 78 46 75 6e 63 28 70 50 61 67 65 72 2d 3e 70  >xFunc(pPager->p
10b30 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e 70 41 72  BusyHandler->pAr
10b40 67 2c 20 62 75 73 79 2b 2b 29 0a 20 20 20 20 29  g, busy++).    )
10b50 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
10b60 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
10b70 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
10b80 20 6c 6f 63 6b 74 79 70 65 3b 0a 20 20 20 20 7d   locktype;.    }
10b90 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
10ba0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
10bb0 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
10bc0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
10bd0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
10be0 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
10bf0 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
10c00 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
10c10 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
10c20 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
10c30 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
10c40 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
10c50 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
10c60 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
10c70 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
10c80 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
10c90 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
10ca0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
10cb0 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
10cc0 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
10cd0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
10ce0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
10cf0 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
10d00 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
10d10 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
10d20 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
10d30 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
10d40 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
10d50 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
10d60 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
10d70 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
10d80 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
10d90 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
10da0 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
10db0 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
10dc0 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
10dd0 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
10de0 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
10df0 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
10e00 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
10e10 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
10e20 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
10e30 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
10e40 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
10e50 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
10e60 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
10e70 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
10e80 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
10e90 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
10ea0 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
10eb0 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
10ec0 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
10ed0 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
10ee0 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
10ef0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
10f00 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
10f10 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
10f20 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
10f30 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
10f40 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
10f50 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
10f60 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
10f70 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
10f80 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
10f90 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
10fa0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
10fb0 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
10fc0 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
10fd0 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
10fe0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
10ff0 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
11000 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
11010 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
11020 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
11030 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
11040 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
11050 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
11060 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
11070 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
11080 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11090 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
110a0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
110b0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
110c0 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
110d0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
110e0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 4c  &pPager->fd, (pL
110f0 69 73 74 2d 3e 70 67 6e 6f 2d 31 29 2a 28 69 36  ist->pgno-1)*(i6
11100 34 29 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  4)pPager->pageSi
11110 7a 65 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 74  ze);.    /* If t
11120 68 65 72 65 20 61 72 65 20 64 69 72 74 79 20 70  here are dirty p
11130 61 67 65 73 20 69 6e 20 74 68 65 20 70 61 67 65  ages in the page
11140 20 63 61 63 68 65 20 77 69 74 68 20 70 61 67 65   cache with page
11150 20 6e 75 6d 62 65 72 73 20 67 72 65 61 74 65 72   numbers greater
11160 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 50 61 67  .    ** than Pag
11170 65 72 2e 64 62 53 69 7a 65 2c 20 74 68 69 73 20  er.dbSize, this 
11180 6d 65 61 6e 73 20 73 71 6c 69 74 65 33 70 61 67  means sqlite3pag
11190 65 72 5f 74 72 75 6e 63 61 74 65 28 29 20 77 61  er_truncate() wa
111a0 73 20 63 61 6c 6c 65 64 20 74 6f 0a 20 20 20 20  s called to.    
111b0 2a 2a 20 6d 61 6b 65 20 74 68 65 20 66 69 6c 65  ** make the file
111c0 20 73 6d 61 6c 6c 65 72 20 28 70 72 65 73 75 6d   smaller (presum
111d0 61 62 6c 79 20 62 79 20 61 75 74 6f 2d 76 61 63  ably by auto-vac
111e0 75 75 6d 20 63 6f 64 65 29 2e 20 44 6f 20 6e 6f  uum code). Do no
111f0 74 20 77 72 69 74 65 0a 20 20 20 20 2a 2a 20 61  t write.    ** a
11200 6e 79 20 73 75 63 68 20 70 61 67 65 73 20 74 6f  ny such pages to
11210 20 74 68 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a   the file..    *
11220 2f 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  /.    if( pList-
11230 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 64  >pgno<=pPager->d
11240 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 43  bSize ){.      C
11250 4f 44 45 43 28 70 50 61 67 65 72 2c 20 50 47 48  ODEC(pPager, PGH
11260 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
11270 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20  ), pList->pgno, 
11280 36 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33  6);.      TRACE3
11290 28 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20  ("STORE %d page 
112a0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
112b0 50 61 67 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70  Pager), pList->p
112c0 67 6e 6f 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  gno);.      rc =
112d0 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
112e0 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  &pPager->fd, PGH
112f0 44 52 5f 54 4f 5f 44 41 54 41 28 70 4c 69 73 74  DR_TO_DATA(pList
11300 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
11310 69 7a 65 29 3b 0a 20 20 20 20 20 20 43 4f 44 45  ize);.      CODE
11320 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52 5f  C(pPager, PGHDR_
11330 54 4f 5f 44 41 54 41 28 70 4c 69 73 74 29 2c 20  TO_DATA(pList), 
11340 70 4c 69 73 74 2d 3e 70 67 6e 6f 2c 20 30 29 3b  pList->pgno, 0);
11350 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  .      pPager->n
11360 57 72 69 74 65 2b 2b 3b 0a 20 20 20 20 7d 0a 23  Write++;.    }.#
11370 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20  ifndef NDEBUG.  
11380 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20 54 52    else{.      TR
11390 41 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64  ACE3("NOSTORE %d
113a0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
113b0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c  ERID(pPager), pL
113c0 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  ist->pgno);.    
113d0 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28  }.#endif.    if(
113e0 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
113f0 0a 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74  .    pList->dirt
11400 79 20 3d 20 30 3b 0a 20 20 20 20 70 4c 69 73 74  y = 0;.    pList
11410 20 3d 20 70 4c 69 73 74 2d 3e 70 44 69 72 74 79   = pList->pDirty
11420 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
11430 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
11440 2a 2a 20 43 6f 6c 6c 65 63 74 20 65 76 65 72 79  ** Collect every
11450 20 64 69 72 74 79 20 70 61 67 65 20 69 6e 74 6f   dirty page into
11460 20 61 20 64 69 72 74 79 20 6c 69 73 74 20 61 6e   a dirty list an
11470 64 0a 2a 2a 20 72 65 74 75 72 6e 20 61 20 70 6f  d.** return a po
11480 69 6e 74 65 72 20 74 6f 20 74 68 65 20 68 65 61  inter to the hea
11490 64 20 6f 66 20 74 68 61 74 20 6c 69 73 74 2e 20  d of that list. 
114a0 20 41 6c 6c 20 70 61 67 65 73 20 61 72 65 0a 2a   All pages are.*
114b0 2a 20 63 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e  * collected even
114c0 20 69 66 20 74 68 65 79 20 61 72 65 20 73 74 69   if they are sti
114d0 6c 6c 20 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74  ll in use..*/.st
114e0 61 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65  atic PgHdr *page
114f0 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f  r_get_all_dirty_
11500 70 61 67 65 73 28 50 61 67 65 72 20 2a 70 50 61  pages(Pager *pPa
11510 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
11520 2c 20 2a 70 4c 69 73 74 3b 0a 20 20 70 4c 69 73  , *pList;.  pLis
11530 74 20 3d 20 30 3b 0a 20 20 66 6f 72 28 70 3d 70  t = 0;.  for(p=p
11540 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 3b 20  Pager->pAll; p; 
11550 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  p=p->pNextAll){.
11560 20 20 20 20 69 66 28 20 70 2d 3e 64 69 72 74 79      if( p->dirty
11570 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 70 44 69   ){.      p->pDi
11580 72 74 79 20 3d 20 70 4c 69 73 74 3b 0a 20 20 20  rty = pList;.   
11590 20 20 20 70 4c 69 73 74 20 3d 20 70 3b 0a 20 20     pList = p;.  
115a0 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
115b0 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
115c0 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65 2e   Acquire a page.
115d0 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c 6f  .**.** A read lo
115e0 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20 66  ck on the disk f
115f0 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ile is obtained 
11600 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 70  when the first p
11610 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64 2e  age is acquired.
11620 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20 6c   .** This read l
11630 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20 77  ock is dropped w
11640 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61 67  hen the last pag
11650 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a 2a  e is released..*
11660 2a 0a 2a 2a 20 41 20 5f 67 65 74 20 77 6f 72 6b  *.** A _get work
11670 73 20 66 6f 72 20 61 6e 79 20 70 61 67 65 20 6e  s for any page n
11680 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
11690 61 6e 20 30 2e 20 20 49 66 20 74 68 65 20 64 61  an 0.  If the da
116a0 74 61 62 61 73 65 0a 2a 2a 20 66 69 6c 65 20 69  tabase.** file i
116b0 73 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  s smaller than t
116c0 68 65 20 72 65 71 75 65 73 74 65 64 20 70 61 67  he requested pag
116d0 65 2c 20 74 68 65 6e 20 6e 6f 20 61 63 74 75 61  e, then no actua
116e0 6c 20 64 69 73 6b 0a 2a 2a 20 72 65 61 64 20 6f  l disk.** read o
116f0 63 63 75 72 73 20 61 6e 64 20 74 68 65 20 6d 65  ccurs and the me
11700 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 74 68  mory image of th
11710 65 20 70 61 67 65 20 69 73 20 69 6e 69 74 69 61  e page is initia
11720 6c 69 7a 65 64 20 74 6f 0a 2a 2a 20 61 6c 6c 20  lized to.** all 
11730 7a 65 72 6f 73 2e 20 20 54 68 65 20 65 78 74 72  zeros.  The extr
11740 61 20 64 61 74 61 20 61 70 70 65 6e 64 65 64 20  a data appended 
11750 74 6f 20 61 20 70 61 67 65 20 69 73 20 61 6c 77  to a page is alw
11760 61 79 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 0a  ays initialized.
11770 2a 2a 20 74 6f 20 7a 65 72 6f 73 20 74 68 65 20  ** to zeros the 
11780 66 69 72 73 74 20 74 69 6d 65 20 61 20 70 61 67  first time a pag
11790 65 20 69 73 20 6c 6f 61 64 65 64 20 69 6e 74 6f  e is loaded into
117a0 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 54   memory..**.** T
117b0 68 65 20 61 63 71 75 69 73 69 74 69 6f 6e 20 6d  he acquisition m
117c0 69 67 68 74 20 66 61 69 6c 20 66 6f 72 20 73 65  ight fail for se
117d0 76 65 72 61 6c 20 72 65 61 73 6f 6e 73 2e 20 20  veral reasons.  
117e0 49 6e 20 61 6c 6c 20 63 61 73 65 73 2c 0a 2a 2a  In all cases,.**
117f0 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65 20   an appropriate 
11800 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65  error code is re
11810 74 75 72 6e 65 64 20 61 6e 64 20 2a 70 70 50 61  turned and *ppPa
11820 67 65 20 69 73 20 73 65 74 20 74 6f 20 4e 55 4c  ge is set to NUL
11830 4c 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  L..**.** See als
11840 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 6c  o sqlite3pager_l
11850 6f 6f 6b 75 70 28 29 2e 20 20 42 6f 74 68 20 74  ookup().  Both t
11860 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 64 20  his routine and 
11870 5f 6c 6f 6f 6b 75 70 28 29 20 61 74 74 65 6d 70  _lookup() attemp
11880 74 0a 2a 2a 20 74 6f 20 66 69 6e 64 20 61 20 70  t.** to find a p
11890 61 67 65 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65  age in the in-me
118a0 6d 6f 72 79 20 63 61 63 68 65 20 66 69 72 73 74  mory cache first
118b0 2e 20 20 49 66 20 74 68 65 20 70 61 67 65 20 69  .  If the page i
118c0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 0a 2a 2a  s not already.**
118d0 20 69 6e 20 6d 65 6d 6f 72 79 2c 20 74 68 69 73   in memory, this
118e0 20 72 6f 75 74 69 6e 65 20 67 6f 65 73 20 74 6f   routine goes to
118f0 20 64 69 73 6b 20 74 6f 20 72 65 61 64 20 69 74   disk to read it
11900 20 69 6e 20 77 68 65 72 65 61 73 20 5f 6c 6f 6f   in whereas _loo
11910 6b 75 70 28 29 0a 2a 2a 20 6a 75 73 74 20 72 65  kup().** just re
11920 74 75 72 6e 73 20 30 2e 20 20 54 68 69 73 20 72  turns 0.  This r
11930 6f 75 74 69 6e 65 20 61 63 71 75 69 72 65 73 20  outine acquires 
11940 61 20 72 65 61 64 2d 6c 6f 63 6b 20 74 68 65 20  a read-lock the 
11950 66 69 72 73 74 20 74 69 6d 65 20 69 74 0a 2a 2a  first time it.**
11960 20 68 61 73 20 74 6f 20 67 6f 20 74 6f 20 64 69   has to go to di
11970 73 6b 2c 20 61 6e 64 20 63 6f 75 6c 64 20 61 6c  sk, and could al
11980 73 6f 20 70 6c 61 79 62 61 63 6b 20 61 6e 20 6f  so playback an o
11990 6c 64 20 6a 6f 75 72 6e 61 6c 20 69 66 20 6e 65  ld journal if ne
119a0 63 65 73 73 61 72 79 2e 0a 2a 2a 20 53 69 6e 63  cessary..** Sinc
119b0 65 20 5f 6c 6f 6f 6b 75 70 28 29 20 6e 65 76 65  e _lookup() neve
119c0 72 20 67 6f 65 73 20 74 6f 20 64 69 73 6b 2c 20  r goes to disk, 
119d0 69 74 20 6e 65 76 65 72 20 68 61 73 20 74 6f 20  it never has to 
119e0 64 65 61 6c 20 77 69 74 68 20 6c 6f 63 6b 73 0a  deal with locks.
119f0 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c 20 66 69  ** or journal fi
11a00 6c 65 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  les..*/.int sqli
11a10 74 65 33 70 61 67 65 72 5f 67 65 74 28 50 61 67  te3pager_get(Pag
11a20 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
11a30 20 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 2a 70 70   pgno, void **pp
11a40 50 61 67 65 29 7b 0a 20 20 50 67 48 64 72 20 2a  Page){.  PgHdr *
11a50 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  pPg;.  int rc;..
11a60 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
11a70 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
11a80 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
11a90 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
11aa0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
11ab0 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21  .  assert( pgno!
11ac0 3d 30 20 29 3b 0a 20 20 2a 70 70 50 61 67 65 20  =0 );.  *ppPage 
11ad0 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67 65  = 0;.  if( pPage
11ae0 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50  r->errMask & ~(P
11af0 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29  AGER_ERR_FULL) )
11b00 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 61 67  {.    return pag
11b10 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65  er_errcode(pPage
11b20 72 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66  r);.  }..  /* If
11b30 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
11b40 73 74 20 70 61 67 65 20 61 63 63 65 73 73 65 64  st page accessed
11b50 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53 48 41  , then get a SHA
11b60 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20 6f 6e  RED lock.  ** on
11b70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11b80 6c 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  le..  */.  if( p
11b90 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26  Pager->nRef==0 &
11ba0 26 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  & !MEMDB ){.    
11bb0 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
11bc0 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
11bd0 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SHARED_LOCK);.  
11be0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
11bf0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74  _OK ){.      ret
11c00 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20  urn rc;.    }.. 
11c10 20 20 20 2f 2a 20 49 66 20 61 20 6a 6f 75 72 6e     /* If a journ
11c20 61 6c 20 66 69 6c 65 20 65 78 69 73 74 73 2c 20  al file exists, 
11c30 61 6e 64 20 74 68 65 72 65 20 69 73 20 6e 6f 20  and there is no 
11c40 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
11c50 20 74 68 65 0a 20 20 20 20 2a 2a 20 64 61 74 61   the.    ** data
11c60 62 61 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20  base file, then 
11c70 69 74 20 65 69 74 68 65 72 20 6e 65 65 64 73 20  it either needs 
11c80 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62 61 63  to be played bac
11c90 6b 20 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20  k or deleted..  
11ca0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61    */.    if( pPa
11cb0 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
11cc0 26 26 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69  && .        sqli
11cd0 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74 73 28  te3OsFileExists(
11ce0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
11cf0 29 20 26 26 0a 20 20 20 20 20 20 20 20 21 73 71  ) &&.        !sq
11d00 6c 69 74 65 33 4f 73 43 68 65 63 6b 52 65 73 65  lite3OsCheckRese
11d10 72 76 65 64 4c 6f 63 6b 28 26 70 50 61 67 65 72  rvedLock(&pPager
11d20 2d 3e 66 64 29 20 0a 20 20 20 20 29 7b 0a 20 20  ->fd) .    ){.  
11d30 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20       int rc;..  
11d40 20 20 20 20 20 2f 2a 20 47 65 74 20 61 6e 20 45       /* Get an E
11d50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e  XCLUSIVE lock on
11d60 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
11d70 6c 65 2e 20 41 74 20 74 68 69 73 20 70 6f 69 6e  le. At this poin
11d80 74 20 69 74 20 69 73 0a 20 20 20 20 20 20 20 2a  t it is.       *
11d90 2a 20 69 6d 70 6f 72 74 61 6e 74 20 74 68 61 74  * important that
11da0 20 61 20 52 45 53 45 52 56 45 44 20 6c 6f 63 6b   a RESERVED lock
11db0 20 69 73 20 6e 6f 74 20 6f 62 74 61 69 6e 65 64   is not obtained
11dc0 20 6f 6e 20 74 68 65 20 77 61 79 20 74 6f 20 74   on the way to t
11dd0 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 45 58 43  he.       ** EXC
11de0 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20  LUSIVE lock. If 
11df0 69 74 20 77 65 72 65 2c 20 61 6e 6f 74 68 65 72  it were, another
11e00 20 70 72 6f 63 65 73 73 20 6d 69 67 68 74 20 6f   process might o
11e10 70 65 6e 20 74 68 65 0a 20 20 20 20 20 20 20 2a  pen the.       *
11e20 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c  * database file,
11e30 20 64 65 74 65 63 74 20 74 68 65 20 52 45 53 45   detect the RESE
11e40 52 56 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63  RVED lock, and c
11e50 6f 6e 63 6c 75 64 65 20 74 68 61 74 20 74 68 65  onclude that the
11e60 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62  .       ** datab
11e70 61 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72  ase is safe to r
11e80 65 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70  ead while this p
11e90 72 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20  rocess is still 
11ea0 72 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20  rolling it .    
11eb0 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
11ec0 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 2a 2a     ** .       **
11ed0 20 42 65 63 61 75 73 65 20 74 68 65 20 69 6e 74   Because the int
11ee0 65 72 6d 65 64 69 61 74 65 20 52 45 53 45 52 56  ermediate RESERV
11ef0 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74 20 72  ED lock is not r
11f00 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a 20 20  equested, the.  
11f10 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e 64 20 70       ** second p
11f20 72 6f 63 65 73 73 20 77 69 6c 6c 20 67 65 74 20  rocess will get 
11f30 74 6f 20 74 68 69 73 20 70 6f 69 6e 74 20 69 6e  to this point in
11f40 20 74 68 65 20 63 6f 64 65 20 61 6e 64 20 66 61   the code and fa
11f50 69 6c 20 74 6f 0a 20 20 20 20 20 20 20 2a 2a 20  il to.       ** 
11f60 6f 62 74 61 69 6e 20 69 74 27 73 20 6f 77 6e 20  obtain it's own 
11f70 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
11f80 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
11f90 69 6c 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a 20  ile..       */. 
11fa0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
11fb0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
11fc0 2d 3e 66 64 2c 20 45 58 43 4c 55 53 49 56 45 5f  ->fd, EXCLUSIVE_
11fd0 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 20 69 66  LOCK);.       if
11fe0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11ff0 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  ){.         sqli
12000 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61  te3OsUnlock(&pPa
12010 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b  ger->fd, NO_LOCK
12020 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  );.         pPag
12030 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45  er->state = PAGE
12040 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20 20  R_UNLOCK;.      
12050 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
12060 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 70 50       }.       pP
12070 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
12080 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b 0a 0a  GER_EXCLUSIVE;..
12090 20 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 74         /* Open t
120a0 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
120b0 65 61 64 69 6e 67 20 6f 6e 6c 79 2e 20 20 52 65  eading only.  Re
120c0 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53 59  turn SQLITE_BUSY
120d0 20 69 66 0a 20 20 20 20 20 20 20 2a 2a 20 77 65   if.       ** we
120e0 20 61 72 65 20 75 6e 61 62 6c 65 20 74 6f 20 6f   are unable to o
120f0 70 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  pen the journal 
12100 66 69 6c 65 2e 20 0a 20 20 20 20 20 20 20 2a 2a  file. .       **
12110 0a 20 20 20 20 20 20 20 2a 2a 20 54 68 65 20 6a  .       ** The j
12120 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 6f 65 73  ournal file does
12130 20 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20   not need to be 
12140 6c 6f 63 6b 65 64 20 69 74 73 65 6c 66 2e 20 20  locked itself.  
12150 54 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 6a 6f  The.       ** jo
12160 75 72 6e 61 6c 20 66 69 6c 65 20 69 73 20 6e 65  urnal file is ne
12170 76 65 72 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20  ver open unless 
12180 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
12190 65 20 66 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20  e file holds.   
121a0 20 20 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c      ** a write l
121b0 6f 63 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73  ock, so there is
121c0 20 6e 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63   never any chanc
121d0 65 20 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65  e of two or more
121e0 0a 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65  .       ** proce
121f0 73 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65  sses opening the
12200 20 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20   journal at the 
12210 73 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20  same time..     
12220 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20 3d    */.       rc =
12230 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65   sqlite3OsOpenRe
12240 61 64 4f 6e 6c 79 28 70 50 61 67 65 72 2d 3e 7a  adOnly(pPager->z
12250 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61 67 65 72  Journal, &pPager
12260 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 20 69  ->jfd);.       i
12270 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
12280 20 29 7b 0a 20 20 20 20 20 20 20 20 20 73 71 6c   ){.         sql
12290 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50  ite3OsUnlock(&pP
122a0 61 67 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43  ager->fd, NO_LOC
122b0 4b 29 3b 0a 20 20 20 20 20 20 20 20 20 70 50 61  K);.         pPa
122c0 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47  ger->state = PAG
122d0 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 20 20 20  ER_UNLOCK;.     
122e0 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
122f0 45 5f 42 55 53 59 3b 0a 20 20 20 20 20 20 20 7d  E_BUSY;.       }
12300 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12310 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b  journalOpen = 1;
12320 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12330 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20 3d  journalStarted =
12340 20 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65   0;.       pPage
12350 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20  r->journalOff = 
12360 30 3b 0a 20 20 20 20 20 20 20 70 50 61 67 65 72  0;.       pPager
12370 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
12380 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  .       pPager->
12390 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
123a0 0a 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62  .       /* Playb
123b0 61 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74  ack and delete t
123c0 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f  he journal.  Dro
123d0 70 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  p the database w
123e0 72 69 74 65 0a 20 20 20 20 20 20 20 2a 2a 20 6c  rite.       ** l
123f0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
12400 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
12410 0a 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  .       */.     
12420 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
12430 79 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  yback(pPager);. 
12440 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
12450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
12460 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
12470 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
12480 20 20 70 50 67 20 3d 20 30 3b 0a 20 20 7d 65 6c    pPg = 0;.  }el
12490 73 65 7b 0a 20 20 20 20 2f 2a 20 53 65 61 72 63  se{.    /* Searc
124a0 68 20 66 6f 72 20 70 61 67 65 20 69 6e 20 63 61  h for page in ca
124b0 63 68 65 20 2a 2f 0a 20 20 20 20 70 50 67 20 3d  che */.    pPg =
124c0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
124d0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 20  ager, pgno);.   
124e0 20 69 66 28 20 4d 45 4d 44 42 20 26 26 20 70 50   if( MEMDB && pP
124f0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
12500 45 52 5f 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20  ER_UNLOCK ){.   
12510 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
12520 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
12530 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
12540 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f   pPg==0 ){.    /
12550 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20  * The requested 
12560 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74  page is not in t
12570 68 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a  he page cache. *
12580 2f 0a 20 20 20 20 69 6e 74 20 68 3b 0a 20 20 20  /.    int h;.   
12590 20 70 50 61 67 65 72 2d 3e 6e 4d 69 73 73 2b 2b   pPager->nMiss++
125a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
125b0 2d 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e  ->nPage<pPager->
125c0 6d 78 50 61 67 65 20 7c 7c 20 70 50 61 67 65 72  mxPage || pPager
125d0 2d 3e 70 46 69 72 73 74 3d 3d 30 20 7c 7c 20 4d  ->pFirst==0 || M
125e0 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 2f 2a  EMDB ){.      /*
125f0 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
12600 67 65 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20  ge */.      pPg 
12610 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
12620 77 28 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 20  w( sizeof(*pPg) 
12630 2b 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69 67  + pPager->psAlig
12640 6e 65 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ned.            
12650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12660 20 20 2b 20 73 69 7a 65 6f 66 28 75 33 32 29 20    + sizeof(u32) 
12670 2b 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  + pPager->nExtra
12680 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b                 +
126a0 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66 28 50 67   MEMDB*sizeof(Pg
126b0 48 69 73 74 6f 72 79 29 20 29 3b 0a 20 20 20 20  History) );.    
126c0 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b 0a    if( pPg==0 ){.
126d0 20 20 20 20 20 20 20 20 69 66 28 20 21 4d 45 4d          if( !MEM
126e0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
126f0 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
12700 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  k(pPager);.     
12710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61     }.        pPa
12720 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20  ger->errMask |= 
12730 50 41 47 45 52 5f 45 52 52 5f 4d 45 4d 3b 0a 20  PAGER_ERR_MEM;. 
12740 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
12750 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
12760 20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74    }.      memset
12770 28 70 50 67 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (pPg, 0, sizeof(
12780 2a 70 50 67 29 29 3b 0a 20 20 20 20 20 20 69 66  *pPg));.      if
12790 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
127a0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
127b0 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61  TO_HIST(pPg, pPa
127c0 67 65 72 29 2c 20 30 2c 20 73 69 7a 65 6f 66 28  ger), 0, sizeof(
127d0 50 67 48 69 73 74 6f 72 79 29 29 3b 0a 20 20 20  PgHistory));.   
127e0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e     }.      pPg->
127f0 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72 3b  pPager = pPager;
12800 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65 78  .      pPg->pNex
12810 74 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70  tAll = pPager->p
12820 41 6c 6c 3b 0a 20 20 20 20 20 20 70 50 61 67 65  All;.      pPage
12830 72 2d 3e 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20  r->pAll = pPg;. 
12840 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50 61       pPager->nPa
12850 67 65 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ge++;.    }else{
12860 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 64 20 61  .      /* Find a
12870 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
12880 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65  .  Try to locate
12890 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
128a0 73 20 6e 6f 74 0a 20 20 20 20 20 20 2a 2a 20 72  s not.      ** r
128b0 65 71 75 69 72 65 20 75 73 20 74 6f 20 64 6f 20  equire us to do 
128c0 61 6e 20 66 73 79 6e 63 28 29 20 6f 6e 20 74 68  an fsync() on th
128d0 65 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20 20 20  e journal..     
128e0 20 2a 2f 0a 20 20 20 20 20 20 70 50 67 20 3d 20   */.      pPg = 
128f0 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12900 6e 63 65 64 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nced;..      /* 
12910 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
12920 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
12930 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
12940 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 20  e an fsync().   
12950 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 6a 6f 75     ** on the jou
12960 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 66  rnal file then f
12970 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
12980 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69 73 20   file.  This is 
12990 61 0a 20 20 20 20 20 20 2a 2a 20 76 65 72 79 20  a.      ** very 
129a0 73 6c 6f 77 20 6f 70 65 72 61 74 69 6f 6e 2c 20  slow operation, 
129b0 73 6f 20 77 65 20 77 6f 72 6b 20 68 61 72 64 20  so we work hard 
129c0 74 6f 20 61 76 6f 69 64 20 69 74 2e 20 20 42 75  to avoid it.  Bu
129d0 74 20 73 6f 6d 65 74 69 6d 65 73 0a 20 20 20 20  t sometimes.    
129e0 20 20 2a 2a 20 69 74 20 63 61 6e 27 74 20 62 65    ** it can't be
129f0 20 68 65 6c 70 65 64 2e 0a 20 20 20 20 20 20 2a   helped..      *
12a00 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 3d  /.      if( pPg=
12a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  =0 ){.        in
12a20 74 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e  t rc = syncJourn
12a30 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
12a40 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 7b      if( rc!=0 ){
12a50 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
12a60 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
12a70 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12a80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
12a90 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20 20  E_IOERR;.       
12aa0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
12ab0 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
12ac0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
12ad0 49 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  If in full-sync 
12ae0 6d 6f 64 65 2c 20 77 72 69 74 65 20 61 20 6e 65  mode, write a ne
12af0 77 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  w journal header
12b00 20 69 6e 74 6f 20 74 68 65 0a 09 20 20 2a 2a 20   into the..  ** 
12b10 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 54 68  journal file. Th
12b20 69 73 20 69 73 20 64 6f 6e 65 20 74 6f 20 61 76  is is done to av
12b30 6f 69 64 20 65 76 65 72 20 6d 6f 64 69 66 79 69  oid ever modifyi
12b40 6e 67 20 61 20 6a 6f 75 72 6e 61 6c 0a 09 20 20  ng a journal..  
12b50 2a 2a 20 68 65 61 64 65 72 20 74 68 61 74 20 69  ** header that i
12b60 73 20 69 6e 76 6f 6c 76 65 64 20 69 6e 20 74 68  s involved in th
12b70 65 20 72 6f 6c 6c 62 61 63 6b 20 6f 66 20 70 61  e rollback of pa
12b80 67 65 73 20 74 68 61 74 20 68 61 76 65 0a 09 20  ges that have.. 
12b90 20 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e   ** already been
12ba0 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
12bb0 64 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73  database (in cas
12bc0 65 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a  e the header is.
12bd0 09 20 20 2a 2a 20 74 72 61 73 68 65 64 20 77 68  .  ** trashed wh
12be0 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c  en the nRec fiel
12bf0 64 20 69 73 20 75 70 64 61 74 65 64 29 2e 0a 20  d is updated).. 
12c00 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
12c10 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52        pPager->nR
12c20 65 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ec = 0;.        
12c30 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12c40 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3e 20 30  ->journalOff > 0
12c50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
12c60 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48   = writeJournalH
12c70 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  dr(pPager);.    
12c80 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20        if( rc!=0 
12c90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
12ca0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
12cb0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
12cc0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
12cd0 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
12ce0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
12cf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 50 67     }.        pPg
12d00 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73   = pPager->pFirs
12d10 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
12d20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
12d30 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 20 20 20 20  ef==0 );..      
12d40 2f 2a 20 57 72 69 74 65 20 74 68 65 20 70 61 67  /* Write the pag
12d50 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
12d60 65 20 66 69 6c 65 20 69 66 20 69 74 20 69 73 20  e file if it is 
12d70 64 69 72 74 79 2e 0a 20 20 20 20 20 20 2a 2f 0a  dirty..      */.
12d80 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e 64        if( pPg->d
12d90 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
12da0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65  assert( pPg->nee
12db0 64 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20  dSync==0 );.    
12dc0 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74 79 20      pPg->pDirty 
12dd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
12de0 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61  = pager_write_pa
12df0 67 65 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20  gelist( pPg );. 
12e00 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
12e10 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
12e20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
12e30 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
12e40 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
12e50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12e60 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
12e70 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
12e80 72 74 28 20 70 50 67 2d 3e 64 69 72 74 79 3d 3d  rt( pPg->dirty==
12e90 30 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 49  0 );..      /* I
12ea0 66 20 74 68 65 20 70 61 67 65 20 77 65 20 61 72  f the page we ar
12eb0 65 20 72 65 63 79 63 6c 69 6e 67 20 69 73 20 6d  e recycling is m
12ec0 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
12ed0 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e 0a 20 20  ollback, then.  
12ee0 20 20 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67      ** set the g
12ef0 6c 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c  lobal alwaysRoll
12f00 62 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20  back flag, thus 
12f10 64 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20  disabling the.  
12f20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 64 6f      ** sqlite_do
12f30 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 6f 70  nt_rollback() op
12f40 74 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74  timization for t
12f50 68 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20  he rest of this 
12f60 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
12f70 20 20 20 2a 2a 20 49 74 20 69 73 20 6e 65 63 65     ** It is nece
12f80 73 73 61 72 79 20 74 6f 20 64 6f 20 74 68 69 73  ssary to do this
12f90 20 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67   because the pag
12fa0 65 20 6d 61 72 6b 65 64 20 61 6c 77 61 79 73 52  e marked alwaysR
12fb0 6f 6c 6c 62 61 63 6b 0a 20 20 20 20 20 20 2a 2a  ollback.      **
12fc0 20 6d 69 67 68 74 20 62 65 20 72 65 6c 6f 61 64   might be reload
12fd0 65 64 20 61 74 20 61 20 6c 61 74 65 72 20 74 69  ed at a later ti
12fe0 6d 65 20 62 75 74 20 61 74 20 74 68 61 74 20 70  me but at that p
12ff0 6f 69 6e 74 20 77 65 20 77 6f 6e 27 74 20 72 65  oint we won't re
13000 6d 65 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  member.      ** 
13010 74 68 61 74 20 69 73 20 77 61 73 20 6d 61 72 6b  that is was mark
13020 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  ed alwaysRollbac
13030 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e 73 20 74  k.  This means t
13040 68 61 74 20 61 6c 6c 20 70 61 67 65 73 20 6d 75  hat all pages mu
13050 73 74 0a 20 20 20 20 20 20 2a 2a 20 62 65 20 6d  st.      ** be m
13060 61 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52  arked as alwaysR
13070 6f 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72  ollback from her
13080 65 20 6f 6e 20 6f 75 74 2e 0a 20 20 20 20 20 20  e on out..      
13090 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 50 67  */.      if( pPg
130a0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
130b0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67   ){.        pPag
130c0 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61  er->alwaysRollba
130d0 63 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  ck = 1;.      }.
130e0 0a 20 20 20 20 20 20 2f 2a 20 55 6e 6c 69 6e 6b  .      /* Unlink
130f0 20 74 68 65 20 6f 6c 64 20 70 61 67 65 20 66 72   the old page fr
13100 6f 6d 20 74 68 65 20 66 72 65 65 20 6c 69 73 74  om the free list
13110 20 61 6e 64 20 74 68 65 20 68 61 73 68 20 74 61   and the hash ta
13120 62 6c 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ble.      */.   
13130 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
13140 67 29 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72  g);.      pPager
13150 2d 3e 6e 4f 76 66 6c 2b 2b 3b 0a 20 20 20 20 7d  ->nOvfl++;.    }
13160 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e 6f 20 3d  .    pPg->pgno =
13170 20 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28 20 70   pgno;.    if( p
13180 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
13190 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c 3d  l && (int)pgno<=
131a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
131b0 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ze ){.      sqli
131c0 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79 28 70  te3CheckMemory(p
131d0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
131e0 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20 20 20  l, pgno/8);.    
131f0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
13200 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b  ->journalOpen );
13210 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  .      pPg->inJo
13220 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65 72 2d  urnal = (pPager-
13230 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67 6e 6f  >aInJournal[pgno
13240 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
13250 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20 20 70  7)))!=0;.      p
13260 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
13270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
13280 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61     pPg->inJourna
13290 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  l = 0;.      pPg
132a0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
132b0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
132c0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 26 26  ager->aInStmt &&
132d0 20 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67   (int)pgno<=pPag
132e0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 0a 20 20 20  er->stmtSize.   
132f0 20 20 20 20 20 20 20 20 20 20 26 26 20 28 70 50            && (pP
13300 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 67  ager->aInStmt[pg
13310 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
13320 6f 26 37 29 29 29 21 3d 30 20 29 7b 0a 20 20 20  o&7)))!=0 ){.   
13330 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
13340 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
13350 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13360 70 61 67 65 5f 72 65 6d 6f 76 65 5f 66 72 6f 6d  page_remove_from
13370 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
13380 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d 3e  .    }.    pPg->
13390 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70  dirty = 0;.    p
133a0 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a 20 20  Pg->nRef = 1;.  
133b0 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b 0a    REFINFO(pPg);.
133c0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66      pPager->nRef
133d0 2b 2b 3b 0a 20 20 20 20 68 20 3d 20 70 61 67 65  ++;.    h = page
133e0 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b 0a 20 20  r_hash(pgno);.  
133f0 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68    pPg->pNextHash
13400 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68   = pPager->aHash
13410 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  [h];.    pPager-
13420 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50 67 3b  >aHash[h] = pPg;
13430 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 4e  .    if( pPg->pN
13440 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20 20 20  extHash ){.     
13450 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 70 4e   assert( pPg->pN
13460 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48 61  extHash->pPrevHa
13470 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70  sh==0 );.      p
13480 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d 3e 70  Pg->pNextHash->p
13490 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
134a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50      }.    if( pP
134b0 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20 29  ager->nExtra>0 )
134c0 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
134d0 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50  GHDR_TO_EXTRA(pP
134e0 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 70  g, pPager), 0, p
134f0 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b 0a  Pager->nExtra);.
13500 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
13510 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74  3pager_pagecount
13520 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
13530 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73  ( pPager->errMas
13540 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  k!=0 ){.      sq
13550 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
13560 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
13570 50 67 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Pg));.      rc =
13580 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70   pager_errcode(p
13590 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72 65  Pager);.      re
135a0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20  turn rc;.    }. 
135b0 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64     if( pPager->d
135c0 62 53 69 7a 65 3c 28 69 6e 74 29 70 67 6e 6f 20  bSize<(int)pgno 
135d0 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
135e0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
135f0 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
13600 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65  ageSize);.    }e
13610 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 72  lse{.      int r
13620 63 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  c;.      assert(
13630 20 4d 45 4d 44 42 3d 3d 30 20 29 3b 0a 20 20 20   MEMDB==0 );.   
13640 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
13650 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70  (&pPager->fd, (p
13660 67 6e 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67  gno-1)*(i64)pPag
13670 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
13680 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
13690 33 4f 73 52 65 61 64 28 26 70 50 61 67 65 72 2d  3OsRead(&pPager-
136a0 3e 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  >fd, PGHDR_TO_DA
136b0 54 41 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d  TA(pPg), pPager-
136c0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
136d0 20 20 54 52 41 43 45 33 28 22 46 45 54 43 48 20    TRACE3("FETCH 
136e0 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50  %d page %d\n", P
136f0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20  AGERID(pPager), 
13700 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20  pPg->pgno);.    
13710 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20    CODEC(pPager, 
13720 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
13730 67 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 33  g), pPg->pgno, 3
13740 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
13750 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
13760 20 20 20 20 20 20 69 36 34 20 66 69 6c 65 53 69        i64 fileSi
13770 7a 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ze;.        if( 
13780 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
13790 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 26 66  e(&pPager->fd,&f
137a0 69 6c 65 53 69 7a 65 29 21 3d 53 51 4c 49 54 45  ileSize)!=SQLITE
137b0 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 20 20  _OK.            
137c0 20 20 20 7c 7c 20 66 69 6c 65 53 69 7a 65 3e 3d     || fileSize>=
137d0 70 67 6e 6f 2a 70 50 61 67 65 72 2d 3e 70 61 67  pgno*pPager->pag
137e0 65 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 20  eSize ){.       
137f0 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
13800 75 6e 72 65 66 28 50 47 48 44 52 5f 54 4f 5f 44  unref(PGHDR_TO_D
13810 41 54 41 28 70 50 67 29 29 3b 0a 20 20 20 20 20  ATA(pPg));.     
13820 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
13830 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13840 20 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74 28           memset(
13850 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
13860 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
13870 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
13880 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
13890 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
138a0 3e 6e 52 65 61 64 2b 2b 3b 0a 20 20 20 20 20 20  >nRead++;.      
138b0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b  }.    }.  }else{
138c0 0a 20 20 20 20 2f 2a 20 54 68 65 20 72 65 71 75  .    /* The requ
138d0 65 73 74 65 64 20 70 61 67 65 20 69 73 20 69 6e  ested page is in
138e0 20 74 68 65 20 70 61 67 65 20 63 61 63 68 65 2e   the page cache.
138f0 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   */.    pPager->
13900 6e 48 69 74 2b 2b 3b 0a 20 20 20 20 70 61 67 65  nHit++;.    page
13910 5f 72 65 66 28 70 50 67 29 3b 0a 20 20 7d 0a 20  _ref(pPg);.  }. 
13920 20 2a 70 70 50 61 67 65 20 3d 20 50 47 48 44 52   *ppPage = PGHDR
13930 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
13940 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
13950 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75  K;.}../*.** Acqu
13960 69 72 65 20 61 20 70 61 67 65 20 69 66 20 69 74  ire a page if it
13970 20 69 73 20 61 6c 72 65 61 64 79 20 69 6e 20 74   is already in t
13980 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63  he in-memory cac
13990 68 65 2e 20 20 44 6f 0a 2a 2a 20 6e 6f 74 20 72  he.  Do.** not r
139a0 65 61 64 20 74 68 65 20 70 61 67 65 20 66 72 6f  ead the page fro
139b0 6d 20 64 69 73 6b 2e 20 20 52 65 74 75 72 6e 20  m disk.  Return 
139c0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
139d0 20 70 61 67 65 2c 0a 2a 2a 20 6f 72 20 30 20 69   page,.** or 0 i
139e0 66 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f  f the page is no
139f0 74 20 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a  t in cache..**.*
13a00 2a 20 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74  * See also sqlit
13a10 65 33 70 61 67 65 72 5f 67 65 74 28 29 2e 20 20  e3pager_get().  
13a20 54 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 62  The difference b
13a30 65 74 77 65 65 6e 20 74 68 69 73 20 72 6f 75 74  etween this rout
13a40 69 6e 65 0a 2a 2a 20 61 6e 64 20 73 71 6c 69 74  ine.** and sqlit
13a50 65 33 70 61 67 65 72 5f 67 65 74 28 29 20 69 73  e3pager_get() is
13a60 20 74 68 61 74 20 5f 67 65 74 28 29 20 77 69 6c   that _get() wil
13a70 6c 20 67 6f 20 74 6f 20 74 68 65 20 64 69 73 6b  l go to the disk
13a80 20 61 6e 64 20 72 65 61 64 0a 2a 2a 20 69 6e 20   and read.** in 
13a90 74 68 65 20 70 61 67 65 20 69 66 20 74 68 65 20  the page if the 
13aa0 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65  page is not alre
13ab0 61 64 79 20 69 6e 20 63 61 63 68 65 2e 20 20 54  ady in cache.  T
13ac0 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
13ad0 65 74 75 72 6e 73 20 4e 55 4c 4c 20 69 66 20 74  eturns NULL if t
13ae0 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69  he page is not i
13af0 6e 20 63 61 63 68 65 20 6f 72 20 69 66 20 61 20  n cache or if a 
13b00 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f 72 20 0a  disk I/O error .
13b10 2a 2a 20 68 61 73 20 65 76 65 72 20 68 61 70 70  ** has ever happ
13b20 65 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  ened..*/.void *s
13b30 71 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 6f 6b  qlite3pager_look
13b40 75 70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  up(Pager *pPager
13b50 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20  , Pgno pgno){.  
13b60 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 61  PgHdr *pPg;..  a
13b70 73 73 65 72 74 28 20 70 50 61 67 65 72 21 3d 30  ssert( pPager!=0
13b80 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 67   );.  assert( pg
13b90 6e 6f 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  no!=0 );.  if( p
13ba0 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26  Pager->errMask &
13bb0 20 7e 28 50 41 47 45 52 5f 45 52 52 5f 46 55 4c   ~(PAGER_ERR_FUL
13bc0 4c 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  L) ){.    return
13bd0 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
13be0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
13bf0 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
13c00 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
13c10 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
13c20 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 50  pPg);.  return P
13c30 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
13c40 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65  );.}../*.** Rele
13c50 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a  ase a page..**.*
13c60 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20  * If the number 
13c70 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
13c80 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20 74   the page drop t
13c90 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  o zero, then the
13ca0 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64 65  .** page is adde
13cb0 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69 73  d to the LRU lis
13cc0 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65 66  t.  When all ref
13cd0 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20 70  erences to all p
13ce0 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c 65  ages.** are rele
13cf0 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63 6b  ased, a rollback
13d00 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65 20   occurs and the 
13d10 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
13d20 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f 76  base is.** remov
13d30 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ed..*/.int sqlit
13d40 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 76 6f  e3pager_unref(vo
13d50 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
13d60 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 2f 2a 20  Hdr *pPg;..  /* 
13d70 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20 72 65  Decrement the re
13d80 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f  ference count fo
13d90 72 20 74 68 69 73 20 70 61 67 65 0a 20 20 2a 2f  r this page.  */
13da0 0a 20 20 70 50 67 20 3d 20 44 41 54 41 5f 54 4f  .  pPg = DATA_TO
13db0 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20  _PGHDR(pData);. 
13dc0 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
13dd0 65 66 3e 30 20 29 3b 0a 20 20 70 50 67 2d 3e 6e  ef>0 );.  pPg->n
13de0 52 65 66 2d 2d 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref--;.  REFINFO
13df0 28 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 57 68 65  (pPg);..  /* Whe
13e00 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
13e10 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 61 20  references to a 
13e20 70 61 67 65 20 72 65 61 63 68 20 30 2c 20 63 61  page reach 0, ca
13e30 6c 6c 20 74 68 65 0a 20 20 2a 2a 20 64 65 73 74  ll the.  ** dest
13e40 72 75 63 74 6f 72 20 61 6e 64 20 61 64 64 20 74  ructor and add t
13e50 68 65 20 70 61 67 65 20 74 6f 20 74 68 65 20 66  he page to the f
13e60 72 65 65 6c 69 73 74 2e 0a 20 20 2a 2f 0a 20 20  reelist..  */.  
13e70 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  if( pPg->nRef==0
13e80 20 29 7b 0a 20 20 20 20 50 61 67 65 72 20 2a 70   ){.    Pager *p
13e90 50 61 67 65 72 3b 0a 20 20 20 20 70 50 61 67 65  Pager;.    pPage
13ea0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
13eb0 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46  .    pPg->pNextF
13ec0 72 65 65 20 3d 20 30 3b 0a 20 20 20 20 70 50 67  ree = 0;.    pPg
13ed0 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70 50  ->pPrevFree = pP
13ee0 61 67 65 72 2d 3e 70 4c 61 73 74 3b 0a 20 20 20  ager->pLast;.   
13ef0 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
13f00 20 70 50 67 3b 0a 20 20 20 20 69 66 28 20 70 50   pPg;.    if( pP
13f10 67 2d 3e 70 50 72 65 76 46 72 65 65 20 29 7b 0a  g->pPrevFree ){.
13f20 20 20 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76        pPg->pPrev
13f30 46 72 65 65 2d 3e 70 4e 65 78 74 46 72 65 65 20  Free->pNextFree 
13f40 3d 20 70 50 67 3b 0a 20 20 20 20 7d 65 6c 73 65  = pPg;.    }else
13f50 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
13f60 70 46 69 72 73 74 20 3d 20 70 50 67 3b 0a 20 20  pFirst = pPg;.  
13f70 20 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d    }.    if( pPg-
13f80 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 26 26 20  >needSync==0 && 
13f90 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
13fa0 6e 63 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nced==0 ){.     
13fb0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53   pPager->pFirstS
13fc0 79 6e 63 65 64 20 3d 20 70 50 67 3b 0a 20 20 20  ynced = pPg;.   
13fd0 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
13fe0 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 20 29  r->xDestructor )
13ff0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
14000 78 44 65 73 74 72 75 63 74 6f 72 28 70 44 61 74  xDestructor(pDat
14010 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
14020 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 0a 20  ize);.    }.  . 
14030 20 20 20 2f 2a 20 57 68 65 6e 20 61 6c 6c 20 70     /* When all p
14040 61 67 65 73 20 72 65 61 63 68 20 74 68 65 20 66  ages reach the f
14050 72 65 65 6c 69 73 74 2c 20 64 72 6f 70 20 74 68  reelist, drop th
14060 65 20 72 65 61 64 20 6c 6f 63 6b 20 66 72 6f 6d  e read lock from
14070 0a 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61  .    ** the data
14080 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a  base file..    *
14090 2f 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52  /.    pPager->nR
140a0 65 66 2d 2d 3b 0a 20 20 20 20 61 73 73 65 72 74  ef--;.    assert
140b0 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3e 3d  ( pPager->nRef>=
140c0 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
140d0 67 65 72 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20  ger->nRef==0 && 
140e0 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20  !MEMDB ){.      
140f0 70 61 67 65 72 5f 72 65 73 65 74 28 70 50 61 67  pager_reset(pPag
14100 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  er);.    }.  }. 
14110 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
14120 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  K;.}../*.** Crea
14130 74 65 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  te a journal fil
14140 65 20 66 6f 72 20 70 50 61 67 65 72 2e 20 20 54  e for pPager.  T
14150 68 65 72 65 20 73 68 6f 75 6c 64 20 61 6c 72 65  here should alre
14160 61 64 79 20 62 65 20 61 20 52 45 53 45 52 56 45  ady be a RESERVE
14170 44 0a 2a 2a 20 6f 72 20 45 58 43 4c 55 53 49 56  D.** or EXCLUSIV
14180 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  E lock on the da
14190 74 61 62 61 73 65 20 66 69 6c 65 20 77 68 65 6e  tabase file when
141a0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
141b0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 0a 2a 2a 20 52   called..**.** R
141c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20  eturn SQLITE_OK 
141d0 69 66 20 65 76 65 72 79 74 68 69 6e 67 2e 20 20  if everything.  
141e0 52 65 74 75 72 6e 20 61 6e 20 65 72 72 6f 72 20  Return an error 
141f0 63 6f 64 65 20 61 6e 64 20 72 65 6c 65 61 73 65  code and release
14200 20 74 68 65 0a 2a 2a 20 77 72 69 74 65 20 6c 6f   the.** write lo
14210 63 6b 20 69 66 20 61 6e 79 74 68 69 6e 67 20 67  ck if anything g
14220 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
14230 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 6f  atic int pager_o
14240 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 50 61 67 65  pen_journal(Page
14250 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
14260 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74 28 20  t rc;.  assert( 
14270 21 4d 45 4d 44 42 20 29 3b 0a 20 20 61 73 73 65  !MEMDB );.  asse
14280 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14290 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
142a0 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  D );.  assert( p
142b0 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
142c0 65 6e 3d 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  en==0 );.  asser
142d0 74 28 20 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f  t( pPager->useJo
142e0 75 72 6e 61 6c 20 29 3b 0a 20 20 73 71 6c 69 74  urnal );.  sqlit
142f0 65 33 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e  e3pager_pagecoun
14300 74 28 70 50 61 67 65 72 29 3b 0a 20 20 70 50 61  t(pPager);.  pPa
14310 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20  ger->aInJournal 
14320 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
14330 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38  pPager->dbSize/8
14340 20 2b 20 31 20 29 3b 0a 20 20 69 66 28 20 70 50   + 1 );.  if( pP
14350 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
14360 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
14370 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
14380 20 20 67 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f    goto failed_to
14390 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20  _open_journal;. 
143a0 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
143b0 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73 69 76 65  3OsOpenExclusive
143c0 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61  (pPager->zJourna
143d0 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  l, &pPager->jfd,
143e0 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
143f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
14400 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20 70  rnalOff = 0;.  p
14410 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
14420 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
14430 6a 6f 75 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a  journalHdr = 0;.
14440 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14450 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
14460 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a  failed_to_open_j
14470 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20 73 71  ournal;.  }.  sq
14480 6c 69 74 65 33 4f 73 4f 70 65 6e 44 69 72 65 63  lite3OsOpenDirec
14490 74 6f 72 79 28 70 50 61 67 65 72 2d 3e 7a 44 69  tory(pPager->zDi
144a0 72 65 63 74 6f 72 79 2c 20 26 70 50 61 67 65 72  rectory, &pPager
144b0 2d 3e 6a 66 64 29 3b 0a 20 20 70 50 61 67 65 72  ->jfd);.  pPager
144c0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d 20  ->journalOpen = 
144d0 31 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  1;.  pPager->jou
144e0 72 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b  rnalStarted = 0;
144f0 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  .  pPager->needS
14500 79 6e 63 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  ync = 0;.  pPage
14510 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  r->alwaysRollbac
14520 6b 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  k = 0;.  pPager-
14530 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 69 66 28  >nRec = 0;.  if(
14540 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
14550 21 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  !=0 ){.    rc = 
14560 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50  pager_errcode(pP
14570 61 67 65 72 29 3b 0a 20 20 20 20 72 65 74 75 72  ager);.    retur
14580 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50 61 67  n rc;.  }.  pPag
14590 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d  er->origDbSize =
145a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
145b0 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 4a 6f  ..  rc = writeJo
145c0 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 29  urnalHdr(pPager)
145d0 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  ;..  if( pPager-
145e0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26  >stmtAutoopen &&
145f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
14600 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  {.    rc = sqlit
14610 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 62 65 67  e3pager_stmt_beg
14620 69 6e 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a  in(pPager);.  }.
14630 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14640 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
14650 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
14660 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
14670 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14680 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
14690 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
146a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
146b0 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  c;..failed_to_op
146c0 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20 20 73 71  en_journal:.  sq
146d0 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 2d  liteFree(pPager-
146e0 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20  >aInJournal);.  
146f0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
14700 61 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  al = 0;.  sqlite
14710 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
14720 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
14730 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  .  pPager->state
14740 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 3b   = PAGER_UNLOCK;
14750 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
14760 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
14770 20 77 72 69 74 65 2d 6c 6f 63 6b 20 6f 6e 20 74   write-lock on t
14780 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
14790 65 20 6c 6f 63 6b 20 69 73 20 72 65 6d 6f 76 65  e lock is remove
147a0 64 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20 61 6e  d when.** the an
147b0 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  y of the followi
147c0 6e 67 20 68 61 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a  ng happen:.**.**
147d0 20 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67     *  sqlite3pag
147e0 65 72 5f 63 6f 6d 6d 69 74 28 29 20 69 73 20 63  er_commit() is c
147f0 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73  alled..**   *  s
14800 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
14810 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
14820 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
14830 33 70 61 67 65 72 5f 63 6c 6f 73 65 28 29 20 69  3pager_close() i
14840 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a  s called..**   *
14850 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 75    sqlite3pager_u
14860 6e 72 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64  nref() is called
14870 20 74 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74   to on every out
14880 73 74 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a  standing page..*
14890 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70  *.** The first p
148a0 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73  arameter to this
148b0 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f   routine is a po
148c0 69 6e 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65  inter to any ope
148d0 6e 20 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a  n page of the.**
148e0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
148f0 20 4e 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73   Nothing changes
14900 20 61 62 6f 75 74 20 74 68 65 20 70 61 67 65 20   about the page 
14910 2d 20 69 74 20 69 73 20 75 73 65 64 20 6d 65 72  - it is used mer
14920 65 6c 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72  ely to.** acquir
14930 65 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  e a pointer to t
14940 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74 75  he Pager structu
14950 72 65 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20  re and as proof 
14960 74 68 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a  that there is.**
14970 20 61 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d   already a read-
14980 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61  lock on the data
14990 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  base..**.** The 
149a0 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72  second parameter
149b0 20 69 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d   indicates how m
149c0 75 63 68 20 73 70 61 63 65 20 69 6e 20 62 79 74  uch space in byt
149d0 65 73 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f  es to reserve fo
149e0 72 20 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f  r a.** master jo
149f0 75 72 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20  urnal file-name 
14a00 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  at the start of 
14a10 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e  the journal when
14a20 20 69 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a   it is created..
14a30 2a 2a 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20  **.** A journal 
14a40 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69  file is opened i
14a50 66 20 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20  f this is not a 
14a60 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20  temporary file. 
14a70 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a   For temporary.*
14a80 2a 20 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65  * files, the ope
14a90 6e 69 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72  ning of the jour
14aa0 6e 61 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65  nal file is defe
14ab0 72 72 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65  rred until there
14ac0 20 69 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c   is an.** actual
14ad0 20 6e 65 65 64 20 74 6f 20 77 72 69 74 65 20 74   need to write t
14ae0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a  o the journal..*
14af0 2a 0a 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61  *.** If the data
14b00 62 61 73 65 20 69 73 20 61 6c 72 65 61 64 79 20  base is already 
14b10 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 72 69  reserved for wri
14b20 74 69 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69  ting, this routi
14b30 6e 65 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a  ne is a no-op..*
14b40 2a 0a 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69  *.** If exFlag i
14b50 73 20 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64  s true, go ahead
14b60 20 61 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c   and get an EXCL
14b70 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
14b80 65 20 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69  e file.** immedi
14b90 61 74 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66  ately instead of
14ba0 20 77 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77   waiting until w
14bb0 65 20 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74  e try to flush t
14bc0 68 65 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a  he cache.  The.*
14bd0 2a 20 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f  * exFlag is igno
14be0 72 65 64 20 69 66 20 61 20 74 72 61 6e 73 61 63  red if a transac
14bf0 74 69 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20  tion is already 
14c00 61 63 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73  active..*/.int s
14c10 71 6c 69 74 65 33 70 61 67 65 72 5f 62 65 67 69  qlite3pager_begi
14c20 6e 28 76 6f 69 64 20 2a 70 44 61 74 61 2c 20 69  n(void *pData, i
14c30 6e 74 20 65 78 46 6c 61 67 29 7b 0a 20 20 50 67  nt exFlag){.  Pg
14c40 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
14c50 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
14c60 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
14c70 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a   = pPg->pPager;.
14c80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14c90 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72 74 28 20  E_OK;.  assert( 
14ca0 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20  pPg->nRef>0 );. 
14cb0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14cc0 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55 4e  >state!=PAGER_UN
14cd0 4c 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50  LOCK );.  if( pP
14ce0 61 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47  ager->state==PAG
14cf0 45 52 5f 53 48 41 52 45 44 20 29 7b 0a 20 20 20  ER_SHARED ){.   
14d00 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
14d10 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
14d20 3b 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20  ;.    if( MEMDB 
14d30 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
14d40 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
14d50 58 43 4c 55 53 49 56 45 3b 0a 20 20 20 20 20 20  XCLUSIVE;.      
14d60 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
14d70 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53  ze = pPager->dbS
14d80 69 7a 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ize;.    }else{.
14d90 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
14da0 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14db0 4f 43 4b 20 7c 7c 20 65 78 46 6c 61 67 20 29 7b  OCK || exFlag ){
14dc0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61  .        rc = pa
14dd0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14de0 28 70 50 61 67 65 72 2c 20 52 45 53 45 52 56 45  (pPager, RESERVE
14df0 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
14e00 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
14e10 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
14e20 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45  (&pPager->fd, RE
14e30 53 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20  SERVED_LOCK);.  
14e40 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
14e50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
14e60 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
14e70 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 52  >state = PAGER_R
14e80 45 53 45 52 56 45 44 3b 0a 20 20 20 20 20 20 20  ESERVED;.       
14e90 20 69 66 28 20 65 78 46 6c 61 67 20 29 7b 0a 20   if( exFlag ){. 
14ea0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61           rc = pa
14eb0 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b  ger_wait_on_lock
14ec0 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55 53 49  (pPager, EXCLUSI
14ed0 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20  VE_LOCK);.      
14ee0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14ef0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
14f00 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
14f10 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
14f20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  }.      pPager->
14f30 64 69 72 74 79 43 61 63 68 65 20 3d 20 30 3b 0a  dirtyCache = 0;.
14f40 20 20 20 20 20 20 54 52 41 43 45 32 28 22 54 52        TRACE2("TR
14f50 41 4e 53 41 43 54 49 4f 4e 20 25 64 5c 6e 22 2c  ANSACTION %d\n",
14f60 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
14f70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  );.      if( pPa
14f80 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
14f90 26 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70  && !pPager->temp
14fa0 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 20 20  File ){.        
14fb0 72 63 20 3d 20 70 61 67 65 72 5f 6f 70 65 6e 5f  rc = pager_open_
14fc0 6a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 29 3b  journal(pPager);
14fd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14fe0 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a   }.  return rc;.
14ff0 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20 61 20  }../*.** Mark a 
15000 64 61 74 61 20 70 61 67 65 20 61 73 20 77 72 69  data page as wri
15010 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70 61 67  teable.  The pag
15020 65 20 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74  e is written int
15030 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 0a 2a  o the journal .*
15040 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74  * if it is not t
15050 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20 20 54  here already.  T
15060 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75 73 74  his routine must
15070 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66 6f 72   be called befor
15080 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68 61 6e  e making.** chan
15090 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e 0a 2a  ges to a page..*
150a0 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 74  *.** The first t
150b0 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ime this routine
150c0 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
150d0 70 61 67 65 72 20 63 72 65 61 74 65 73 20 61 20  pager creates a 
150e0 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 61  new.** journal a
150f0 6e 64 20 61 63 71 75 69 72 65 73 20 61 20 52 45  nd acquires a RE
15100 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74  SERVED lock on t
15110 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 49 66  he database.  If
15120 20 74 68 65 20 52 45 53 45 52 56 45 44 0a 2a 2a   the RESERVED.**
15130 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f 74 20   lock could not 
15140 62 65 20 61 63 71 75 69 72 65 64 2c 20 74 68 69  be acquired, thi
15150 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
15160 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 20 20  s SQLITE_BUSY.  
15170 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67 20 72  The.** calling r
15180 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68 65 63  outine must chec
15190 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74 75 72  k for that retur
151a0 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65 20 63  n value and be c
151b0 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a 2a 2a  areful not to.**
151c0 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61 67 65   change any page
151d0 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68 69 73   data until this
151e0 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 73   routine returns
151f0 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a   SQLITE_OK..**.*
15200 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * If the journal
15210 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f 74 20   file could not 
15220 62 65 20 77 72 69 74 74 65 6e 20 62 65 63 61 75  be written becau
15230 73 65 20 74 68 65 20 64 69 73 6b 20 69 73 20 66  se the disk is f
15240 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74 68 69  ull,.** then thi
15250 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
15260 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20 61 6e  s SQLITE_FULL an
15270 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65 64 69  d does an immedi
15280 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a  ate rollback..**
15290 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e 74 20   All subsequent 
152a0 77 72 69 74 65 20 61 74 74 65 6d 70 74 73 20 61  write attempts a
152b0 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c 49 54  lso return SQLIT
152c0 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74 68 65  E_FULL until the
152d0 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c 6c 20  re.** is a call 
152e0 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
152f0 63 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c 69  commit() or sqli
15300 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
15310 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
15320 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
15330 61 67 65 72 5f 77 72 69 74 65 28 76 6f 69 64 20  ager_write(void 
15340 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72  *pData){.  PgHdr
15350 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f   *pPg = DATA_TO_
15360 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20  PGHDR(pData);.  
15370 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
15380 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69  pPg->pPager;.  i
15390 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
153a0 4b 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66  K;..  /* Check f
153b0 6f 72 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20  or errors.  */. 
153c0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
153d0 4d 61 73 6b 20 29 7b 20 0a 20 20 20 20 72 65 74  Mask ){ .    ret
153e0 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63 6f 64  urn pager_errcod
153f0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20  e(pPager);.  }. 
15400 20 69 66 28 20 70 50 61 67 65 72 2d 3e 72 65 61   if( pPager->rea
15410 64 4f 6e 6c 79 20 29 7b 0a 20 20 20 20 72 65 74  dOnly ){.    ret
15420 75 72 6e 20 53 51 4c 49 54 45 5f 50 45 52 4d 3b  urn SQLITE_PERM;
15430 0a 20 20 7d 0a 0a 20 20 61 73 73 65 72 74 28 20  .  }..  assert( 
15440 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
15450 65 72 20 29 3b 0a 0a 20 20 2f 2a 20 4d 61 72 6b  er );..  /* Mark
15460 20 74 68 65 20 70 61 67 65 20 61 73 20 64 69 72   the page as dir
15470 74 79 2e 20 20 49 66 20 74 68 65 20 70 61 67 65  ty.  If the page
15480 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
15490 6e 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20 74  n written.  ** t
154a0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 68  o the journal th
154b0 65 6e 20 77 65 20 63 61 6e 20 72 65 74 75 72 6e  en we can return
154c0 20 72 69 67 68 74 20 61 77 61 79 2e 0a 20 20 2a   right away..  *
154d0 2f 0a 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d  /.  pPg->dirty =
154e0 20 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 69   1;.  if( pPg->i
154f0 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70 50 67  nJournal && (pPg
15500 2d 3e 69 6e 53 74 6d 74 20 7c 7c 20 70 50 61 67  ->inStmt || pPag
15510 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 3d 3d 30  er->stmtInUse==0
15520 29 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  ) ){.    pPager-
15530 3e 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b  >dirtyCache = 1;
15540 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20 20 20 20 2f  .  }else{..    /
15550 2a 20 49 66 20 77 65 20 67 65 74 20 74 68 69 73  * If we get this
15560 20 66 61 72 2c 20 69 74 20 6d 65 61 6e 73 20 74   far, it means t
15570 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 65 65  hat the page nee
15580 64 73 20 74 6f 20 62 65 0a 20 20 20 20 2a 2a 20  ds to be.    ** 
15590 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 74  written to the t
155a0 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e  ransaction journ
155b0 61 6c 20 6f 72 20 74 68 65 20 63 6b 65 63 6b 70  al or the ckeckp
155c0 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c 0a 20 20 20  oint journal.   
155d0 20 2a 2a 20 6f 72 20 62 6f 74 68 2e 0a 20 20 20   ** or both..   
155e0 20 2a 2a 0a 20 20 20 20 2a 2a 20 46 69 72 73 74   **.    ** First
155f0 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 74 68   check to see th
15600 61 74 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  at the transacti
15610 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65 78 69 73 74  on journal exist
15620 73 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 72 65  s and.    ** cre
15630 61 74 65 20 69 74 20 69 66 20 69 74 20 64 6f 65  ate it if it doe
15640 73 20 6e 6f 74 2e 0a 20 20 20 20 2a 2f 0a 20 20  s not..    */.  
15650 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
15660 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
15670 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20 20 72 63 20  NLOCK );.    rc 
15680 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 62  = sqlite3pager_b
15690 65 67 69 6e 28 70 44 61 74 61 2c 20 30 29 3b 0a  egin(pData, 0);.
156a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
156b0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
156c0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
156d0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
156e0 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
156f0 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20 20  _RESERVED );.   
15700 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a 6f   if( !pPager->jo
15710 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50 61  urnalOpen && pPa
15720 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
15730 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61  ){.      rc = pa
15740 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c  ger_open_journal
15750 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
15760 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
15770 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
15780 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
15790 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
157a0 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d  Open || !pPager-
157b0 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  >useJournal );. 
157c0 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
157d0 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20 20  Cache = 1;.  .  
157e0 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61 63    /* The transac
157f0 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f 77  tion journal now
15800 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20 68   exists and we h
15810 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20 6f  ave a RESERVED o
15820 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43 4c  r an.    ** EXCL
15830 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68  USIVE lock on th
15840 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
15850 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68 65  file.  Write the
15860 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74 6f   current page to
15870 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61 6e  .    ** the tran
15880 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20  saction journal 
15890 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68 65  if it is not the
158a0 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20 20  re already..    
158b0 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67 2d  */.    if( !pPg-
158c0 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 70  >inJournal && (p
158d0 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61  Pager->useJourna
158e0 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a 20  l || MEMDB) ){. 
158f0 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70 50       if( (int)pP
15900 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65  g->pgno <= pPage
15910 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
15920 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 50  .        int szP
15930 67 3b 0a 20 20 20 20 20 20 20 20 75 33 32 20 73  g;.        u32 s
15940 61 76 65 64 3b 0a 20 20 20 20 20 20 20 20 69 66  aved;.        if
15950 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
15960 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
15970 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
15980 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
15990 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52  r);.          TR
159a0 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c 20 25 64  ACE3("JOURNAL %d
159b0 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47   page %d\n", PAG
159c0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
159d0 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g->pgno);.      
159e0 20 20 20 20 61 73 73 65 72 74 28 20 70 48 69 73      assert( pHis
159f0 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29 3b 0a 20  t->pOrig==0 );. 
15a00 20 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e           pHist->
15a10 70 4f 72 69 67 20 3d 20 73 71 6c 69 74 65 4d 61  pOrig = sqliteMa
15a20 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72 2d  llocRaw( pPager-
15a30 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20 20  >pageSize );.   
15a40 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74         if( pHist
15a50 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
15a60 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 48         memcpy(pH
15a70 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50 47 48 44  ist->pOrig, PGHD
15a80 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20  R_TO_DATA(pPg), 
15a90 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
15aa0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
15ab0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
15ac0 20 20 20 20 20 20 20 20 75 33 32 20 63 6b 73 75          u32 cksu
15ad0 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44  m;.          COD
15ae0 45 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61  EC(pPager, pData
15af0 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 37 29 3b  , pPg->pgno, 7);
15b00 0a 20 20 20 20 20 20 20 20 20 20 63 6b 73 75 6d  .          cksum
15b10 20 3d 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 70   = pager_cksum(p
15b20 50 61 67 65 72 2c 20 70 50 67 2d 3e 70 67 6e 6f  Pager, pPg->pgno
15b30 2c 20 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  , pData);.      
15b40 20 20 20 20 73 61 76 65 64 20 3d 20 2a 28 75 33      saved = *(u3
15b50 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58 54 52  2*)PGHDR_TO_EXTR
15b60 41 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  A(pPg, pPager);.
15b70 20 20 20 20 20 20 20 20 20 20 73 74 6f 72 65 33            store3
15b80 32 62 69 74 73 28 63 6b 73 75 6d 2c 20 70 50 67  2bits(cksum, pPg
15b90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
15ba0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ze);.          s
15bb0 7a 50 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 61  zPg = pPager->pa
15bc0 67 65 53 69 7a 65 2b 38 3b 0a 20 20 20 20 20 20  geSize+8;.      
15bd0 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73 28      store32bits(
15be0 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2c 20  pPg->pgno, pPg, 
15bf0 2d 34 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  -4);.          r
15c00 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
15c10 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  te(&pPager->jfd,
15c20 20 26 28 28 63 68 61 72 2a 29 70 44 61 74 61 29   &((char*)pData)
15c30 5b 2d 34 5d 2c 20 73 7a 50 67 29 3b 0a 20 20 20  [-4], szPg);.   
15c40 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a         pPager->j
15c50 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 73 7a 50  ournalOff += szP
15c60 67 3b 0a 20 20 20 20 20 20 20 20 20 20 54 52 41  g;.          TRA
15c70 43 45 34 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20  CE4("JOURNAL %d 
15c80 70 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63  page %d needSync
15c90 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  =%d\n",.        
15ca0 20 20 20 20 20 20 20 20 20 20 50 41 47 45 52 49            PAGERI
15cb0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
15cc0 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53  pgno, pPg->needS
15cd0 79 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ync);.          
15ce0 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70 44  CODEC(pPager, pD
15cf0 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  ata, pPg->pgno, 
15d00 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2a 28  0);.          *(
15d10 75 33 32 2a 29 50 47 48 44 52 5f 54 4f 5f 45 58  u32*)PGHDR_TO_EX
15d20 54 52 41 28 70 50 67 2c 20 70 50 61 67 65 72 29  TRA(pPg, pPager)
15d30 20 3d 20 73 61 76 65 64 3b 0a 20 20 20 20 20 20   = saved;.      
15d40 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
15d50 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
15d60 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65       sqlite3page
15d70 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65  r_rollback(pPage
15d80 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  r);.            
15d90 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
15da0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
15db0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  L;.            r
15dc0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
15dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
15de0 70 50 61 67 65 72 2d 3e 6e 52 65 63 2b 2b 3b 0a  pPager->nRec++;.
15df0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
15e00 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75  ( pPager->aInJou
15e10 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  rnal!=0 );.     
15e20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e       pPager->aIn
15e30 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e  Journal[pPg->pgn
15e40 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d  o/8] |= 1<<(pPg-
15e50 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20  >pgno&7);.      
15e60 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
15e70 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53  c = !pPager->noS
15e80 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ync;.          i
15e90 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
15ea0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nUse ){.        
15eb0 20 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53      pPager->aInS
15ec0 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  tmt[pPg->pgno/8]
15ed0 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
15ee0 6f 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20  o&7);.          
15ef0 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73 74    page_add_to_st
15f00 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20  mt_list(pPg);.  
15f10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15f20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
15f30 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e 65  .        pPg->ne
15f40 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65 72  edSync = !pPager
15f50 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64  ->journalStarted
15f60 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f 53   && !pPager->noS
15f70 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 54 52 41  ync;.        TRA
15f80 43 45 34 28 22 41 50 50 45 4e 44 20 25 64 20 70  CE4("APPEND %d p
15f90 61 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d  age %d needSync=
15fa0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
15fb0 20 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70         PAGERID(p
15fc0 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
15fd0 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  o, pPg->needSync
15fe0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15ff0 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79   if( pPg->needSy
16000 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50  nc ){.        pP
16010 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
16020 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
16030 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
16040 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20   = 1;.    }.  . 
16050 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 74 61     /* If the sta
16060 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
16070 73 20 6f 70 65 6e 20 61 6e 64 20 74 68 65 20 70  s open and the p
16080 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 69 74  age is not in it
16090 2c 0a 20 20 20 20 2a 2a 20 74 68 65 6e 20 77 72  ,.    ** then wr
160a0 69 74 65 20 74 68 65 20 63 75 72 72 65 6e 74 20  ite the current 
160b0 70 61 67 65 20 74 6f 20 74 68 65 20 73 74 61 74  page to the stat
160c0 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 20 20  ement journal.  
160d0 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20 2a 2a  Note that.    **
160e0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a   the statement j
160f0 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20 64 69  ournal format di
16100 66 66 65 72 73 20 66 72 6f 6d 20 74 68 65 20 73  ffers from the s
16110 74 61 6e 64 61 72 64 20 6a 6f 75 72 6e 61 6c 20  tandard journal 
16120 66 6f 72 6d 61 74 0a 20 20 20 20 2a 2a 20 69 6e  format.    ** in
16130 20 74 68 61 74 20 69 74 20 6f 6d 69 74 73 20 74   that it omits t
16140 68 65 20 63 68 65 63 6b 73 75 6d 73 20 61 6e 64  he checksums and
16150 20 74 68 65 20 68 65 61 64 65 72 2e 0a 20 20 20   the header..   
16160 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
16170 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26  er->stmtInUse &&
16180 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26   !pPg->inStmt &&
16190 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c   (int)pPg->pgno<
161a0 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a  =pPager->stmtSiz
161b0 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  e ){.      asser
161c0 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
161d0 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
161e0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
161f0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
16200 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
16210 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
16220 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
16230 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
16240 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
16250 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
16260 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
16270 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
16280 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
16290 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
162a0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
162b0 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
162c0 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
162d0 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
162e0 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
162f0 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
16300 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
16310 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 53         TRACE3("S
16320 54 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70  TMT-JOURNAL %d p
16330 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  age %d\n", PAGER
16340 49 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d  ID(pPager), pPg-
16350 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 7d 65  >pgno);.      }e
16360 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 6f  lse{.        sto
16370 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e 70 67  re32bits(pPg->pg
16380 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a 20 20  no, pPg, -4);.  
16390 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
163a0 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
163b0 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20  pgno, 7);.      
163c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
163d0 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e 73  Write(&pPager->s
163e0 74 66 64 2c 28 28 63 68 61 72 2a 29 70 44 61 74  tfd,((char*)pDat
163f0 61 29 2d 34 2c 20 70 50 61 67 65 72 2d 3e 70 61  a)-4, pPager->pa
16400 67 65 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20  geSize+4);.     
16410 20 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d     TRACE3("STMT-
16420 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
16430 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
16440 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e  Pager), pPg->pgn
16450 6f 29 3b 0a 20 20 20 20 20 20 20 20 43 4f 44 45  o);.        CODE
16460 43 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c  C(pPager, pData,
16470 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a   pPg->pgno, 0);.
16480 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d          if( rc!=
16490 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
164a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61         sqlite3pa
164b0 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61  ger_rollback(pPa
164c0 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ger);.          
164d0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
164e0 7c 3d 20 50 41 47 45 52 5f 45 52 52 5f 46 55 4c  |= PAGER_ERR_FUL
164f0 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  L;.          ret
16500 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20 20  urn rc;.        
16510 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72  }.        pPager
16520 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20 20  ->stmtNRec++;.  
16530 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
16540 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d 30  ager->aInStmt!=0
16550 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 67   );.        pPag
16560 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d  er->aInStmt[pPg-
16570 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
16580 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
16590 20 20 20 20 7d 0a 20 20 20 20 20 20 70 61 67 65      }.      page
165a0 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73  _add_to_stmt_lis
165b0 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20  t(pPg);.    }.  
165c0 7d 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74  }..  /* Update t
165d0 68 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65  he database size
165e0 20 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a   and return..  *
165f0 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  /.  if( pPager->
16600 64 62 53 69 7a 65 3c 28 69 6e 74 29 70 50 67 2d  dbSize<(int)pPg-
16610 3e 70 67 6e 6f 20 29 7b 0a 20 20 20 20 70 50 61  >pgno ){.    pPa
16620 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50  ger->dbSize = pP
16630 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20 69 66 28  g->pgno;.    if(
16640 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65   !MEMDB && pPage
16650 72 2d 3e 64 62 53 69 7a 65 3d 3d 50 45 4e 44 49  r->dbSize==PENDI
16660 4e 47 5f 42 59 54 45 2f 70 50 61 67 65 72 2d 3e  NG_BYTE/pPager->
16670 70 61 67 65 53 69 7a 65 20 29 7b 0a 20 20 20 20  pageSize ){.    
16680 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
16690 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
166a0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
166b0 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
166c0 69 66 20 74 68 65 20 70 61 67 65 20 67 69 76 65  if the page give
166d0 6e 20 69 6e 20 74 68 65 20 61 72 67 75 6d 65 6e  n in the argumen
166e0 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
166f0 20 70 61 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71   passed.** to sq
16700 6c 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65  lite3pager_write
16710 28 29 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f  ().  In other wo
16720 72 64 73 2c 20 72 65 74 75 72 6e 20 54 52 55 45  rds, return TRUE
16730 20 69 66 20 69 74 20 69 73 20 6f 6b 0a 2a 2a 20   if it is ok.** 
16740 74 6f 20 63 68 61 6e 67 65 20 74 68 65 20 63 6f  to change the co
16750 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67  ntent of the pag
16760 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
16770 33 70 61 67 65 72 5f 69 73 77 72 69 74 65 61 62  3pager_iswriteab
16780 6c 65 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b  le(void *pData){
16790 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20  .  PgHdr *pPg = 
167a0 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44  DATA_TO_PGHDR(pD
167b0 61 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  ata);.  return p
167c0 50 67 2d 3e 64 69 72 74 79 3b 0a 7d 0a 0a 2f 2a  Pg->dirty;.}../*
167d0 0a 2a 2a 20 52 65 70 6c 61 63 65 20 74 68 65 20  .** Replace the 
167e0 63 6f 6e 74 65 6e 74 20 6f 66 20 61 20 73 69 6e  content of a sin
167f0 67 6c 65 20 70 61 67 65 20 77 69 74 68 20 74 68  gle page with th
16800 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  e information in
16810 20 74 68 65 20 74 68 69 72 64 0a 2a 2a 20 61 72   the third.** ar
16820 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73  gument..*/.int s
16830 71 6c 69 74 65 33 70 61 67 65 72 5f 6f 76 65 72  qlite3pager_over
16840 77 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61  write(Pager *pPa
16850 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20  ger, Pgno pgno, 
16860 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20  void *pData){.  
16870 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 69  void *pPage;.  i
16880 6e 74 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73  nt rc;..  rc = s
16890 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
168a0 70 50 61 67 65 72 2c 20 70 67 6e 6f 2c 20 26 70  pPager, pgno, &p
168b0 50 61 67 65 29 3b 0a 20 20 69 66 28 20 72 63 3d  Page);.  if( rc=
168c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
168d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61    rc = sqlite3pa
168e0 67 65 72 5f 77 72 69 74 65 28 70 50 61 67 65 29  ger_write(pPage)
168f0 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
16900 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
16910 20 6d 65 6d 63 70 79 28 70 50 61 67 65 2c 20 70   memcpy(pPage, p
16920 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61  Data, pPager->pa
16930 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20  geSize);.    }. 
16940 20 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f     sqlite3pager_
16950 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a 20 20  unref(pPage);.  
16960 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
16970 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74  ../*.** A call t
16980 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  o this routine t
16990 65 6c 6c 73 20 74 68 65 20 70 61 67 65 72 20 74  ells the pager t
169a0 68 61 74 20 69 74 20 69 73 20 6e 6f 74 20 6e 65  hat it is not ne
169b0 63 65 73 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72  cessary to.** wr
169c0 69 74 65 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ite the informat
169d0 69 6f 6e 20 6f 6e 20 70 61 67 65 20 22 70 67 6e  ion on page "pgn
169e0 6f 22 20 62 61 63 6b 20 74 6f 20 74 68 65 20 64  o" back to the d
169f0 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f 75 67 68  isk, even though
16a00 0a 2a 2a 20 74 68 61 74 20 70 61 67 65 20 6d 69  .** that page mi
16a10 67 68 74 20 62 65 20 6d 61 72 6b 65 64 20 61 73  ght be marked as
16a20 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68   dirty..**.** Th
16a30 65 20 6f 76 65 72 6c 79 69 6e 67 20 73 6f 66 74  e overlying soft
16a40 77 61 72 65 20 6c 61 79 65 72 20 63 61 6c 6c 73  ware layer calls
16a50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 77 68   this routine wh
16a60 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65 20 64 61  en all of the da
16a70 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76  ta.** on the giv
16a80 65 6e 20 70 61 67 65 20 69 73 20 75 6e 75 73 65  en page is unuse
16a90 64 2e 20 20 54 68 65 20 70 61 67 65 72 20 6d 61  d.  The pager ma
16aa0 72 6b 73 20 74 68 65 20 70 61 67 65 20 61 73 20  rks the page as 
16ab0 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74  clean so.** that
16ac0 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 67 65 74   it does not get
16ad0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 69 73 6b   written to disk
16ae0 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68  ..**.** Tests sh
16af0 6f 77 20 74 68 61 74 20 74 68 69 73 20 6f 70 74  ow that this opt
16b00 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74  imization, toget
16b10 68 65 72 20 77 69 74 68 20 74 68 65 0a 2a 2a 20  her with the.** 
16b20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 64 6f 6e  sqlite3pager_don
16b30 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c  t_rollback() bel
16b40 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f  ow, more than do
16b50 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a 2a  uble the speed.*
16b60 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45 52  * of large INSER
16b70 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e 64  T operations and
16b80 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20 73   quadruple the s
16b90 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44 45  peed of large DE
16ba0 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65  LETEs..**.** Whe
16bb0 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  n this routine i
16bc0 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74 68  s called, set th
16bd0 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  e alwaysRollback
16be0 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a   flag to true..*
16bf0 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61 6c  * Subsequent cal
16c00 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ls to sqlite3pag
16c10 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
16c20 28 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20  () for the same 
16c30 70 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65  page.** will the
16c40 72 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72  reafter be ignor
16c50 65 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63  ed.  This is nec
16c60 65 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20  essary to avoid 
16c70 61 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65  a problem.** whe
16c80 72 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64  re a page with d
16c90 61 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20  ata is added to 
16ca0 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
16cb0 69 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a  ing one part of.
16cc0 2a 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** a transaction
16cd0 20 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72   then removed fr
16ce0 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20  om the freelist 
16cf0 64 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70  during a later p
16d00 61 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61  art.** of the sa
16d10 6d 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61  me transaction a
16d20 6e 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f  nd reused for so
16d30 6d 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65  me other purpose
16d40 2e 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73  .  When it.** is
16d50 20 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20   first added to 
16d60 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68  the freelist, th
16d70 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
16d80 6c 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73  lled.  When reus
16d90 65 64 2c 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f  ed,.** the dont_
16da0 72 6f 6c 6c 62 61 63 6b 28 29 20 72 6f 75 74 69  rollback() routi
16db0 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e 20 20 42  ne is called.  B
16dc0 75 74 20 62 65 63 61 75 73 65 20 74 68 65 20 70  ut because the p
16dd0 61 67 65 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20  age contains.** 
16de0 63 72 69 74 69 63 61 6c 20 64 61 74 61 2c 20 77  critical data, w
16df0 65 20 73 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20  e still need to 
16e00 62 65 20 73 75 72 65 20 69 74 20 67 65 74 73 20  be sure it gets 
16e10 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73  rolled back in s
16e20 70 69 74 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64  pite.** of the d
16e30 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63  ont_rollback() c
16e40 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  all..*/.void sql
16e50 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77  ite3pager_dont_w
16e60 72 69 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  rite(Pager *pPag
16e70 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a  er, Pgno pgno){.
16e80 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20    PgHdr *pPg;.. 
16e90 20 69 66 28 20 4d 45 4d 44 42 20 29 20 72 65 74   if( MEMDB ) ret
16ea0 75 72 6e 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  urn;..  pPg = pa
16eb0 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
16ec0 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d  r, pgno);.  pPg-
16ed0 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20  >alwaysRollback 
16ee0 3d 20 31 3b 0a 20 20 69 66 28 20 70 50 67 20 26  = 1;.  if( pPg &
16ef0 26 20 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a  & pPg->dirty ){.
16f00 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
16f10 64 62 53 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67  dbSize==(int)pPg
16f20 2d 3e 70 67 6e 6f 20 26 26 20 70 50 61 67 65 72  ->pgno && pPager
16f30 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3c 70 50 61  ->origDbSize<pPa
16f40 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
16f50 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20       /* If this 
16f60 70 61 67 65 73 20 69 73 20 74 68 65 20 6c 61 73  pages is the las
16f70 74 20 70 61 67 65 20 69 6e 20 74 68 65 20 66 69  t page in the fi
16f80 6c 65 20 61 6e 64 20 74 68 65 20 66 69 6c 65 20  le and the file 
16f90 68 61 73 20 67 72 6f 77 6e 0a 20 20 20 20 20 20  has grown.      
16fa0 2a 2a 20 64 75 72 69 6e 67 20 74 68 65 20 63 75  ** during the cu
16fb0 72 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f  rrent transactio
16fc0 6e 2c 20 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d  n, then do NOT m
16fd0 61 72 6b 20 74 68 65 20 70 61 67 65 20 61 73 20  ark the page as 
16fe0 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20  clean..      ** 
16ff0 57 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  When the databas
17000 65 20 66 69 6c 65 20 67 72 6f 77 73 2c 20 77 65  e file grows, we
17010 20 6d 75 73 74 20 6d 61 6b 65 20 73 75 72 65 20   must make sure 
17020 74 68 61 74 20 74 68 65 20 6c 61 73 74 20 70 61  that the last pa
17030 67 65 0a 20 20 20 20 20 20 2a 2a 20 67 65 74 73  ge.      ** gets
17040 20 77 72 69 74 74 65 6e 20 61 74 20 6c 65 61 73   written at leas
17050 74 20 6f 6e 63 65 20 73 6f 20 74 68 61 74 20 74  t once so that t
17060 68 65 20 64 69 73 6b 20 66 69 6c 65 20 77 69 6c  he disk file wil
17070 6c 20 62 65 20 74 68 65 20 63 6f 72 72 65 63 74  l be the correct
17080 0a 20 20 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20  .      ** size. 
17090 49 66 20 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72  If you do not wr
170a0 69 74 65 20 74 68 69 73 20 70 61 67 65 20 61 6e  ite this page an
170b0 64 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  d the size of th
170c0 65 20 66 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20  e file.      ** 
170d0 6f 6e 20 74 68 65 20 64 69 73 6b 20 65 6e 64 73  on the disk ends
170e0 20 75 70 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d   up being too sm
170f0 61 6c 6c 2c 20 74 68 61 74 20 63 61 6e 20 6c 65  all, that can le
17100 61 64 20 74 6f 20 64 61 74 61 62 61 73 65 0a 20  ad to database. 
17110 20 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 69       ** corrupti
17120 6f 6e 20 64 75 72 69 6e 67 20 74 68 65 20 6e 65  on during the ne
17130 78 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  xt transaction..
17140 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c        */.    }el
17150 73 65 7b 0a 20 20 20 20 20 20 54 52 41 43 45 33  se{.      TRACE3
17160 28 22 44 4f 4e 54 5f 57 52 49 54 45 20 70 61 67  ("DONT_WRITE pag
17170 65 20 25 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70  e %d of %d\n", p
17180 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61  gno, PAGERID(pPa
17190 67 65 72 29 29 3b 0a 20 20 20 20 20 20 70 50 67  ger));.      pPg
171a0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
171b0 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
171c0 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72  A call to this r
171d0 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65  outine tells the
171e0 20 70 61 67 65 72 20 74 68 61 74 20 69 66 20 61   pager that if a
171f0 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73   rollback occurs
17200 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e  ,.** it is not n
17210 65 63 65 73 73 61 72 79 20 74 6f 20 72 65 73 74  ecessary to rest
17220 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f 6e 20  ore the data on 
17230 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 2e 20  the given page. 
17240 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74   This.** means t
17250 68 61 74 20 74 68 65 20 70 61 67 65 72 20 64 6f  hat the pager do
17260 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f 20 72  es not have to r
17270 65 63 6f 72 64 20 74 68 65 20 67 69 76 65 6e 20  ecord the given 
17280 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72  page in the.** r
17290 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
172a0 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
172b0 70 61 67 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62  pager_dont_rollb
172c0 61 63 6b 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ack(void *pData)
172d0 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 20 3d  {.  PgHdr *pPg =
172e0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
172f0 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72 20 2a  Data);.  Pager *
17300 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
17310 61 67 65 72 3b 0a 0a 20 20 69 66 28 20 70 50 61  ager;..  if( pPa
17320 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45  ger->state!=PAGE
17330 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
17340 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
17350 65 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  en==0 ) return;.
17360 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79    if( pPg->alway
17370 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61  sRollback || pPa
17380 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
17390 61 63 6b 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72  ack || MEMDB ) r
173a0 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 21 70 50  eturn;.  if( !pP
173b0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  g->inJournal && 
173c0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c  (int)pPg->pgno <
173d0 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  = pPager->origDb
173e0 53 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65  Size ){.    asse
173f0 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
17400 6f 75 72 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20  ournal!=0 );.   
17410 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17420 6e 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d  nal[pPg->pgno/8]
17430 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e   |= 1<<(pPg->pgn
17440 6f 26 37 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69  o&7);.    pPg->i
17450 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20  nJournal = 1;.  
17460 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17470 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20  mtInUse ){.     
17480 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
17490 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
174a0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
174b0 29 3b 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64  );.      page_ad
174c0 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70  d_to_stmt_list(p
174d0 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54  Pg);.    }.    T
174e0 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c  RACE3("DONT_ROLL
174f0 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f 66 20  BACK page %d of 
17500 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f  %d\n", pPg->pgno
17510 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
17520 29 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50  ));.  }.  if( pP
17530 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
17540 26 26 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20  && !pPg->inStmt 
17550 26 26 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e  && (int)pPg->pgn
17560 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d 74 53  o<=pPager->stmtS
17570 69 7a 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ize ){.    asser
17580 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
17590 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
175a0 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
175b0 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 61 73  DbSize );.    as
175c0 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49  sert( pPager->aI
175d0 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20  nStmt!=0 );.    
175e0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
175f0 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
17600 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
17610 3b 0a 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74  ;.    page_add_t
17620 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
17630 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
17640 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
17650 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
17660 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
17670 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
17680 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46  Hist){.  sqliteF
17690 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
176a0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
176b0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
176c0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
176d0 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d  0;.  pHist->pStm
176e0 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t = 0;.}../*.** 
176f0 43 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67  Commit all chang
17700 65 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  es to the databa
17710 73 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74  se and release t
17720 68 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a  he write lock..*
17730 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d  *.** If the comm
17740 69 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79  it fails for any
17750 20 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62   reason, a rollb
17760 61 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d  ack attempt is m
17770 61 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72  ade.** and an er
17780 72 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75  ror code is retu
17790 72 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f  rned.  If the co
177a0 6d 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c  mmit worked, SQL
177b0 49 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74  ITE_OK.** is ret
177c0 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
177d0 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
177e0 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
177f0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67  {.  int rc;.  Pg
17800 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28  Hdr *pPg;..  if(
17810 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
17820 3d 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c  ==PAGER_ERR_FULL
17830 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
17840 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61  ite3pager_rollba
17850 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  ck(pPager);.    
17860 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17870 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
17880 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20  SQLITE_FULL;.   
17890 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63   }.    return rc
178a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67  ;.  }.  if( pPag
178b0 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
178c0 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
178d0 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
178e0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
178f0 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
17900 72 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52  r->state<PAGER_R
17910 45 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72  ESERVED ){.    r
17920 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
17930 4f 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32  OR;.  }.  TRACE2
17940 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20  ("COMMIT %d\n", 
17950 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
17960 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b  ;.  if( MEMDB ){
17970 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72  .    pPg = pager
17980 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70  _get_all_dirty_p
17990 61 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20  ages(pPager);.  
179a0 20 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a    while( pPg ){.
179b0 20 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f        clearHisto
179c0 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
179d0 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
179e0 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
179f0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
17a00 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
17a10 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
17a20 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
17a30 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
17a40 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
17a50 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50  ;.      pPg = pP
17a60 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d  g->pDirty;.    }
17a70 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
17a80 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
17a90 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70  er->pAll; pPg; p
17aa0 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c  Pg=pPg->pNextAll
17ab0 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
17ac0 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
17ad0 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
17ae0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73  Pager);.      as
17af0 73 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61  sert( !pPg->alwa
17b00 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
17b10 20 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69      assert( !pHi
17b20 73 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20  st->pOrig );.   
17b30 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
17b40 74 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20  t->pStmt );.    
17b50 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61  }.#endif.    pPa
17b60 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
17b70 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
17b80 65 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44  e = PAGER_SHARED
17b90 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c  ;.    return SQL
17ba0 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66  ITE_OK;.  }.  if
17bb0 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43  ( pPager->dirtyC
17bc0 61 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  ache==0 ){.    /
17bd0 2a 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69  * Exit early (wi
17be0 74 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20  thout doing the 
17bf0 74 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73  time-consuming s
17c00 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63  qlite3OsSync() c
17c10 61 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20  alls).    ** if 
17c20 74 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20  there have been 
17c30 6e 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  no changes to th
17c40 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17c50 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
17c60 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63  pPager->needSync
17c70 3d 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ==0 );.    rc = 
17c80 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
17c90 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  k(pPager);.    p
17ca0 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
17cb0 2d 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72  -1;.    return r
17cc0 63 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  c;.  }.  assert(
17cd0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
17ce0 4f 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73  Open );.  rc = s
17cf0 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63  qlite3pager_sync
17d00 28 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a  (pPager, 0, 0);.
17d10 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
17d20 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20  _OK ){.    goto 
17d30 63 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20  commit_abort;.  
17d40 7d 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75  }.  rc = pager_u
17d50 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65  nwritelock(pPage
17d60 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62  r);.  pPager->db
17d70 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
17d80 75 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75  urn rc;..  /* Ju
17d90 6d 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68  mp here if anyth
17da0 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64  ing goes wrong d
17db0 75 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74  uring the commit
17dc0 20 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63   process..  */.c
17dd0 6f 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73  ommit_abort:.  s
17de0 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c  qlite3pager_roll
17df0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
17e00 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
17e10 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c  .** Rollback all
17e20 20 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64   changes.  The d
17e30 61 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61  atabase falls ba
17e40 63 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52  ck to PAGER_SHAR
17e50 45 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20  ED mode..** All 
17e60 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
17e70 70 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20  pages revert to 
17e80 74 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64  their original d
17e90 61 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a  ata contents..**
17ea0 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   The journal is 
17eb0 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54  deleted..**.** T
17ec0 68 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e  his routine cann
17ed0 6f 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73  ot fail unless s
17ee0 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73  ome other proces
17ef0 73 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69  s is not followi
17f00 6e 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63  ng.** the correc
17f10 74 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63  t locking protoc
17f20 6f 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f  ol (SQLITE_PROTO
17f30 43 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73  COL) or unless s
17f40 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f  ome other.** pro
17f50 63 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20  cess is writing 
17f60 74 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a  trash into the j
17f70 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c  ournal file (SQL
17f80 49 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a  ITE_CORRUPT) or.
17f90 2a 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f  ** unless a prio
17fa0 72 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65  r malloc() faile
17fb0 64 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29  d (SQLITE_NOMEM)
17fc0 2e 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65  .  Appropriate e
17fd0 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72  rror.** codes ar
17fe0 65 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61  e returned for a
17ff0 6c 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f  ll these occasio
18000 6e 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a  ns.  Otherwise,.
18010 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20  ** SQLITE_OK is 
18020 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74  returned..*/.int
18030 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
18040 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
18050 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
18060 0a 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42  .  TRACE2("ROLLB
18070 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52  ACK %d\n", PAGER
18080 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69  ID(pPager));.  i
18090 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  f( MEMDB ){.    
180a0 50 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f  PgHdr *p;.    fo
180b0 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  r(p=pPager->pAll
180c0 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41  ; p; p=p->pNextA
180d0 6c 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73  ll){.      PgHis
180e0 74 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20  tory *pHist;.   
180f0 20 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61     assert( !p->a
18100 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b  lwaysRollback );
18110 0a 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64  .      if( !p->d
18120 69 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20  irty ){.        
18130 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
18140 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
18150 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
18160 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20  ->pOrig );.     
18170 20 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67     assert( !((Pg
18180 48 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f  History *)PGHDR_
18190 54 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65  TO_HIST(p, pPage
181a0 72 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20  r))->pStmt );.  
181b0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
181c0 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70        }..      p
181d0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
181e0 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b  HIST(p, pPager);
181f0 0a 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74  .      if( pHist
18200 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20  ->pOrig ){.     
18210 20 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f     memcpy(PGHDR_
18220 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73  TO_DATA(p), pHis
18230 74 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72  t->pOrig, pPager
18240 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
18250 20 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c       TRACE3("ROL
18260 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66  LBACK-PAGE %d of
18270 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c   %d\n", p->pgno,
18280 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29   PAGERID(pPager)
18290 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
182a0 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22          TRACE3("
182b0 50 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e  PAGE %d is clean
182c0 20 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67   on %d\n", p->pg
182d0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
182e0 65 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  er));.      }.  
182f0 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79      clearHistory
18300 28 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70  (pHist);.      p
18310 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
18320 20 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20     p->inJournal 
18330 3d 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e  = 0;.      p->in
18340 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
18350 70 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  p->pPrevStmt = p
18360 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
18370 0a 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67  ..      if( pPag
18380 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b  er->xReiniter ){
18390 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
183a0 3e 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52  >xReiniter(PGHDR
183b0 5f 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61  _TO_DATA(p), pPa
183c0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
183d0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20        }.      . 
183e0 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d     }.    pPager-
183f0 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  >pStmt = 0;.    
18400 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
18410 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18420 69 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54  ize;.    memoryT
18430 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b  runcate(pPager);
18440 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
18450 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
18460 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
18470 50 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20  PAGER_SHARED;.  
18480 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18490 4f 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21  OK;.  }..  if( !
184a0 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63  pPager->dirtyCac
184b0 68 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a  he || !pPager->j
184c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20  ournalOpen ){.  
184d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77    rc = pager_unw
184e0 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29  ritelock(pPager)
184f0 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62  ;.    pPager->db
18500 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72  Size = -1;.    r
18510 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
18520 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
18530 4d 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65  Mask!=0 && pPage
18540 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45  r->errMask!=PAGE
18550 52 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20  R_ERR_FULL ){.  
18560 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
18570 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
18580 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61  SIVE ){.      pa
18590 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61  ger_playback(pPa
185a0 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ger);.    }.    
185b0 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72  return pager_err
185c0 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20  code(pPager);.  
185d0 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  }.  if( pPager->
185e0 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53  state==PAGER_RES
185f0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74  ERVED ){.    int
18600 20 72 63 32 2c 20 72 63 33 3b 0a 20 20 20 20 72   rc2, rc3;.    r
18610 63 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64  c = pager_reload
18620 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a  _cache(pPager);.
18630 20 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f      rc2 = pager_
18640 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c  truncate(pPager,
18650 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
18660 69 7a 65 29 3b 0a 20 20 20 20 72 63 33 20 3d 20  ize);.    rc3 = 
18670 70 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63  pager_unwriteloc
18680 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
18690 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
186a0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72   ){.      rc = r
186b0 63 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  c2;.      if( rc
186c0 33 20 29 20 72 63 20 3d 20 72 63 33 3b 0a 20 20  3 ) rc = rc3;.  
186d0 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20    }.  }else{.   
186e0 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
186f0 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20  back(pPager);.  
18700 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  }.  if( rc!=SQLI
18710 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
18720 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  = SQLITE_CORRUPT
18730 3b 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55  ;  /* bkpt-CORRU
18740 50 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72  PT */.    pPager
18750 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47  ->errMask |= PAG
18760 45 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a  ER_ERR_CORRUPT;.
18770 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62    }.  pPager->db
18780 53 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74  Size = -1;.  ret
18790 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
187a0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
187b0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
187c0 65 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64  e is opened read
187d0 2d 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46  -only.  Return F
187e0 41 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64  ALSE.** if the d
187f0 61 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74  atabase is (in t
18800 68 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e  heory) writable.
18810 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
18820 61 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28  ager_isreadonly(
18830 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
18840 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
18850 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a  >readOnly;.}../*
18860 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
18870 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
18880 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
18890 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
188a0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61  sqlite3pager_sta
188b0 74 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ts(Pager *pPager
188c0 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
188d0 61 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20  a[11];.  a[0] = 
188e0 70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20  pPager->nRef;.  
188f0 61 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e  a[1] = pPager->n
18900 50 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70  Page;.  a[2] = p
18910 50 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20  Pager->mxPage;. 
18920 20 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[3] = pPager->
18930 64 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d  dbSize;.  a[4] =
18940 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a   pPager->state;.
18950 20 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d    a[5] = pPager-
18960 3e 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d  >errMask;.  a[6]
18970 20 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b   = pPager->nHit;
18980 0a 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72  .  a[7] = pPager
18990 2d 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20  ->nMiss;.  a[8] 
189a0 3d 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b  = pPager->nOvfl;
189b0 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72  .  a[9] = pPager
189c0 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d  ->nRead;.  a[10]
189d0 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74   = pPager->nWrit
189e0 65 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d  e;.  return a;.}
189f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
18a00 73 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61  statement rollba
18a10 63 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20  ck point..**.** 
18a20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
18a30 75 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69  uld be called wi
18a40 74 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  th the transacti
18a50 6f 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61  on journal alrea
18a60 64 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e  dy.** open.  A n
18a70 65 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ew statement jou
18a80 72 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20  rnal is created 
18a90 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
18aa0 20 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20   to rollback.** 
18ab0 63 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e  changes of a sin
18ac0 67 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  gle SQL command 
18ad0 77 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20  within a larger 
18ae0 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a  transaction..*/.
18af0 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72  int sqlite3pager
18b00 5f 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65  _stmt_begin(Page
18b10 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e  r *pPager){.  in
18b20 74 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65  t rc;.  char zTe
18b30 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41  mp[SQLITE_TEMPNA
18b40 4d 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65  ME_SIZE];.  asse
18b50 72 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d  rt( !pPager->stm
18b60 74 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65  tInUse );.  asse
18b70 72 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69  rt( pPager->dbSi
18b80 7a 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45  ze>=0 );.  TRACE
18b90 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64  2("STMT-BEGIN %d
18ba0 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61  \n", PAGERID(pPa
18bb0 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d  ger));.  if( MEM
18bc0 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
18bd0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b  ->stmtInUse = 1;
18be0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
18bf0 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
18c00 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75  dbSize;.    retu
18c10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
18c20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d  }.  if( !pPager-
18c30 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
18c40 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18c50 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20  Autoopen = 1;.  
18c60 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
18c70 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74  OK;.  }.  assert
18c80 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
18c90 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65  lOpen );.  pPage
18ca0 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c  r->aInStmt = sql
18cb0 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
18cc0 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
18cd0 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
18ce0 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20  >aInStmt==0 ){. 
18cf0 20 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b     sqlite3OsLock
18d00 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48  (&pPager->fd, SH
18d10 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  ARED_LOCK);.    
18d20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
18d30 4d 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66  MEM;.  }.#ifndef
18d40 20 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73   NDEBUG.  rc = s
18d50 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65  qlite3OsFileSize
18d60 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26  (&pPager->jfd, &
18d70 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
18d80 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67  e);.  if( rc ) g
18d90 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66  oto stmt_begin_f
18da0 61 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28  ailed;.  assert(
18db0 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
18dc0 7a 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f  ze == pPager->jo
18dd0 75 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64  urnalOff );.#end
18de0 69 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  if.  pPager->stm
18df0 74 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  tJSize = pPager-
18e00 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
18e10 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20  Pager->stmtSize 
18e20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  = pPager->dbSize
18e30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
18e40 48 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50  HdrOff = 0;.  pP
18e50 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20  ager->stmtCksum 
18e60 3d 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  = pPager->cksumI
18e70 6e 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67  nit;.  if( !pPag
18e80 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a  er->stmtOpen ){.
18e90 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ea0 70 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a  pager_opentemp(z
18eb0 54 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73  Temp, &pPager->s
18ec0 74 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63  tfd);.    if( rc
18ed0 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67   ) goto stmt_beg
18ee0 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70  in_failed;.    p
18ef0 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20  Pager->stmtOpen 
18f00 3d 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 1;.    pPager-
18f10 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20  >stmtNRec = 0;. 
18f20 20 7d 0a 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 31 3b 0a 20 20 72 65  tInUse = 1;.  re
18f40 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
18f50 20 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69   .stmt_begin_fai
18f60 6c 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65  led:.  if( pPage
18f70 72 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20  r->aInStmt ){.  
18f80 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
18f90 67 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20  ger->aInStmt);. 
18fa0 20 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74     pPager->aInSt
18fb0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  mt = 0;.  }.  re
18fc0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
18fd0 2a 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65  * Commit a state
18fe0 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
18ff0 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63  ite3pager_stmt_c
19000 6f 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61  ommit(Pager *pPa
19010 67 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67  ger){.  if( pPag
19020 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
19030 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c  .    PgHdr *pPg,
19040 20 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41   *pNext;.    TRA
19050 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54  CE2("STMT-COMMIT
19060 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
19070 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66  pPager));.    if
19080 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20  ( !MEMDB ){.    
19090 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
190a0 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  &pPager->stfd, 0
190b0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
190c0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70  te3OsTruncate(&p
190d0 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
190e0 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
190f0 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
19100 6e 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70  nStmt );.      p
19110 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d  Pager->aInStmt =
19120 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f   0;.    }.    fo
19130 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53  r(pPg=pPager->pS
19140 74 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e  tmt; pPg; pPg=pN
19150 65 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78  ext){.      pNex
19160 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74  t = pPg->pNextSt
19170 6d 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  mt;.      assert
19180 28 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b  ( pPg->inStmt );
19190 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74  .      pPg->inSt
191a0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  mt = 0;.      pP
191b0 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70  g->pPrevStmt = p
191c0 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20  Pg->pNextStmt = 
191d0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  0;.      if( MEM
191e0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67  DB ){.        Pg
191f0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d  History *pHist =
19200 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70   PGHDR_TO_HIST(p
19210 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20  Pg, pPager);.   
19220 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
19230 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
19240 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53         pHist->pS
19250 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  tmt = 0;.      }
19260 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65  .    }.    pPage
19270 72 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b  r->stmtNRec = 0;
19280 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  .    pPager->stm
19290 74 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20  tInUse = 0;.    
192a0 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20  pPager->pStmt = 
192b0 30 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  0;.  }.  pPager-
192c0 3e 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20  >stmtAutoopen = 
192d0 30 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  0;.  return SQLI
192e0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
192f0 52 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65  Rollback a state
19300 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  ment..*/.int sql
19310 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72  ite3pager_stmt_r
19320 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70  ollback(Pager *p
19330 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63  Pager){.  int rc
19340 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
19350 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
19360 20 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f   TRACE2("STMT-RO
19370 4c 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41  LLBACK %d\n", PA
19380 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
19390 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b      if( MEMDB ){
193a0 0a 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50  .      PgHdr *pP
193b0 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  g;.      for(pPg
193c0 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
193d0 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
193e0 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20  extStmt){.      
193f0 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69    PgHistory *pHi
19400 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49  st = PGHDR_TO_HI
19410 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b  ST(pPg, pPager);
19420 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69  .        if( pHi
19430 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20  st->pStmt ){.   
19440 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47         memcpy(PG
19450 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
19460 2c 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20  , pHist->pStmt, 
19470 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
19480 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
19490 69 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70  iteFree(pHist->p
194a0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
194b0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20   pHist->pStmt = 
194c0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
194d0 20 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65     }.      pPage
194e0 72 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67  r->dbSize = pPag
194f0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20  er->stmtSize;.  
19500 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61      memoryTrunca
19510 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  te(pPager);.    
19520 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
19530 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
19540 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74     rc = pager_st
19550 6d 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  mt_playback(pPag
19560 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  er);.    }.    s
19570 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74  qlite3pager_stmt
19580 5f 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b  _commit(pPager);
19590 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
195a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
195b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
195c0 41 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20  Autoopen = 0;.  
195d0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
195e0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66  .** Return the f
195f0 75 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20  ull pathname of 
19600 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19610 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72  e..*/.const char
19620 20 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66   *sqlite3pager_f
19630 69 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  ilename(Pager *p
19640 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
19650 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61   pPager->zFilena
19660 6d 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  me;.}../*.** Ret
19670 75 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72  urn the director
19680 79 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  y of the databas
19690 65 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74  e file..*/.const
196a0 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61   char *sqlite3pa
196b0 67 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65  ger_dirname(Page
196c0 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
196d0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69  turn pPager->zDi
196e0 72 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a  rectory;.}../*.*
196f0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c  * Return the ful
19700 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68  l pathname of th
19710 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
19720 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73  */.const char *s
19730 71 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72  qlite3pager_jour
19740 6e 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70  nalname(Pager *p
19750 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
19760 20 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61   pPager->zJourna
19770 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20  l;.}../*.** Set 
19780 74 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68  the codec for th
19790 69 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64  is pager.*/.void
197a0 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65   sqlite3pager_se
197b0 74 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72  t_codec(.  Pager
197c0 20 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64   *pPager,.  void
197d0 20 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a   (*xCodec)(void*
197e0 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
197f0 2c 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63  ,.  void *pCodec
19800 41 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d  Arg.){.  pPager-
19810 3e 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63  >xCodec = xCodec
19820 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64  ;.  pPager->pCod
19830 65 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72  ecArg = pCodecAr
19840 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  g;.}../*.** This
19850 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
19860 65 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20  ed to increment 
19870 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
19880 65 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72  e change-counter
19890 2c 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62  ,.** stored at b
198a0 79 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61  yte 24 of the pa
198b0 67 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  ger file..*/.sta
198c0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e  tic int pager_in
198d0 63 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72  cr_changecounter
198e0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
198f0 0a 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a  .  void *pPage;.
19900 20 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b    PgHdr *pPgHdr;
19910 0a 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f  .  u32 change_co
19920 75 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b  unter;.  int rc;
19930 0a 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65  ..  /* Open page
19940 20 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66   1 of the file f
19950 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20  or writing. */. 
19960 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
19970 65 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31  er_get(pPager, 1
19980 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28  , &pPage);.  if(
19990 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
199a0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63   return rc;.  rc
199b0 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
199c0 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
199d0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
199e0 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
199f0 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75    /* Read the cu
19a00 72 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62  rrent value at b
19a10 79 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67  yte 24. */.  pPg
19a20 48 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  Hdr = DATA_TO_PG
19a30 48 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68  HDR(pPage);.  ch
19a40 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72  ange_counter = r
19a50 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
19a60 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a  gHdr, 24);..  /*
19a70 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76   Increment the v
19a80 61 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61  alue just read a
19a90 6e 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b  nd write it back
19aa0 20 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a   to byte 24. */.
19ab0 20 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72    change_counter
19ac0 2b 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74  ++;.  store32bit
19ad0 73 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72  s(change_counter
19ae0 2c 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a  , pPgHdr, 24);..
19af0 20 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65    /* Release the
19b00 20 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e   page reference.
19b10 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67   */.  sqlite3pag
19b20 65 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b  er_unref(pPage);
19b30 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
19b40 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
19b50 6e 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20  nc the database 
19b60 66 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67  file for the pag
19b70 65 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74  er pPager. zMast
19b80 65 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65  er points to the
19b90 20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61   name.** of a ma
19ba0 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  ster journal fil
19bb0 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65  e that should be
19bc0 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68   written into th
19bd0 65 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20  e individual.** 
19be0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d  journal file. zM
19bf0 61 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c  aster may be NUL
19c00 4c 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65  L, which is inte
19c10 72 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61  rpreted as no ma
19c20 73 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  ster.** journal 
19c30 28 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61  (a single databa
19c40 73 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e  se transaction).
19c50 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
19c60 69 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74  ine ensures that
19c70 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20   the journal is 
19c80 73 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74  synced, all dirt
19c90 79 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a  y pages written.
19ca0 2a 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ** to the databa
19cb0 73 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20  se file and the 
19cc0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79  database file sy
19cd0 6e 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74  nced. The only t
19ce0 68 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d  hing that.** rem
19cf0 61 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74  ains to commit t
19d00 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69  he transaction i
19d10 73 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20  s to delete the 
19d20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72  journal file (or
19d30 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  .** master journ
19d40 61 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69  al file if speci
19d50 66 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74  fied)..**.** Not
19d60 65 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65  e that if zMaste
19d70 72 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f  r==NULL, this do
19d80 65 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65  es not overwrite
19d90 20 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75   a previous valu
19da0 65 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61  e.** passed to a
19db0 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  n sqlite3pager_s
19dc0 79 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a  ync() call..**.*
19dd0 2a 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e  * If parameter n
19de0 54 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72  Trunc is non-zer
19df0 6f 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65  o, then the page
19e00 72 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61  r file is trunca
19e10 74 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63  ted to.** nTrunc
19e20 20 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20   pages (this is 
19e30 75 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63  used by auto-vac
19e40 75 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a  uum databases)..
19e50 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
19e60 67 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a  ger_sync(Pager *
19e70 70 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68  pPager, const ch
19e80 61 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e  ar *zMaster, Pgn
19e90 6f 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74  o nTrunc){.  int
19ea0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
19eb0 0a 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41  ..  TRACE4("DATA
19ec0 42 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d  BASE SYNC: File=
19ed0 25 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54  %s zMaster=%s nT
19ee0 72 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20  runc=%d\n", .   
19ef0 20 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65     pPager->zFile
19f00 6e 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e  name, zMaster, n
19f10 54 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66  Trunc);..  /* If
19f20 20 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d   this is an in-m
19f30 65 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20  emory db, or no 
19f40 70 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20  pages have been 
19f50 77 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74  written to, or t
19f60 68 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f  his.  ** functio
19f70 6e 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65  n has already be
19f80 65 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73  en called, it is
19f90 20 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20   a no-op..  */. 
19fa0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
19fb0 74 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44  te!=PAGER_SYNCED
19fc0 20 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50   && !MEMDB && pP
19fd0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
19fe0 20 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70   ){.    PgHdr *p
19ff0 50 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  Pg;.    assert( 
1a000 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1a010 70 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49  pen );..    /* I
1a020 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
1a030 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73  al file name has
1a040 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72   already been wr
1a050 69 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20  itten to the.   
1a060 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65   ** journal file
1a070 2c 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69  , then no sync i
1a080 73 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73  s required. This
1a090 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74   happens when it
1a0a0 20 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   is.    ** writt
1a0b0 65 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f  en, then the pro
1a0c0 63 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70  cess fails to up
1a0d0 67 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53  grade from a RES
1a0e0 45 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20  ERVED to an.    
1a0f0 2a 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  ** EXCLUSIVE loc
1a100 6b 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65  k. The next time
1a110 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69   the process tri
1a120 65 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65  es to commit the
1a130 0a 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  .    ** transact
1a140 69 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65  ion the m-j name
1a150 20 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61   will have alrea
1a160 64 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e  dy been written.
1a170 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
1a180 21 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74  !pPager->setMast
1a190 65 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  er ){.      rc =
1a1a0 20 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e   pager_incr_chan
1a1b0 67 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72  gecounter(pPager
1a1c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21  );.      if( rc!
1a1d0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74  =SQLITE_OK ) got
1a1e0 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66  o sync_exit;.#if
1a1f0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1a200 5f 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20  _AUTOVACUUM.    
1a210 20 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20    if( nTrunc!=0 
1a220 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  ){.        /* If
1a230 20 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f   this transactio
1a240 6e 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64  n has made the d
1a250 61 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c  atabase smaller,
1a260 20 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a   then all pages.
1a270 20 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67          ** being
1a280 20 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68   discarded by th
1a290 65 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73  e truncation mus
1a2a0 74 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20  t be written to 
1a2b0 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20  the journal.    
1a2c0 20 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20      ** file..   
1a2d0 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
1a2e0 50 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20  Pgno i;.        
1a2f0 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20  void *pPage;.   
1a300 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75       for( i=nTru
1a310 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d  nc+1; i<=pPager-
1a320 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b  >origDbSize; i++
1a330 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
1a340 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ( !(pPager->aInJ
1a350 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31  ournal[i/8] & (1
1a360 3c 3c 28 69 26 37 29 29 29 20 29 7b 0a 20 20 20  <<(i&7))) ){.   
1a370 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
1a380 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70  lite3pager_get(p
1a390 50 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65  Pager, i, &pPage
1a3a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
1a3b0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a3c0 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a3d0 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  t;.            r
1a3e0 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72  c = sqlite3pager
1a3f0 5f 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20  _write(pPage);. 
1a400 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1a410 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50  e3pager_unref(pP
1a420 61 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  age);.          
1a430 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a440 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1a450 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
1a460 7d 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20  }.        } .   
1a470 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
1a480 20 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74    rc = writeMast
1a490 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72  erJournal(pPager
1a4a0 2c 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20  , zMaster);.    
1a4b0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a4c0 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1a4d0 65 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d  exit;.      rc =
1a4e0 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61   syncJournal(pPa
1a4f0 67 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ger);.      if( 
1a500 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
1a510 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a  goto sync_exit;.
1a520 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53      }..#ifndef S
1a530 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56  QLITE_OMIT_AUTOV
1a540 41 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54  ACUUM.    if( nT
1a550 72 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20  runc!=0 ){.     
1a560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
1a570 65 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67  er_truncate(pPag
1a580 65 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20  er, nTrunc);.   
1a590 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1a5a0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
1a5b0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e  _exit;.    }.#en
1a5c0 64 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74  dif..    /* Writ
1a5d0 65 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65  e all dirty page
1a5e0 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
1a5f0 65 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50  e file */.    pP
1a600 67 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c  g = pager_get_al
1a610 6c 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50  l_dirty_pages(pP
1a620 61 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20  ager);.    rc = 
1a630 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
1a640 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69  list(pPg);.    i
1a650 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1a660 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69   ) goto sync_exi
1a670 74 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20  t;..    /* Sync 
1a680 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
1a690 65 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70  e. */.    if( !p
1a6a0 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b  Pager->noSync ){
1a6b0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
1a6c0 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65  te3OsSync(&pPage
1a6d0 72 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  r->fd);.    }.. 
1a6e0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
1a6f0 20 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b   = PAGER_SYNCED;
1a700 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a  .  }..sync_exit:
1a710 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1a720 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1a730 4f 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a  OMIT_AUTOVACUUM.
1a740 2f 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70  /*.** Move the p
1a750 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62  age identified b
1a760 79 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74  y pData to locat
1a770 69 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20  ion pgno in the 
1a780 66 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65  file. .**.** The
1a790 72 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65  re must be no re
1a7a0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
1a7b0 63 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e  current page pgn
1a7c0 6f 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61  o. If current pa
1a7d0 67 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f  ge.** pgno is no
1a7e0 74 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65  t already in the
1a7f0 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1a800 6c 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69  l, it is not wri
1a810 74 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a  tten there by.**
1a820 20 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65   by this routine
1a830 2e 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69  . The same appli
1a840 65 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70  es to the page p
1a850 44 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f  Data refers to o
1a860 6e 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68  n entry to.** th
1a870 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  is routine..**.*
1a880 2a 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20  * References to 
1a890 74 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64  the page refered
1a8a0 20 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d   to by pData rem
1a8b0 61 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74  ain valid. Updat
1a8c0 69 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d  ing any.** meta-
1a8d0 64 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20  data associated 
1a8e0 77 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20  with page pData 
1a8f0 28 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65  (i.e. data store
1a900 64 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20  d in the nExtra 
1a910 62 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74  bytes.** allocat
1a920 65 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  ed along with th
1a930 65 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72  e page) is the r
1a940 65 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66  esponsibility of
1a950 20 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a   the caller..**.
1a960 2a 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e  ** A transaction
1a970 20 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20   must be active 
1a980 77 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  when this routin
1a990 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77  e is called, how
1a9a0 65 76 65 72 20 69 74 20 69 73 20 0a 2a 2a 20 69  ever it is .** i
1a9b0 6c 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74  llegal to call t
1a9c0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 61  his routine if a
1a9d0 20 73 74 61 74 6d 65 6e 74 20 74 72 61 6e 73 61   statment transa
1a9e0 63 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e  ction is active.
1a9f0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70  .*/.int sqlite3p
1aa00 61 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61  ager_movepage(Pa
1aa10 67 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69  ger *pPager, voi
1aa20 64 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70  d *pData, Pgno p
1aa30 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  gno){.  PgHdr *p
1aa40 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  Pg = DATA_TO_PGH
1aa50 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48  DR(pData);.  PgH
1aa60 64 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69  dr *pPgOld; .  i
1aa70 6e 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65  nt h;.  Pgno nee
1aa80 64 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a  dSyncPgno = 0;..
1aa90 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65    assert( !pPage
1aaa0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a  r->stmtInUse );.
1aab0 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e    assert( pPg->n
1aac0 52 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43  Ref>0 );..  TRAC
1aad0 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
1aae0 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
1aaf0 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
1ab00 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
1ab10 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
1ab20 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
1ab30 6e 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66  nc, pgno);..  if
1ab40 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20  ( pPg->needSync 
1ab50 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50  ){.    needSyncP
1ab60 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  gno = pPg->pgno;
1ab70 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
1ab80 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20  ->inJournal );. 
1ab90 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1aba0 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73  dirty );.    ass
1abb0 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65  ert( pPager->nee
1abc0 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20  dSync );.  }..  
1abd0 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  /* Unlink pPg fr
1abe0 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61  om it's hash-cha
1abf0 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61  in */.  unlinkHa
1ac00 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
1ac10 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  pPg);..  /* If t
1ac20 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e  he cache contain
1ac30 73 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61  s a page with pa
1ac40 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20  ge-number pgno, 
1ac50 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66  remove it.  ** f
1ac60 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68  rom it's hash ch
1ac70 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68  ain. Also, if th
1ac80 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
1ac90 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20   was set for .  
1aca0 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66  ** page pgno bef
1acb0 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f  ore the 'move' o
1acc0 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65  peration, it nee
1acd0 64 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65  ds to be retaine
1ace0 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  d .  ** for the 
1acf0 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65  page moved there
1ad00 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20  ..  */.  pPgOld 
1ad10 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70  = pager_lookup(p
1ad20 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20  Pager, pgno);.  
1ad30 69 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20  if( pPgOld ){.  
1ad40 20 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64    assert( pPgOld
1ad50 2d 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20  ->nRef==0 );.   
1ad60 20 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e   unlinkHashChain
1ad70 28 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29  (pPager, pPgOld)
1ad80 3b 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69  ;.    pPgOld->di
1ad90 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  rty = 0;.    if(
1ada0 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e   pPgOld->needSyn
1adb0 63 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  c ){.      asser
1adc0 74 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75  t( pPgOld->inJou
1add0 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50  rnal );.      pP
1ade0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31  g->inJournal = 1
1adf0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
1ae00 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  dSync = 1;.     
1ae10 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1ae20 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
1ae30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61   }.  }..  /* Cha
1ae40 6e 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d  nge the page num
1ae50 62 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20  ber for pPg and 
1ae60 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
1ae70 68 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69  he new hash-chai
1ae80 6e 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e  n. */.  pPg->pgn
1ae90 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20  o = pgno;.  h = 
1aea0 70 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29  pager_hash(pgno)
1aeb0 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
1aec0 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20  aHash[h] ){.    
1aed0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1aee0 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48  aHash[h]->pPrevH
1aef0 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50  ash==0 );.    pP
1af00 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e  ager->aHash[h]->
1af10 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b  pPrevHash = pPg;
1af20 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78  .  }.  pPg->pNex
1af30 74 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e  tHash = pPager->
1af40 61 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67  aHash[h];.  pPag
1af50 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
1af60 50 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76  Pg;.  pPg->pPrev
1af70 48 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67  Hash = 0;..  pPg
1af80 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70  ->dirty = 1;.  p
1af90 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1afa0 65 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65  e = 1;..  if( ne
1afb0 65 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20  edSyncPgno ){.  
1afc0 20 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63    /* If needSync
1afd0 50 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Pgno is non-zero
1afe0 2c 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e  , then the journ
1aff0 61 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f  al file needs to
1b000 20 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63   be .    ** sync
1b010 28 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20  ()ed before any 
1b020 64 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20  data is written 
1b030 74 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  to database file
1b040 20 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67   page needSyncPg
1b050 6e 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65  no..    ** Curre
1b060 6e 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61  ntly, no such pa
1b070 67 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65  ge exists in the
1b080 20 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20   page-cache and 
1b090 74 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65  the .    ** Page
1b0a0 72 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74  r.aInJournal bit
1b0b0 20 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54   has been set. T
1b0c0 68 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20  his needs to be 
1b0d0 72 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64  remedied by load
1b0e0 69 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70  ing.    ** the p
1b0f0 61 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67  age into the pag
1b100 65 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74  er-cache and set
1b110 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1b120 65 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20  eedSync flag..  
1b130 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20    **.    ** The 
1b140 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1b150 28 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73  () call may caus
1b160 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f  e the journal to
1b170 20 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20   sync. So make. 
1b180 20 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50     ** sure the P
1b190 61 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c  ager.needSync fl
1b1a0 61 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20  ag is set too.. 
1b1b0 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63     */.    int rc
1b1c0 3b 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65  ;.    void *pNee
1b1d0 64 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72  dSync;.    asser
1b1e0 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53  t( pPager->needS
1b1f0 79 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20  ync );.    rc = 
1b200 73 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74  sqlite3pager_get
1b210 28 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e  (pPager, needSyn
1b220 63 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e  cPgno, &pNeedSyn
1b230 63 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  c);.    if( rc!=
1b240 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
1b250 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65  rn rc;.    pPage
1b260 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b  r->needSync = 1;
1b270 0a 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48  .    DATA_TO_PGH
1b280 44 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e  DR(pNeedSync)->n
1b290 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
1b2a0 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70   DATA_TO_PGHDR(p
1b2b0 4e 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75  NeedSync)->inJou
1b2c0 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41  rnal = 1;.    DA
1b2d0 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65  TA_TO_PGHDR(pNee
1b2e0 64 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20  dSync)->dirty = 
1b2f0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61  1;.    sqlite3pa
1b300 67 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53  ger_unref(pNeedS
1b310 79 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  ync);.  }..  ret
1b320 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d  urn SQLITE_OK;.}
1b330 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66  .#endif..#if def
1b340 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
1b350 47 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51  G) || defined(SQ
1b360 4c 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a  LITE_TEST)./*.**
1b370 20 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72   Return the curr
1b380 65 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65  ent state of the
1b390 20 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74   file lock for t
1b3a0 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
1b3b0 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  ** The return va
1b3c0 6c 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f  lue is one of NO
1b3d0 5f 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f  _LOCK, SHARED_LO
1b3e0 43 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  CK, RESERVED_LOC
1b3f0 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f  K,.** PENDING_LO
1b400 43 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45  CK, or EXCLUSIVE
1b410 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  _LOCK..*/.int sq
1b420 6c 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73  lite3pager_locks
1b430 74 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67  tate(Pager *pPag
1b440 65 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54  er){.#ifdef OS_T
1b450 45 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61  EST.  return pPa
1b460 67 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b  ger->fd->fd.lock
1b470 74 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65  type;.#else.  re
1b480 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e  turn pPager->fd.
1b490 6c 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66  locktype;.#endif
1b4a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
1b4b0 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
1b4c0 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
1b4d0 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
1b4e0 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
1b4f0 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
1b500 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b510 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
1b520 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b530 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
1b540 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1b550 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1b560 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1b570 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
1b580 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1b590 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1b5a0 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
1b5b0 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
1b5c0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
1b5d0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
1b5e0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
1b5f0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
1b600 69 66 0a                                         if.