/ Hex Artifact Content
Login

Artifact d21565d0e844712809140632062a7b72b768fdff:


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: 37 20 32 30 30 35 2f 30 31 2f 32 39 20 30 38 3a  7 2005/01/29 08:
0360: 33 32 3a 34 35 20 64 61 6e 69 65 6c 6b 31 39 37  32:45 danielk197
0370: 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69 6e 63 6c  7 Exp $.*/.#incl
0380: 75 64 65 20 22 73 71 6c 69 74 65 49 6e 74 2e 68  ude "sqliteInt.h
0390: 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f 73 2e 68  ".#include "os.h
03a0: 22 0a 23 69 6e 63 6c 75 64 65 20 22 70 61 67 65  ".#include "page
03b0: 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 61  r.h".#include <a
03c0: 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63 6c 75 64  ssert.h>.#includ
03d0: 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a 0a 2f 2a  e <string.h>../*
03e0: 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72 20 74  .** Macros for t
03f0: 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e 67 2e 20  roubleshooting. 
0400: 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72 6e 65 64   Normally turned
0410: 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30 0a 23 64   off.*/.#if 0.#d
0420: 65 66 69 6e 65 20 54 52 41 43 45 31 28 58 29 20  efine TRACE1(X) 
0430: 20 20 20 20 20 20 73 71 6c 69 74 65 33 44 65 62        sqlite3Deb
0440: 75 67 50 72 69 6e 74 66 28 58 29 0a 23 64 65 66  ugPrintf(X).#def
0450: 69 6e 65 20 54 52 41 43 45 32 28 58 2c 59 29 20  ine TRACE2(X,Y) 
0460: 20 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67      sqlite3Debug
0470: 50 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66  Printf(X,Y).#def
0480: 69 6e 65 20 54 52 41 43 45 33 28 58 2c 59 2c 5a  ine TRACE3(X,Y,Z
0490: 29 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67  )   sqlite3Debug
04a0: 50 72 69 6e 74 66 28 58 2c 59 2c 5a 29 0a 23 64  Printf(X,Y,Z).#d
04b0: 65 66 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59  efine TRACE4(X,Y
04c0: 2c 5a 2c 57 29 20 73 71 6c 69 74 65 33 44 65 62  ,Z,W) sqlite3Deb
04d0: 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a 2c 57  ugPrintf(X,Y,Z,W
04e0: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 35  ).#define TRACE5
04f0: 28 58 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69  (X,Y,Z,W,V) sqli
0500: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 58  te3DebugPrintf(X
0510: 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a  ,Y,Z,W,V).#else.
0520: 23 64 65 66 69 6e 65 20 54 52 41 43 45 31 28 58  #define TRACE1(X
0530: 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43 45 32  ).#define TRACE2
0540: 28 58 2c 59 29 0a 23 64 65 66 69 6e 65 20 54 52  (X,Y).#define TR
0550: 41 43 45 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66  ACE3(X,Y,Z).#def
0560: 69 6e 65 20 54 52 41 43 45 34 28 58 2c 59 2c 5a  ine TRACE4(X,Y,Z
0570: 2c 57 29 0a 23 64 65 66 69 6e 65 20 54 52 41 43  ,W).#define TRAC
0580: 45 35 28 58 2c 59 2c 5a 2c 57 2c 56 29 0a 23 65  E5(X,Y,Z,W,V).#e
0590: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  ndif../*.** The 
05a0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 77 6f 20 6d 61  following two ma
05b0: 63 72 6f 73 20 61 72 65 20 75 73 65 64 20 77 69  cros are used wi
05c0: 74 68 69 6e 20 74 68 65 20 54 52 41 43 45 58 28  thin the TRACEX(
05d0: 29 20 6d 61 63 72 6f 73 20 61 62 6f 76 65 0a 2a  ) macros above.*
05e0: 2a 20 74 6f 20 70 72 69 6e 74 20 6f 75 74 20 66  * to print out f
05f0: 69 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 73 2e  ile-descriptors.
0600: 20 54 68 65 79 20 61 72 65 20 72 65 71 75 69 72   They are requir
0610: 65 64 20 73 6f 20 74 68 61 74 20 74 72 61 63 69  ed so that traci
0620: 6e 67 0a 2a 2a 20 63 61 6e 20 62 65 20 74 75 72  ng.** can be tur
0630: 6e 65 64 20 6f 6e 20 77 68 65 6e 20 75 73 69 6e  ned on when usin
0640: 67 20 62 6f 74 68 20 74 68 65 20 72 65 67 75 6c  g both the regul
0650: 61 72 20 6f 73 5f 75 6e 69 78 2e 63 20 61 6e 64  ar os_unix.c and
0660: 20 6f 73 5f 74 65 73 74 2e 63 0a 2a 2a 20 62 61   os_test.c.** ba
0670: 63 6b 65 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 50 41  ckends..**.** PA
0680: 47 45 52 49 44 28 29 20 74 61 6b 65 73 20 61 20  GERID() takes a 
0690: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 61 67  pointer to a Pag
06a0: 65 72 20 73 74 72 75 63 74 20 61 73 20 69 74 27  er struct as it'
06b0: 73 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65 0a  s argument. The.
06c0: 2a 2a 20 61 73 73 6f 63 69 61 74 65 64 20 66 69  ** associated fi
06d0: 6c 65 2d 64 65 73 63 72 69 70 74 6f 72 20 69 73  le-descriptor is
06e0: 20 72 65 74 75 72 6e 65 64 2e 20 46 49 4c 45 48   returned. FILEH
06f0: 41 4e 44 4c 45 49 44 28 29 20 74 61 6b 65 73 20  ANDLEID() takes 
0700: 61 6e 20 4f 73 46 69 6c 65 0a 2a 2a 20 73 74 72  an OsFile.** str
0710: 75 63 74 20 61 73 20 69 74 27 73 20 61 72 67 75  uct as it's argu
0720: 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  ment..*/.#ifdef 
0730: 4f 53 5f 54 45 53 54 0a 23 64 65 66 69 6e 65 20  OS_TEST.#define 
0740: 50 41 47 45 52 49 44 28 70 29 20 28 70 2d 3e 66  PAGERID(p) (p->f
0750: 64 2d 3e 66 64 2e 68 29 0a 23 64 65 66 69 6e 65  d->fd.h).#define
0760: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 66 64   FILEHANDLEID(fd
0770: 29 20 28 66 64 2d 3e 66 64 2e 68 29 0a 23 65 6c  ) (fd->fd.h).#el
0780: 73 65 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  se.#define PAGER
0790: 49 44 28 70 29 20 28 70 2d 3e 66 64 2e 68 29 0a  ID(p) (p->fd.h).
07a0: 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e 44  #define FILEHAND
07b0: 4c 45 49 44 28 66 64 29 20 28 66 64 2e 68 29 0a  LEID(fd) (fd.h).
07c0: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68  #endif../*.** Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 61 73 20  e page cache as 
07e0: 61 20 77 68 6f 6c 65 20 69 73 20 61 6c 77 61 79  a whole is alway
07f0: 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  s in one of the 
0800: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61  following.** sta
0810: 74 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  tes:.**.**   PAG
0820: 45 52 5f 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20  ER_UNLOCK       
0830: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0840: 69 73 20 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79  is not currently
0850: 20 72 65 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20   reading or .** 
0860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0870: 20 20 20 20 20 20 77 72 69 74 69 6e 67 20 74 68        writing th
0880: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
0890: 20 20 54 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a    There is no.**
08a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08b0: 20 20 20 20 20 20 20 64 61 74 61 20 68 65 6c 64         data held
08c0: 20 69 6e 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69   in memory.  Thi
08d0: 73 20 69 73 20 74 68 65 20 69 6e 69 74 69 61 6c  s is the initial
08e0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
08f0: 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65 2e            state.
0900: 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53  .**.**   PAGER_S
0910: 48 41 52 45 44 20 20 20 20 20 20 20 20 54 68 65  HARED        The
0920: 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20 72   page cache is r
0930: 65 61 64 69 6e 67 20 74 68 65 20 64 61 74 61 62  eading the datab
0940: 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20  ase..**         
0950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72                Wr
0960: 69 74 69 6e 67 20 69 73 20 6e 6f 74 20 70 65 72  iting is not per
0970: 6d 69 74 74 65 64 2e 20 20 54 68 65 72 65 20 63  mitted.  There c
0980: 61 6e 20 62 65 0a 2a 2a 20 20 20 20 20 20 20 20  an be.**        
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
09a0: 75 6c 74 69 70 6c 65 20 72 65 61 64 65 72 73 20  ultiple readers 
09b0: 61 63 63 65 73 73 69 6e 67 20 74 68 65 20 73 61  accessing the sa
09c0: 6d 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 20  me database.**  
09d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
09e0: 20 20 20 20 20 66 69 6c 65 20 61 74 20 74 68 65       file at the
09f0: 20 73 61 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a   same time..**.*
0a00: 2a 20 20 20 50 41 47 45 52 5f 52 45 53 45 52 56  *   PAGER_RESERV
0a10: 45 44 20 20 20 20 20 20 54 68 69 73 20 70 72 6f  ED      This pro
0a20: 63 65 73 73 20 68 61 73 20 72 65 73 65 72 76 65  cess has reserve
0a30: 64 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  d the database f
0a40: 6f 72 20 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20  or writing.**   
0a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a60: 20 20 20 20 62 75 74 20 68 61 73 20 6e 6f 74 20      but has not 
0a70: 79 65 74 20 6d 61 64 65 20 61 6e 79 20 63 68 61  yet made any cha
0a80: 6e 67 65 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20  nges.  Only one 
0a90: 70 72 6f 63 65 73 73 0a 2a 2a 20 20 20 20 20 20  process.**      
0aa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ab0: 20 61 74 20 61 20 74 69 6d 65 20 63 61 6e 20 72   at a time can r
0ac0: 65 73 65 72 76 65 20 74 68 65 20 64 61 74 61 62  eserve the datab
0ad0: 61 73 65 2e 20 20 54 68 65 20 6f 72 69 67 69 6e  ase.  The origin
0ae0: 61 6c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  al.**           
0af0: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
0b00: 62 61 73 65 20 66 69 6c 65 20 68 61 73 20 6e 6f  base file has no
0b10: 74 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 20  t been modified 
0b20: 73 6f 20 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20  so other.**     
0b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b40: 20 20 70 72 6f 63 65 73 73 65 73 20 6d 61 79 20    processes may 
0b50: 73 74 69 6c 6c 20 62 65 20 72 65 61 64 69 6e 67  still be reading
0b60: 20 74 68 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20   the on-disk.** 
0b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b80: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 20 66        database f
0b90: 69 6c 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47  ile..**.**   PAG
0ba0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 20 20 20  ER_EXCLUSIVE    
0bb0: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0bc0: 69 73 20 77 72 69 74 69 6e 67 20 74 68 65 20 64  is writing the d
0bd0: 61 74 61 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20  atabase..**     
0be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bf0: 20 20 41 63 63 65 73 73 20 69 73 20 65 78 63 6c    Access is excl
0c00: 75 73 69 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72  usive.  No other
0c10: 20 70 72 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a   processes or.**
0c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c30: 20 20 20 20 20 20 20 74 68 72 65 61 64 73 20 63         threads c
0c40: 61 6e 20 62 65 20 72 65 61 64 69 6e 67 20 6f 72  an be reading or
0c50: 20 77 72 69 74 69 6e 67 20 77 68 69 6c 65 20 6f   writing while o
0c60: 6e 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ne.**           
0c70: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 63              proc
0c80: 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 2e 0a  ess is writing..
0c90: 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 59  **.**   PAGER_SY
0ca0: 4e 43 45 44 20 20 20 20 20 20 20 20 54 68 65 20  NCED        The 
0cb0: 70 61 67 65 72 20 6d 6f 76 65 73 20 74 6f 20 74  pager moves to t
0cc0: 68 69 73 20 73 74 61 74 65 20 66 72 6f 6d 20 50  his state from P
0cd0: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a  AGER_EXCLUSIVE.*
0ce0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
0cf0: 20 20 20 20 20 20 20 20 61 66 74 65 72 20 61 6c          after al
0d00: 6c 20 64 69 72 74 79 20 70 61 67 65 73 20 68 61  l dirty pages ha
0d10: 76 65 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20  ve been written 
0d20: 74 6f 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20  to the.**       
0d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d40: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e  database file an
0d50: 64 20 74 68 65 20 66 69 6c 65 20 68 61 73 20 62  d the file has b
0d60: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a  een synced to.**
0d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d80: 20 20 20 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c         disk. All
0d90: 20 74 68 61 74 20 72 65 6d 61 69 6e 73 20 74 6f   that remains to
0da0: 20 64 6f 20 69 73 20 74 6f 20 72 65 6d 6f 76 65   do is to remove
0db0: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20   the.**         
0dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6a 6f                jo
0dd0: 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64 20 74  urnal file and t
0de0: 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77  he transaction w
0df0: 69 6c 6c 20 62 65 0a 2a 2a 20 20 20 20 20 20 20  ill be.**       
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e10: 63 6f 6d 6d 69 74 74 65 64 2e 0a 2a 2a 0a 2a 2a  committed..**.**
0e20: 20 54 68 65 20 70 61 67 65 20 63 61 63 68 65 20   The page cache 
0e30: 63 6f 6d 65 73 20 75 70 20 69 6e 20 50 41 47 45  comes up in PAGE
0e40: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0e50: 69 72 73 74 20 74 69 6d 65 20 61 0a 2a 2a 20 73  irst time a.** s
0e60: 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
0e70: 29 20 6f 63 63 75 72 73 2c 20 74 68 65 20 73 74  ) occurs, the st
0e80: 61 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20  ate transitions 
0e90: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2e  to PAGER_SHARED.
0ea0: 0a 2a 2a 20 41 66 74 65 72 20 61 6c 6c 20 70 61  .** After all pa
0eb0: 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65  ges have been re
0ec0: 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71 6c  leased using sql
0ed0: 69 74 65 5f 70 61 67 65 5f 75 6e 72 65 66 28 29  ite_page_unref()
0ee0: 2c 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20 74  ,.** the state t
0ef0: 72 61 6e 73 69 74 69 6f 6e 73 20 62 61 63 6b 20  ransitions back 
0f00: 74 6f 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2e  to PAGER_UNLOCK.
0f10: 20 20 54 68 65 20 66 69 72 73 74 20 74 69 6d 65    The first time
0f20: 0a 2a 2a 20 74 68 61 74 20 73 71 6c 69 74 65 33  .** that sqlite3
0f30: 70 61 67 65 72 5f 77 72 69 74 65 28 29 20 69 73  pager_write() is
0f40: 20 63 61 6c 6c 65 64 2c 20 74 68 65 20 73 74 61   called, the sta
0f50: 74 65 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74  te transitions t
0f60: 6f 0a 2a 2a 20 50 41 47 45 52 5f 52 45 53 45 52  o.** PAGER_RESER
0f70: 56 45 44 2e 20 20 28 4e 6f 74 65 20 74 68 61 74  VED.  (Note that
0f80: 20 73 71 6c 69 74 65 5f 70 61 67 65 5f 77 72 69   sqlite_page_wri
0f90: 74 65 28 29 20 63 61 6e 20 6f 6e 6c 79 20 62 65  te() can only be
0fa0: 0a 2a 2a 20 63 61 6c 6c 65 64 20 6f 6e 20 61 6e  .** called on an
0fb0: 20 6f 75 74 73 74 61 6e 64 69 6e 67 20 70 61 67   outstanding pag
0fc0: 65 20 77 68 69 63 68 20 6d 65 61 6e 73 20 74 68  e which means th
0fd0: 61 74 20 74 68 65 20 70 61 67 65 72 20 6d 75 73  at the pager mus
0fe0: 74 0a 2a 2a 20 62 65 20 69 6e 20 50 41 47 45 52  t.** be in PAGER
0ff0: 5f 53 48 41 52 45 44 20 62 65 66 6f 72 65 20 69  _SHARED before i
1000: 74 20 74 72 61 6e 73 69 74 69 6f 6e 73 20 74 6f  t transitions to
1010: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 2e   PAGER_RESERVED.
1020: 29 0a 2a 2a 20 54 68 65 20 74 72 61 6e 73 69 74  ).** The transit
1030: 69 6f 6e 20 74 6f 20 50 41 47 45 52 5f 45 58 43  ion to PAGER_EXC
1040: 4c 55 53 49 56 45 20 6f 63 63 75 72 73 20 77 68  LUSIVE occurs wh
1050: 65 6e 20 62 65 66 6f 72 65 20 61 6e 79 20 63 68  en before any ch
1060: 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64  anges.** are mad
1070: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
1080: 65 20 66 69 6c 65 2e 20 20 41 66 74 65 72 20 61  e file.  After a
1090: 6e 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72  n sqlite3pager_r
10a0: 6f 6c 6c 62 61 63 6b 28 29 0a 2a 2a 20 6f 72 20  ollback().** or 
10b0: 73 71 6c 69 74 65 5f 70 61 67 65 72 5f 63 6f 6d  sqlite_pager_com
10c0: 6d 69 74 28 29 2c 20 74 68 65 20 73 74 61 74 65  mit(), the state
10d0: 20 67 6f 65 73 20 62 61 63 6b 20 74 6f 20 50 41   goes back to PA
10e0: 47 45 52 5f 53 48 41 52 45 44 2e 0a 2a 2f 0a 23  GER_SHARED..*/.#
10f0: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c  define PAGER_UNL
1100: 4f 43 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69  OCK      0.#defi
1110: 6e 65 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  ne PAGER_SHARED 
1120: 20 20 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65       1   /* same
1130: 20 61 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20   as SHARED_LOCK 
1140: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  */.#define PAGER
1150: 5f 52 45 53 45 52 56 45 44 20 20 20 20 32 20 20  _RESERVED    2  
1160: 20 2f 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45   /* same as RESE
1170: 52 56 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65  RVED_LOCK */.#de
1180: 66 69 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55  fine PAGER_EXCLU
1190: 53 49 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61  SIVE   4   /* sa
11a0: 6d 65 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f  me as EXCLUSIVE_
11b0: 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20  LOCK */.#define 
11c0: 50 41 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20  PAGER_SYNCED    
11d0: 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68    5../*.** If th
11e0: 65 20 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45  e SQLITE_BUSY_RE
11f0: 53 45 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72  SERVED_LOCK macr
1200: 6f 20 69 73 20 73 65 74 20 74 6f 20 74 72 75 65  o is set to true
1210: 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65   at compile-time
1220: 2c 0a 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64  ,.** then failed
1230: 20 61 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74   attempts to get
1240: 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b   a reserved lock
1250: 20 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65   will invoke the
1260: 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a   busy callback..
1270: 2a 2a 20 54 68 69 73 20 69 73 20 6f 66 66 20 62  ** This is off b
1280: 79 20 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73  y default.  To s
1290: 65 65 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72  ee why, consider
12a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
12b0: 63 65 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20  cenario:.** .** 
12c0: 53 75 70 70 6f 73 65 20 74 68 72 65 61 64 20 41  Suppose thread A
12d0: 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 73   already has a s
12e0: 68 61 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77  hared lock and w
12f0: 61 6e 74 73 20 61 20 72 65 73 65 72 76 65 64 20  ants a reserved 
1300: 6c 6f 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20  lock..** Thread 
1310: 42 20 61 6c 72 65 61 64 79 20 68 61 73 20 61 20  B already has a 
1320: 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e  reserved lock an
1330: 64 20 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75  d wants an exclu
1340: 73 69 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a  sive lock.  If.*
1350: 2a 20 62 6f 74 68 20 74 68 72 65 61 64 73 20 61  * both threads a
1360: 72 65 20 75 73 69 6e 67 20 74 68 65 69 72 20 62  re using their b
1370: 75 73 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69  usy callbacks, i
1380: 74 20 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e  t might be a lon
1390: 67 20 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72  g time.** be for
13a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65   one of the thre
13b0: 61 64 73 20 67 69 76 65 20 75 70 20 61 6e 64 20  ads give up and 
13c0: 61 6c 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72  allows the other
13d0: 20 74 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20   to proceed..** 
13e0: 42 75 74 20 69 66 20 74 68 65 20 74 68 72 65 61  But if the threa
13f0: 64 20 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20  d trying to get 
1400: 74 68 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63  the reserved loc
1410: 6b 20 67 69 76 65 73 20 75 70 20 71 75 69 63 6b  k gives up quick
1420: 6c 79 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76  ly.** (if it nev
1430: 65 72 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62  er invokes its b
1440: 75 73 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68  usy callback) th
1450: 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f  en the contentio
1460: 6e 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73  n will be.** res
1470: 6f 6c 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a  olved quickly..*
1480: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
1490: 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c  _BUSY_RESERVED_L
14a0: 4f 43 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c  OCK.# define SQL
14b0: 49 54 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45  ITE_BUSY_RESERVE
14c0: 44 5f 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a  D_LOCK 0.#endif.
14d0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72  ./*.** This macr
14e0: 6f 20 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20  o rounds values 
14f0: 75 70 20 73 6f 20 74 68 61 74 20 69 66 20 74 68  up so that if th
1500: 65 20 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64  e value is an ad
1510: 64 72 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67  dress it.** is g
1520: 75 61 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20  uaranteed to be 
1530: 61 6e 20 61 64 64 72 65 73 73 20 74 68 61 74 20  an address that 
1540: 69 73 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e  is aligned to an
1550: 20 38 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79   8-byte boundary
1560: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52  ..*/.#define FOR
1570: 43 45 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20  CE_ALIGNMENT(X) 
1580: 20 20 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a    (((X)+7)&~7)..
1590: 2f 2a 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65  /*.** Each in-me
15a0: 6d 6f 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20  mory image of a 
15b0: 70 61 67 65 20 62 65 67 69 6e 73 20 77 69 74 68  page begins with
15c0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68   the following h
15d0: 65 61 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68  eader..** This h
15e0: 65 61 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69  eader is only vi
15f0: 73 69 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61  sible to this pa
1600: 67 65 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65  ger module.  The
1610: 20 63 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20   client.** code 
1620: 74 68 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72  that calls pager
1630: 20 73 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64   sees only the d
1640: 61 74 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73  ata that follows
1650: 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a   the header..**.
1660: 2a 2a 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73  ** Client code s
1670: 68 6f 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74  hould call sqlit
1680: 65 33 70 61 67 65 72 5f 77 72 69 74 65 28 29 20  e3pager_write() 
1690: 6f 6e 20 61 20 70 61 67 65 20 70 72 69 6f 72 20  on a page prior 
16a0: 74 6f 20 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79  to making.** any
16b0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 73 20 74   modifications t
16c0: 6f 20 74 68 61 74 20 70 61 67 65 2e 20 20 54 68  o that page.  Th
16d0: 65 20 66 69 72 73 74 20 74 69 6d 65 20 73 71 6c  e first time sql
16e0: 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16f0: 29 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 2c 20  ).** is called, 
1700: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 70 61 67  the original pag
1710: 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65 20 77  e contents are w
1720: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
1730: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1740: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 69 6e  nal and PgHdr.in
1750: 4a 6f 75 72 6e 61 6c 20 61 6e 64 20 50 67 48 64  Journal and PgHd
1760: 72 2e 6e 65 65 64 53 79 6e 63 20 61 72 65 20 73  r.needSync are s
1770: 65 74 2e 20 20 4c 61 74 65 72 2c 20 6f 6e 63 65  et.  Later, once
1780: 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
1790: 70 61 67 65 20 68 61 73 20 6d 61 64 65 20 69 74  page has made it
17a0: 20 6f 6e 74 6f 20 74 68 65 20 64 69 73 6b 20 73   onto the disk s
17b0: 75 72 66 61 63 65 2c 20 50 67 48 64 72 2e 6e 65  urface, PgHdr.ne
17c0: 65 64 53 79 6e 63 0a 2a 2a 20 69 73 20 63 6c 65  edSync.** is cle
17d0: 61 72 65 64 2e 20 20 54 68 65 20 6d 6f 64 69 66  ared.  The modif
17e0: 69 65 64 20 70 61 67 65 20 63 61 6e 6e 6f 74 20  ied page cannot 
17f0: 62 65 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20  be written back 
1800: 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69 6e 61  into the origina
1810: 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69  l.** database fi
1820: 6c 65 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75  le until the jou
1830: 72 6e 61 6c 20 70 61 67 65 73 20 68 61 73 20 62  rnal pages has b
1840: 65 65 6e 20 73 79 6e 63 65 64 20 74 6f 20 64 69  een synced to di
1850: 73 6b 20 61 6e 64 20 74 68 65 0a 2a 2a 20 50 67  sk and the.** Pg
1860: 48 64 72 2e 6e 65 65 64 53 79 6e 63 20 68 61 73  Hdr.needSync has
1870: 20 62 65 65 6e 20 63 6c 65 61 72 65 64 2e 0a 2a   been cleared..*
1880: 2a 0a 2a 2a 20 54 68 65 20 50 67 48 64 72 2e 64  *.** The PgHdr.d
1890: 69 72 74 79 20 66 6c 61 67 20 69 73 20 73 65 74  irty flag is set
18a0: 20 77 68 65 6e 20 73 71 6c 69 74 65 33 70 61 67   when sqlite3pag
18b0: 65 72 5f 77 72 69 74 65 28 29 20 69 73 20 63 61  er_write() is ca
18c0: 6c 6c 65 64 20 61 6e 64 0a 2a 2a 20 69 73 20 63  lled and.** is c
18d0: 6c 65 61 72 65 64 20 61 67 61 69 6e 20 77 68 65  leared again whe
18e0: 6e 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65  n the page conte
18f0: 6e 74 20 69 73 20 77 72 69 74 74 65 6e 20 62 61  nt is written ba
1900: 63 6b 20 74 6f 20 74 68 65 20 6f 72 69 67 69 6e  ck to the origin
1910: 61 6c 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 66  al.** database f
1920: 69 6c 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20  ile..*/.typedef 
1930: 73 74 72 75 63 74 20 50 67 48 64 72 20 50 67 48  struct PgHdr PgH
1940: 64 72 3b 0a 73 74 72 75 63 74 20 50 67 48 64 72  dr;.struct PgHdr
1950: 20 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67   {.  Pager *pPag
1960: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
1970: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67 65 72      /* The pager
1980: 20 74 6f 20 77 68 69 63 68 20 74 68 69 73 20 70   to which this p
1990: 61 67 65 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20  age belongs */. 
19a0: 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20   Pgno pgno;     
19b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19c0: 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75 6d 62  /* The page numb
19d0: 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
19e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65   */.  PgHdr *pNe
19f0: 78 74 48 61 73 68 2c 20 2a 70 50 72 65 76 48 61  xtHash, *pPrevHa
1a00: 73 68 3b 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c  sh;  /* Hash col
1a10: 6c 69 73 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72  lision chain for
1a20: 20 50 67 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20   PgHdr.pgno */. 
1a30: 20 50 67 48 64 72 20 2a 70 4e 65 78 74 46 72 65   PgHdr *pNextFre
1a40: 65 2c 20 2a 70 50 72 65 76 46 72 65 65 3b 20 20  e, *pPrevFree;  
1a50: 2f 2a 20 46 72 65 65 6c 69 73 74 20 6f 66 20 70  /* Freelist of p
1a60: 61 67 65 73 20 77 68 65 72 65 20 6e 52 65 66 3d  ages where nRef=
1a70: 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  =0 */.  PgHdr *p
1a80: 4e 65 78 74 41 6c 6c 3b 20 20 20 20 20 20 20 20  NextAll;        
1a90: 20 20 20 20 20 20 20 2f 2a 20 41 20 6c 69 73 74         /* A list
1aa0: 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f   of all pages */
1ab0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 53  .  PgHdr *pNextS
1ac0: 74 6d 74 2c 20 2a 70 50 72 65 76 53 74 6d 74 3b  tmt, *pPrevStmt;
1ad0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70 61 67    /* List of pag
1ae0: 65 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d  es in the statem
1af0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ent journal */. 
1b00: 20 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20   u8 inJournal;  
1b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b20: 2f 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62  /* TRUE if has b
1b30: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a  een written to j
1b40: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 69  ournal */.  u8 i
1b50: 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20  nStmt;          
1b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52             /* TR
1b70: 55 45 20 69 66 20 69 6e 20 74 68 65 20 73 74 61  UE if in the sta
1b80: 74 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61  tement subjourna
1b90: 6c 20 2a 2f 0a 20 20 75 38 20 64 69 72 74 79 3b  l */.  u8 dirty;
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
1bc0: 20 77 65 20 6e 65 65 64 20 74 6f 20 77 72 69 74   we need to writ
1bd0: 65 20 62 61 63 6b 20 63 68 61 6e 67 65 73 20 2a  e back changes *
1be0: 2f 0a 20 20 75 38 20 6e 65 65 64 53 79 6e 63 3b  /.  u8 needSync;
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c00: 20 20 20 2f 2a 20 53 79 6e 63 20 6a 6f 75 72 6e     /* Sync journ
1c10: 61 6c 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e  al before writin
1c20: 67 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  g this page */. 
1c30: 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   u8 alwaysRollba
1c40: 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ck;             
1c50: 2f 2a 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f  /* Disable dont_
1c60: 72 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 74  rollback() for t
1c70: 68 69 73 20 70 61 67 65 20 2a 2f 0a 20 20 73 68  his page */.  sh
1c80: 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20 20  ort int nRef;   
1c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
1ca0: 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73 20  Number of users 
1cb0: 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a  of this page */.
1cc0: 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79 3b    PgHdr *pDirty;
1cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ce0: 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73 20   /* Dirty pages 
1cf0: 73 6f 72 74 65 64 20 62 79 20 50 67 48 64 72 2e  sorted by PgHdr.
1d00: 70 67 6e 6f 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  pgno */.  /* pPa
1d10: 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 20 62  ger->psAligned b
1d20: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
1d30: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
1d40: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
1d50: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
1d60: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
1d70: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
1d80: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
1d90: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
1da0: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
1db0: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
1dc0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
1dd0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
1de0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
1df0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
1e00: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
1e10: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
1e20: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
1e30: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
1e40: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
1e50: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
1e60: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
1e70: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
1e80: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
1e90: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1ea0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
1eb0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
1ec0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
1ed0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
1ee0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
1ef0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
1f00: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
1f10: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
1f20: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
1f30: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
1f40: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
1f50: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
1f60: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
1f70: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
1f80: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
1f90: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
1fa0: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
1fb0: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
1fc0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1fd0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
1fe0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
1ff0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2000: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2010: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2020: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2030: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2040: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2050: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2060: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2070: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2080: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2090: 65 6e 74 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ent */.};../*.**
20a0: 20 41 20 6d 61 63 72 6f 20 75 73 65 64 20 66 6f   A macro used fo
20b0: 72 20 69 6e 76 6f 6b 69 6e 67 20 74 68 65 20 63  r invoking the c
20c0: 6f 64 65 63 20 69 66 20 74 68 65 72 65 20 69 73  odec if there is
20d0: 20 6f 6e 65 0a 2a 2f 0a 23 69 66 64 65 66 20 53   one.*/.#ifdef S
20e0: 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
20f0: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2100: 2c 44 2c 4e 2c 58 29 20 69 66 28 20 50 2d 3e 78  ,D,N,X) if( P->x
2110: 43 6f 64 65 63 20 29 7b 20 50 2d 3e 78 43 6f 64  Codec ){ P->xCod
2120: 65 63 28 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c  ec(P->pCodecArg,
2130: 44 2c 4e 2c 58 29 3b 20 7d 0a 23 65 6c 73 65 0a  D,N,X); }.#else.
2140: 23 20 64 65 66 69 6e 65 20 43 4f 44 45 43 28 50  # define CODEC(P
2150: 2c 44 2c 4e 2c 58 29 0a 23 65 6e 64 69 66 0a 0a  ,D,N,X).#endif..
2160: 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
2170: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48  pointer to a PgH
2180: 64 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65  dr into a pointe
2190: 72 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a  r to its data.**
21a0: 20 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e   and back again.
21b0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44  .*/.#define PGHD
21c0: 52 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28  R_TO_DATA(P)  ((
21d0: 76 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29  void*)(&(P)[1]))
21e0: 0a 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f  .#define DATA_TO
21f0: 5f 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50  _PGHDR(D)  (&((P
2200: 67 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a  gHdr*)(D))[-1]).
2210: 23 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f  #define PGHDR_TO
2220: 5f 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f  _EXTRA(G,P) ((vo
2230: 69 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28  id*)&((char*)(&(
2240: 47 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 73 41  G)[1]))[(P)->psA
2250: 6c 69 67 6e 65 64 5d 29 0a 23 64 65 66 69 6e 65  ligned]).#define
2260: 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50   PGHDR_TO_HIST(P
2270: 2c 50 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20  ,PGR)  \.       
2280: 20 20 20 20 20 28 28 50 67 48 69 73 74 6f 72 79       ((PgHistory
2290: 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 50 29  *)&((char*)(&(P)
22a0: 5b 31 5d 29 29 5b 28 50 47 52 29 2d 3e 70 73 41  [1]))[(PGR)->psA
22b0: 6c 69 67 6e 65 64 2b 28 50 47 52 29 2d 3e 6e 45  ligned+(PGR)->nE
22c0: 78 74 72 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 48 6f  xtra])../*.** Ho
22d0: 77 20 62 69 67 20 74 6f 20 6d 61 6b 65 20 74 68  w big to make th
22e0: 65 20 68 61 73 68 20 74 61 62 6c 65 20 75 73 65  e hash table use
22f0: 64 20 66 6f 72 20 6c 6f 63 61 74 69 6e 67 20 69  d for locating i
2300: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 0a 2a  n-memory pages.*
2310: 2a 20 62 79 20 70 61 67 65 20 6e 75 6d 62 65 72  * by page number
2320: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4e 5f 50  ..*/.#define N_P
2330: 47 5f 48 41 53 48 20 32 30 34 38 0a 0a 2f 2a 0a  G_HASH 2048../*.
2340: 2a 2a 20 48 61 73 68 20 61 20 70 61 67 65 20 6e  ** Hash a page n
2350: 75 6d 62 65 72 0a 2a 2f 0a 23 64 65 66 69 6e 65  umber.*/.#define
2360: 20 70 61 67 65 72 5f 68 61 73 68 28 50 4e 29 20   pager_hash(PN) 
2370: 20 28 28 50 4e 29 26 28 4e 5f 50 47 5f 48 41 53   ((PN)&(N_PG_HAS
2380: 48 2d 31 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f  H-1))../*.** A o
2390: 70 65 6e 20 70 61 67 65 20 63 61 63 68 65 20 69  pen page cache i
23a0: 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66  s an instance of
23b0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
23c0: 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 73 74 72  tructure..*/.str
23d0: 75 63 74 20 50 61 67 65 72 20 7b 0a 20 20 63 68  uct Pager {.  ch
23e0: 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 3b 20 20  ar *zFilename;  
23f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d            /* Nam
2400: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2410: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72  e file */.  char
2420: 20 2a 7a 4a 6f 75 72 6e 61 6c 3b 20 20 20 20 20   *zJournal;     
2430: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
2440: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
2450: 69 6c 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ile */.  char *z
2460: 44 69 72 65 63 74 6f 72 79 3b 20 20 20 20 20 20  Directory;      
2470: 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
2480: 79 20 68 6f 6c 64 20 64 61 74 61 62 61 73 65 20  y hold database 
2490: 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  and journal file
24a0: 73 20 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 66 64  s */.  OsFile fd
24b0: 2c 20 6a 66 64 3b 20 20 20 20 20 20 20 20 20 20  , jfd;          
24c0: 20 20 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72     /* File descr
24d0: 69 70 74 6f 72 73 20 66 6f 72 20 64 61 74 61 62  iptors for datab
24e0: 61 73 65 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20  ase and journal 
24f0: 2a 2f 0a 20 20 4f 73 46 69 6c 65 20 73 74 66 64  */.  OsFile stfd
2500: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2510: 20 2f 2a 20 46 69 6c 65 20 64 65 73 63 72 69 70   /* File descrip
2520: 74 6f 72 20 66 6f 72 20 74 68 65 20 73 74 61 74  tor for the stat
2530: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
2540: 2a 2f 0a 20 20 69 6e 74 20 64 62 53 69 7a 65 3b  */.  int dbSize;
2550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2560: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61   /* Number of pa
2570: 67 65 73 20 69 6e 20 74 68 65 20 66 69 6c 65 20  ges in the file 
2580: 2a 2f 0a 20 20 69 6e 74 20 6f 72 69 67 44 62 53  */.  int origDbS
2590: 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ize;            
25a0: 20 2f 2a 20 64 62 53 69 7a 65 20 62 65 66 6f 72   /* dbSize befor
25b0: 65 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  e the current ch
25c0: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 73 74  ange */.  int st
25d0: 6d 74 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20  mtSize;         
25e0: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
25f0: 20 64 61 74 61 62 61 73 65 20 28 69 6e 20 70 61   database (in pa
2600: 67 65 73 29 20 61 74 20 73 74 6d 74 5f 62 65 67  ges) at stmt_beg
2610: 69 6e 28 29 20 2a 2f 0a 20 20 69 36 34 20 73 74  in() */.  i64 st
2620: 6d 74 4a 53 69 7a 65 3b 20 20 20 20 20 20 20 20  mtJSize;        
2630: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
2640: 20 6a 6f 75 72 6e 61 6c 20 61 74 20 73 74 6d 74   journal at stmt
2650: 5f 62 65 67 69 6e 28 29 20 2a 2f 0a 20 20 69 6e  _begin() */.  in
2660: 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20 20  t nRec;         
2670: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
2680: 62 65 72 20 6f 66 20 70 61 67 65 73 20 77 72 69  ber of pages wri
2690: 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72  tten to the jour
26a0: 6e 61 6c 20 2a 2f 0a 20 20 75 33 32 20 63 6b 73  nal */.  u32 cks
26b0: 75 6d 49 6e 69 74 3b 20 20 20 20 20 20 20 20 20  umInit;         
26c0: 20 20 20 20 20 2f 2a 20 51 75 61 73 69 2d 72 61       /* Quasi-ra
26d0: 6e 64 6f 6d 20 76 61 6c 75 65 20 61 64 64 65 64  ndom value added
26e0: 20 74 6f 20 65 76 65 72 79 20 63 68 65 63 6b 73   to every checks
26f0: 75 6d 20 2a 2f 0a 20 20 69 6e 74 20 73 74 6d 74  um */.  int stmt
2700: 4e 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20  NRec;           
2710: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
2720: 20 72 65 63 6f 72 64 73 20 69 6e 20 73 74 6d 74   records in stmt
2730: 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20   subjournal */. 
2740: 20 69 6e 74 20 6e 45 78 74 72 61 3b 20 20 20 20   int nExtra;    
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2760: 41 64 64 20 74 68 69 73 20 6d 61 6e 79 20 62 79  Add this many by
2770: 74 65 73 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d  tes to each in-m
2780: 65 6d 6f 72 79 20 70 61 67 65 20 2a 2f 0a 20 20  emory page */.  
2790: 76 6f 69 64 20 28 2a 78 44 65 73 74 72 75 63 74  void (*xDestruct
27a0: 6f 72 29 28 76 6f 69 64 2a 2c 69 6e 74 29 3b 20  or)(void*,int); 
27b0: 2f 2a 20 43 61 6c 6c 20 74 68 69 73 20 72 6f 75  /* Call this rou
27c0: 74 69 6e 65 20 77 68 65 6e 20 66 72 65 65 69 6e  tine when freein
27d0: 67 20 70 61 67 65 73 20 2a 2f 0a 20 20 76 6f 69  g pages */.  voi
27e0: 64 20 28 2a 78 52 65 69 6e 69 74 65 72 29 28 76  d (*xReiniter)(v
27f0: 6f 69 64 2a 2c 69 6e 74 29 3b 20 20 20 2f 2a 20  oid*,int);   /* 
2800: 43 61 6c 6c 20 74 68 69 73 20 72 6f 75 74 69 6e  Call this routin
2810: 65 20 77 68 65 6e 20 72 65 6c 6f 61 64 69 6e 67  e when reloading
2820: 20 70 61 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20   pages */.  int 
2830: 70 61 67 65 53 69 7a 65 3b 20 20 20 20 20 20 20  pageSize;       
2840: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2850: 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 61 20  r of bytes in a 
2860: 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 70 73  page */.  int ps
2870: 41 6c 69 67 6e 65 64 3b 20 20 20 20 20 20 20 20  Aligned;        
2880: 20 20 20 20 20 20 2f 2a 20 70 61 67 65 53 69 7a        /* pageSiz
2890: 65 20 72 6f 75 6e 64 65 64 20 75 70 20 74 6f 20  e rounded up to 
28a0: 61 20 6d 75 6c 74 69 70 6c 65 20 6f 66 20 38 20  a multiple of 8 
28b0: 2a 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20  */.  int nPage; 
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28d0: 20 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72   /* Total number
28e0: 20 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61   of in-memory pa
28f0: 67 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65  ges */.  int nRe
2900: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
2910: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2920: 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  f in-memory page
2930: 73 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65  s with PgHdr.nRe
2940: 66 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50  f>0 */.  int mxP
2950: 61 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  age;            
2960: 20 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20       /* Maximum 
2970: 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20  number of pages 
2980: 74 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65  to hold in cache
2990: 20 2a 2f 0a 20 20 69 6e 74 20 6e 48 69 74 2c 20   */.  int nHit, 
29a0: 6e 4d 69 73 73 2c 20 6e 4f 76 66 6c 3b 20 20 20  nMiss, nOvfl;   
29b0: 20 20 2f 2a 20 43 61 63 68 65 20 68 69 74 73 2c    /* Cache hits,
29c0: 20 6d 69 73 73 69 6e 67 2c 20 61 6e 64 20 4c 52   missing, and LR
29d0: 55 20 6f 76 65 72 66 6c 6f 77 73 20 2a 2f 0a 20  U overflows */. 
29e0: 20 69 6e 74 20 6e 52 65 61 64 2c 6e 57 72 69 74   int nRead,nWrit
29f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
2a00: 44 61 74 61 62 61 73 65 20 70 61 67 65 73 20 72  Database pages r
2a10: 65 61 64 2f 77 72 69 74 74 65 6e 20 2a 2f 0a 20  ead/written */. 
2a20: 20 76 6f 69 64 20 28 2a 78 43 6f 64 65 63 29 28   void (*xCodec)(
2a30: 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c 50 67 6e 6f  void*,void*,Pgno
2a40: 2c 69 6e 74 29 3b 20 2f 2a 20 52 6f 75 74 69 6e  ,int); /* Routin
2a50: 65 20 66 6f 72 20 65 6e 2f 64 65 63 6f 64 69 6e  e for en/decodin
2a60: 67 20 64 61 74 61 20 2a 2f 0a 20 20 76 6f 69 64  g data */.  void
2a70: 20 2a 70 43 6f 64 65 63 41 72 67 3b 20 20 20 20   *pCodecArg;    
2a80: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
2a90: 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 78 43 6f   argument to xCo
2aa0: 64 65 63 28 29 20 2a 2f 0a 20 20 75 38 20 6a 6f  dec() */.  u8 jo
2ab0: 75 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20  urnalOpen;      
2ac0: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
2ad0: 66 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64  f journal file d
2ae0: 65 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61  escriptors is va
2af0: 6c 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72  lid */.  u8 jour
2b00: 6e 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20  nalStarted;     
2b10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2b20: 68 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61  header of journa
2b30: 6c 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20  l is synced */. 
2b40: 20 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20   u8 useJournal; 
2b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2b60: 55 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a  Use a rollback j
2b70: 6f 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66  ournal on this f
2b80: 69 6c 65 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ile */.  u8 stmt
2b90: 4f 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20  Open;           
2ba0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2bb0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
2bc0: 62 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e  bjournal is open
2bd0: 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74 49 6e 55   */.  u8 stmtInU
2be0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
2bf0: 20 20 2f 2a 20 54 72 75 65 20 77 65 20 61 72 65    /* True we are
2c00: 20 69 6e 20 61 20 73 74 61 74 65 6d 65 6e 74 20   in a statement 
2c10: 73 75 62 74 72 61 6e 73 61 63 74 69 6f 6e 20 2a  subtransaction *
2c20: 2f 0a 20 20 75 38 20 73 74 6d 74 41 75 74 6f 6f  /.  u8 stmtAutoo
2c30: 70 65 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  pen;            
2c40: 2f 2a 20 4f 70 65 6e 20 73 74 6d 74 20 6a 6f 75  /* Open stmt jou
2c50: 72 6e 61 6c 20 77 68 65 6e 20 6d 61 69 6e 20 6a  rnal when main j
2c60: 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65 6e 65 64  ournal is opened
2c70: 2a 2f 0a 20 20 75 38 20 6e 6f 53 79 6e 63 3b 20  */.  u8 noSync; 
2c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c90: 20 2f 2a 20 44 6f 20 6e 6f 74 20 73 79 6e 63 20   /* Do not sync 
2ca0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 66 20 74  the journal if t
2cb0: 72 75 65 20 2a 2f 0a 20 20 75 38 20 66 75 6c 6c  rue */.  u8 full
2cc0: 53 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20  Sync;           
2cd0: 20 20 20 20 20 2f 2a 20 44 6f 20 65 78 74 72 61       /* Do extra
2ce0: 20 73 79 6e 63 73 20 6f 66 20 74 68 65 20 6a 6f   syncs of the jo
2cf0: 75 72 6e 61 6c 20 66 6f 72 20 72 6f 62 75 73 74  urnal for robust
2d00: 6e 65 73 73 20 2a 2f 0a 20 20 75 38 20 73 74 61  ness */.  u8 sta
2d10: 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  te;             
2d20: 20 20 20 20 20 20 2f 2a 20 50 41 47 45 52 5f 55        /* PAGER_U
2d30: 4e 4c 4f 43 4b 2c 20 5f 53 48 41 52 45 44 2c 20  NLOCK, _SHARED, 
2d40: 5f 52 45 53 45 52 56 45 44 2c 20 65 74 63 2e 20  _RESERVED, etc. 
2d50: 2a 2f 0a 20 20 75 38 20 65 72 72 4d 61 73 6b 3b  */.  u8 errMask;
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 2f 2a 20 4f 6e 65 20 6f 66 20 73 65 76 65 72   /* One of sever
2d80: 61 6c 20 6b 69 6e 64 73 20 6f 66 20 65 72 72 6f  al kinds of erro
2d90: 72 73 20 2a 2f 0a 20 20 75 38 20 74 65 6d 70 46  rs */.  u8 tempF
2da0: 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ile;            
2db0: 20 20 20 20 2f 2a 20 7a 46 69 6c 65 6e 61 6d 65      /* zFilename
2dc0: 20 69 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20   is a temporary 
2dd0: 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 72 65 61  file */.  u8 rea
2de0: 64 4f 6e 6c 79 3b 20 20 20 20 20 20 20 20 20 20  dOnly;          
2df0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 66 6f        /* True fo
2e00: 72 20 61 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61  r a read-only da
2e10: 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38 20 6e  tabase */.  u8 n
2e20: 65 65 64 53 79 6e 63 3b 20 20 20 20 20 20 20 20  eedSync;        
2e30: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e40: 69 66 20 61 6e 20 66 73 79 6e 63 28 29 20 69 73  if an fsync() is
2e50: 20 6e 65 65 64 65 64 20 6f 6e 20 74 68 65 20 6a   needed on the j
2e60: 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64  ournal */.  u8 d
2e70: 69 72 74 79 43 61 63 68 65 3b 20 20 20 20 20 20  irtyCache;      
2e80: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2e90: 69 66 20 63 61 63 68 65 64 20 70 61 67 65 73 20  if cached pages 
2ea0: 68 61 76 65 20 63 68 61 6e 67 65 64 20 2a 2f 0a  have changed */.
2eb0: 20 20 75 38 20 61 6c 77 61 79 73 52 6f 6c 6c 62    u8 alwaysRollb
2ec0: 61 63 6b 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ack;          /*
2ed0: 20 44 69 73 61 62 6c 65 20 64 6f 6e 74 5f 72 6f   Disable dont_ro
2ee0: 6c 6c 62 61 63 6b 28 29 20 66 6f 72 20 61 6c 6c  llback() for all
2ef0: 20 70 61 67 65 73 20 2a 2f 0a 20 20 75 38 20 6d   pages */.  u8 m
2f00: 65 6d 44 62 3b 20 20 20 20 20 20 20 20 20 20 20  emDb;           
2f10: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
2f20: 74 6f 20 69 6e 68 69 62 69 74 20 61 6c 6c 20 66  to inhibit all f
2f30: 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20 20 75 38 20  ile I/O */.  u8 
2f40: 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20 20  *aInJournal;    
2f50: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
2f60: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
2f70: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
2f80: 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20 2a  e file */.  u8 *
2f90: 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20 20  aInStmt;        
2fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 62          /* One b
2fb0: 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67 65  it for each page
2fc0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
2fd0: 20 2a 2f 0a 20 20 75 38 20 73 65 74 4d 61 73 74   */.  u8 setMast
2fe0: 65 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  er;             
2ff0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 61 20 6d    /* True if a m
3000: 2d 6a 20 6e 61 6d 65 20 68 61 73 20 62 65 65 6e  -j name has been
3010: 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 72 6e 6c   written to jrnl
3020: 20 2a 2f 0a 20 20 42 75 73 79 48 61 6e 64 6c 65   */.  BusyHandle
3030: 72 20 2a 70 42 75 73 79 48 61 6e 64 6c 65 72 3b  r *pBusyHandler;
3040: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
3050: 73 71 6c 69 74 65 2e 62 75 73 79 48 61 6e 64 6c  sqlite.busyHandl
3060: 65 72 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  er */.  PgHdr *p
3070: 46 69 72 73 74 2c 20 2a 70 4c 61 73 74 3b 20 20  First, *pLast;  
3080: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
3090: 72 65 65 20 70 61 67 65 73 20 2a 2f 0a 20 20 50  ree pages */.  P
30a0: 67 48 64 72 20 2a 70 46 69 72 73 74 53 79 6e 63  gHdr *pFirstSync
30b0: 65 64 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ed;        /* Fi
30c0: 72 73 74 20 66 72 65 65 20 70 61 67 65 20 77 69  rst free page wi
30d0: 74 68 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e  th PgHdr.needSyn
30e0: 63 3d 3d 30 20 2a 2f 0a 20 20 50 67 48 64 72 20  c==0 */.  PgHdr 
30f0: 2a 70 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20  *pAll;          
3100: 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66        /* List of
3110: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3120: 50 67 48 64 72 20 2a 70 53 74 6d 74 3b 20 20 20  PgHdr *pStmt;   
3130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
3140: 69 73 74 20 6f 66 20 70 61 67 65 73 20 69 6e 20  ist of pages in 
3150: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73 75  the statement su
3160: 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 36  bjournal */.  i6
3170: 34 20 6a 6f 75 72 6e 61 6c 4f 66 66 3b 20 20 20  4 journalOff;   
3180: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72            /* Cur
3190: 72 65 6e 74 20 62 79 74 65 20 6f 66 66 73 65 74  rent byte offset
31a0: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
31b0: 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34 20 6a 6f  file */.  i64 jo
31c0: 75 72 6e 61 6c 48 64 72 3b 20 20 20 20 20 20 20  urnalHdr;       
31d0: 20 20 20 20 20 20 2f 2a 20 42 79 74 65 20 6f 66        /* Byte of
31e0: 66 73 65 74 20 74 6f 20 70 72 65 76 69 6f 75 73  fset to previous
31f0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
3200: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 48 64 72  */.  i64 stmtHdr
3210: 4f 66 66 3b 20 20 20 20 20 20 20 20 20 20 20 20  Off;            
3220: 20 2f 2a 20 46 69 72 73 74 20 6a 6f 75 72 6e 61   /* First journa
3230: 6c 20 68 65 61 64 65 72 20 77 72 69 74 74 65 6e  l header written
3240: 20 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20   this statement 
3250: 2a 2f 0a 20 20 69 36 34 20 73 74 6d 74 43 6b 73  */.  i64 stmtCks
3260: 75 6d 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  um;             
3270: 20 2f 2a 20 63 6b 73 75 6d 49 6e 69 74 20 77 68   /* cksumInit wh
3280: 65 6e 20 73 74 61 74 65 6d 65 6e 74 20 77 61 73  en statement was
3290: 20 73 74 61 72 74 65 64 20 2a 2f 0a 20 20 69 6e   started */.  in
32a0: 74 20 73 65 63 74 6f 72 53 69 7a 65 3b 20 20 20  t sectorSize;   
32b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 73 73            /* Ass
32c0: 75 6d 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65  umed sector size
32d0: 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61 63 6b   during rollback
32e0: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 61 48 61   */.  PgHdr *aHa
32f0: 73 68 5b 4e 5f 50 47 5f 48 41 53 48 5d 3b 20 20  sh[N_PG_HASH];  
3300: 20 20 2f 2a 20 48 61 73 68 20 74 61 62 6c 65 20    /* Hash table 
3310: 74 6f 20 6d 61 70 20 70 61 67 65 20 6e 75 6d 62  to map page numb
3320: 65 72 20 74 6f 20 50 67 48 64 72 20 2a 2f 0a 7d  er to PgHdr */.}
3330: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
3340: 72 65 20 62 69 74 73 20 74 68 61 74 20 63 61 6e  re bits that can
3350: 20 62 65 20 73 65 74 20 69 6e 20 50 61 67 65 72   be set in Pager
3360: 2e 65 72 72 4d 61 73 6b 2e 0a 2a 2f 0a 23 64 65  .errMask..*/.#de
3370: 66 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 46  fine PAGER_ERR_F
3380: 55 4c 4c 20 20 20 20 20 30 78 30 31 20 20 2f 2a  ULL     0x01  /*
3390: 20 61 20 77 72 69 74 65 28 29 20 66 61 69 6c 65   a write() faile
33a0: 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  d */.#define PAG
33b0: 45 52 5f 45 52 52 5f 4d 45 4d 20 20 20 20 20 20  ER_ERR_MEM      
33c0: 30 78 30 32 20 20 2f 2a 20 6d 61 6c 6c 6f 63 28  0x02  /* malloc(
33d0: 29 20 66 61 69 6c 65 64 20 2a 2f 0a 23 64 65 66  ) failed */.#def
33e0: 69 6e 65 20 50 41 47 45 52 5f 45 52 52 5f 4c 4f  ine PAGER_ERR_LO
33f0: 43 4b 20 20 20 20 20 30 78 30 34 20 20 2f 2a 20  CK     0x04  /* 
3400: 65 72 72 6f 72 20 69 6e 20 74 68 65 20 6c 6f 63  error in the loc
3410: 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 2a 2f  king protocol */
3420: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 45  .#define PAGER_E
3430: 52 52 5f 43 4f 52 52 55 50 54 20 20 30 78 30 38  RR_CORRUPT  0x08
3440: 20 20 2f 2a 20 64 61 74 61 62 61 73 65 20 6f 72    /* database or
3450: 20 6a 6f 75 72 6e 61 6c 20 63 6f 72 72 75 70 74   journal corrupt
3460: 69 6f 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  ion */.#define P
3470: 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 20 20  AGER_ERR_DISK   
3480: 20 20 30 78 31 30 20 20 2f 2a 20 67 65 6e 65 72    0x10  /* gener
3490: 61 6c 20 64 69 73 6b 20 49 2f 4f 20 65 72 72 6f  al disk I/O erro
34a0: 72 20 2d 20 62 61 64 20 68 61 72 64 20 64 72 69  r - bad hard dri
34b0: 76 65 3f 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4a 6f  ve? */../*.** Jo
34c0: 75 72 6e 61 6c 20 66 69 6c 65 73 20 62 65 67 69  urnal files begi
34d0: 6e 20 77 69 74 68 20 74 68 65 20 66 6f 6c 6c 6f  n with the follo
34e0: 77 69 6e 67 20 6d 61 67 69 63 20 73 74 72 69 6e  wing magic strin
34f0: 67 2e 20 20 54 68 65 20 64 61 74 61 0a 2a 2a 20  g.  The data.** 
3500: 77 61 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  was obtained fro
3510: 6d 20 2f 64 65 76 2f 72 61 6e 64 6f 6d 2e 20 20  m /dev/random.  
3520: 49 74 20 69 73 20 75 73 65 64 20 6f 6e 6c 79 20  It is used only 
3530: 61 73 20 61 20 73 61 6e 69 74 79 20 63 68 65 63  as a sanity chec
3540: 6b 2e 0a 2a 2a 0a 2a 2a 20 53 69 6e 63 65 20 76  k..**.** Since v
3550: 65 72 73 69 6f 6e 20 32 2e 38 2e 30 2c 20 74 68  ersion 2.8.0, th
3560: 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74  e journal format
3570: 20 63 6f 6e 74 61 69 6e 73 20 61 64 64 69 74 69   contains additi
3580: 6f 6e 61 6c 20 73 61 6e 69 74 79 0a 2a 2a 20 63  onal sanity.** c
3590: 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61 74  hecking informat
35a0: 69 6f 6e 2e 20 20 49 66 20 74 68 65 20 70 6f 77  ion.  If the pow
35b0: 65 72 20 66 61 69 6c 73 20 77 68 69 6c 65 20 74  er fails while t
35c0: 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 62 65  he journal is be
35d0: 67 69 6e 0a 2a 2a 20 77 72 69 74 74 65 6e 2c 20  gin.** written, 
35e0: 73 65 6d 69 2d 72 61 6e 64 6f 6d 20 67 61 72 62  semi-random garb
35f0: 61 67 65 20 64 61 74 61 20 6d 69 67 68 74 20 61  age data might a
3600: 70 70 65 61 72 20 69 6e 20 74 68 65 20 6a 6f 75  ppear in the jou
3610: 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65 20 61 66 74  rnal.** file aft
3620: 65 72 20 70 6f 77 65 72 20 69 73 20 72 65 73 74  er power is rest
3630: 6f 72 65 64 2e 20 20 49 66 20 61 6e 20 61 74 74  ored.  If an att
3640: 65 6d 70 74 20 69 73 20 74 68 65 6e 20 6d 61 64  empt is then mad
3650: 65 0a 2a 2a 20 74 6f 20 72 6f 6c 6c 20 74 68 65  e.** to roll the
3660: 20 6a 6f 75 72 6e 61 6c 20 62 61 63 6b 2c 20 74   journal back, t
3670: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 75 6c  he database coul
3680: 64 20 62 65 20 63 6f 72 72 75 70 74 65 64 2e 20  d be corrupted. 
3690: 20 54 68 65 20 61 64 64 69 74 69 6f 6e 61 6c 0a   The additional.
36a0: 2a 2a 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69  ** sanity checki
36b0: 6e 67 20 64 61 74 61 20 69 73 20 61 6e 20 61 74  ng data is an at
36c0: 74 65 6d 70 74 20 74 6f 20 64 69 73 63 6f 76 65  tempt to discove
36d0: 72 20 74 68 65 20 67 61 72 62 61 67 65 20 69 6e  r the garbage in
36e0: 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20   the.** journal 
36f0: 61 6e 64 20 69 67 6e 6f 72 65 20 69 74 2e 0a 2a  and ignore it..*
3700: 2a 0a 2a 2a 20 54 68 65 20 73 61 6e 69 74 79 20  *.** The sanity 
3710: 63 68 65 63 6b 69 6e 67 20 69 6e 66 6f 72 6d 61  checking informa
3720: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 6e 65 77  tion for the new
3730: 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 20   journal format 
3740: 63 6f 6e 73 69 73 74 73 0a 2a 2a 20 6f 66 20 61  consists.** of a
3750: 20 33 32 2d 62 69 74 20 63 68 65 63 6b 73 75 6d   32-bit checksum
3760: 20 6f 6e 20 65 61 63 68 20 70 61 67 65 20 6f 66   on each page of
3770: 20 64 61 74 61 2e 20 20 54 68 65 20 63 68 65 63   data.  The chec
3780: 6b 73 75 6d 20 63 6f 76 65 72 73 20 62 6f 74 68  ksum covers both
3790: 0a 2a 2a 20 74 68 65 20 70 61 67 65 20 6e 75 6d  .** the page num
37a0: 62 65 72 20 61 6e 64 20 74 68 65 20 70 50 61 67  ber and the pPag
37b0: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74  er->pageSize byt
37c0: 65 73 20 6f 66 20 64 61 74 61 20 66 6f 72 20 74  es of data for t
37d0: 68 65 20 70 61 67 65 2e 0a 2a 2a 20 54 68 69 73  he page..** This
37e0: 20 63 6b 73 75 6d 20 69 73 20 69 6e 69 74 69 61   cksum is initia
37f0: 6c 69 7a 65 64 20 74 6f 20 61 20 33 32 2d 62 69  lized to a 32-bi
3800: 74 20 72 61 6e 64 6f 6d 20 76 61 6c 75 65 20 74  t random value t
3810: 68 61 74 20 61 70 70 65 61 72 73 20 69 6e 20 74  hat appears in t
3820: 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69  he.** journal fi
3830: 6c 65 20 72 69 67 68 74 20 61 66 74 65 72 20 74  le right after t
3840: 68 65 20 68 65 61 64 65 72 2e 20 20 54 68 65 20  he header.  The 
3850: 72 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  random initializ
3860: 65 72 20 69 73 20 69 6d 70 6f 72 74 61 6e 74 2c  er is important,
3870: 0a 2a 2a 20 62 65 63 61 75 73 65 20 67 61 72 62  .** because garb
3880: 61 67 65 20 64 61 74 61 20 74 68 61 74 20 61 70  age data that ap
3890: 70 65 61 72 73 20 61 74 20 74 68 65 20 65 6e 64  pears at the end
38a0: 20 6f 66 20 61 20 6a 6f 75 72 6e 61 6c 20 69 73   of a journal is
38b0: 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20   likely.** data 
38c0: 74 68 61 74 20 77 61 73 20 6f 6e 63 65 20 69 6e  that was once in
38d0: 20 6f 74 68 65 72 20 66 69 6c 65 73 20 74 68 61   other files tha
38e0: 74 20 68 61 76 65 20 6e 6f 77 20 62 65 65 6e 20  t have now been 
38f0: 64 65 6c 65 74 65 64 2e 20 20 49 66 20 74 68 65  deleted.  If the
3900: 0a 2a 2a 20 67 61 72 62 61 67 65 20 64 61 74 61  .** garbage data
3910: 20 63 61 6d 65 20 66 72 6f 6d 20 61 6e 20 6f 62   came from an ob
3920: 73 6f 6c 65 74 65 20 6a 6f 75 72 6e 61 6c 20 66  solete journal f
3930: 69 6c 65 2c 20 74 68 65 20 63 68 65 63 6b 73 75  ile, the checksu
3940: 6d 73 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 63  ms might.** be c
3950: 6f 72 72 65 63 74 2e 20 20 42 75 74 20 62 79 20  orrect.  But by 
3960: 69 6e 69 74 69 61 6c 69 7a 69 6e 67 20 74 68 65  initializing the
3970: 20 63 68 65 63 6b 73 75 6d 20 74 6f 20 72 61 6e   checksum to ran
3980: 64 6f 6d 20 76 61 6c 75 65 20 77 68 69 63 68 0a  dom value which.
3990: 2a 2a 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  ** is different 
39a0: 66 6f 72 20 65 76 65 72 79 20 6a 6f 75 72 6e 61  for every journa
39b0: 6c 2c 20 77 65 20 6d 69 6e 69 6d 69 7a 65 20 74  l, we minimize t
39c0: 68 61 74 20 72 69 73 6b 2e 0a 2a 2f 0a 73 74 61  hat risk..*/.sta
39d0: 74 69 63 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  tic const unsign
39e0: 65 64 20 63 68 61 72 20 61 4a 6f 75 72 6e 61 6c  ed char aJournal
39f0: 4d 61 67 69 63 5b 5d 20 3d 20 7b 0a 20 20 30 78  Magic[] = {.  0x
3a00: 64 39 2c 20 30 78 64 35 2c 20 30 78 30 35 2c 20  d9, 0xd5, 0x05, 
3a10: 30 78 66 39 2c 20 30 78 32 30 2c 20 30 78 61 31  0xf9, 0x20, 0xa1
3a20: 2c 20 30 78 36 33 2c 20 30 78 64 37 2c 0a 7d 3b  , 0x63, 0xd7,.};
3a30: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 69 7a 65  ../*.** The size
3a40: 20 6f 66 20 74 68 65 20 68 65 61 64 65 72 20 61   of the header a
3a50: 6e 64 20 6f 66 20 65 61 63 68 20 70 61 67 65 20  nd of each page 
3a60: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69  in the journal i
3a70: 73 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a 2a 20  s determined.** 
3a80: 62 79 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  by the following
3a90: 20 6d 61 63 72 6f 73 2e 0a 2a 2f 0a 23 64 65 66   macros..*/.#def
3aa0: 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 50 47 5f 53  ine JOURNAL_PG_S
3ab0: 5a 28 70 50 61 67 65 72 29 20 20 28 28 70 50 61  Z(pPager)  ((pPa
3ac0: 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 20 2b  ger->pageSize) +
3ad0: 20 38 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a   8)../*.** The j
3ae0: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 69  ournal header si
3af0: 7a 65 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  ze for this page
3b00: 72 2e 20 49 6e 20 74 68 65 20 66 75 74 75 72 65  r. In the future
3b10: 2c 20 74 68 69 73 20 63 6f 75 6c 64 20 62 65 0a  , this could be.
3b20: 2a 2a 20 73 65 74 20 74 6f 20 73 6f 6d 65 20 76  ** set to some v
3b30: 61 6c 75 65 20 72 65 61 64 20 66 72 6f 6d 20 74  alue read from t
3b40: 68 65 20 64 69 73 6b 20 63 6f 6e 74 72 6f 6c 6c  he disk controll
3b50: 65 72 2e 20 54 68 65 20 69 6d 70 6f 72 74 61 6e  er. The importan
3b60: 74 0a 2a 2a 20 63 68 61 72 61 63 74 65 72 69 73  t.** characteris
3b70: 74 69 63 20 69 73 20 74 68 61 74 20 69 74 20 69  tic is that it i
3b80: 73 20 74 68 65 20 73 61 6d 65 20 73 69 7a 65 20  s the same size 
3b90: 61 73 20 61 20 64 69 73 6b 20 73 65 63 74 6f 72  as a disk sector
3ba0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
3bb0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
3bc0: 65 72 29 20 28 70 50 61 67 65 72 2d 3e 73 65 63  er) (pPager->sec
3bd0: 74 6f 72 53 69 7a 65 29 0a 0a 2f 2a 0a 2a 2a 20  torSize)../*.** 
3be0: 54 68 65 20 6d 61 63 72 6f 20 4d 45 4d 44 42 20  The macro MEMDB 
3bf0: 69 73 20 74 72 75 65 20 69 66 20 77 65 20 61 72  is true if we ar
3c00: 65 20 64 65 61 6c 69 6e 67 20 77 69 74 68 20 61  e dealing with a
3c10: 6e 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  n in-memory data
3c20: 62 61 73 65 2e 0a 2a 2a 20 57 65 20 64 6f 20 74  base..** We do t
3c30: 68 69 73 20 61 73 20 61 20 6d 61 63 72 6f 20 73  his as a macro s
3c40: 6f 20 74 68 61 74 20 69 66 20 74 68 65 20 53 51  o that if the SQ
3c50: 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59  LITE_OMIT_MEMORY
3c60: 44 42 20 6d 61 63 72 6f 20 69 73 20 73 65 74 2c  DB macro is set,
3c70: 0a 2a 2a 20 74 68 65 20 76 61 6c 75 65 20 6f 66  .** the value of
3c80: 20 4d 45 4d 44 42 20 77 69 6c 6c 20 62 65 20 61   MEMDB will be a
3c90: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 74 68   constant and th
3ca0: 65 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20  e compiler will 
3cb0: 6f 70 74 69 6d 69 7a 65 0a 2a 2a 20 6f 75 74 20  optimize.** out 
3cc0: 63 6f 64 65 20 74 68 61 74 20 77 6f 75 6c 64 20  code that would 
3cd0: 6e 65 76 65 72 20 65 78 65 63 75 74 65 2e 0a 2a  never execute..*
3ce0: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
3cf0: 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 23 20  OMIT_MEMORYDB.# 
3d00: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 30 0a 23  define MEMDB 0.#
3d10: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 4d 45  else.# define ME
3d20: 4d 44 42 20 70 50 61 67 65 72 2d 3e 6d 65 6d 44  MDB pPager->memD
3d30: 62 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  b.#endif../*.** 
3d40: 54 68 65 20 64 65 66 61 75 6c 74 20 73 69 7a 65  The default size
3d50: 20 6f 66 20 61 20 64 69 73 6b 20 73 65 63 74 6f   of a disk secto
3d60: 72 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41 47  r.*/.#define PAG
3d70: 45 52 5f 53 45 43 54 4f 52 5f 53 49 5a 45 20 35  ER_SECTOR_SIZE 5
3d80: 31 32 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e  12../*.** Page n
3d90: 75 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50  umber PAGER_MJ_P
3da0: 47 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65  GNO is never use
3db0: 64 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64  d in an SQLite d
3dc0: 61 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a  atabase (it is.*
3dd0: 2a 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77  * reserved for w
3de0: 6f 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20  orking around a 
3df0: 77 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e  windows/posix in
3e00: 63 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20  compatibility). 
3e10: 49 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e  It is.** used in
3e20: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
3e30: 73 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65  signify that the
3e40: 20 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68   remainder of th
3e50: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a  e journal file .
3e60: 2a 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f  ** is devoted to
3e70: 20 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65   storing a maste
3e80: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d  r journal name -
3e90: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f   there are no mo
3ea0: 72 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72  re pages to.** r
3eb0: 6f 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f  oll back. See co
3ec0: 6d 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74  mments for funct
3ed0: 69 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a  ion writeMasterJ
3ee0: 6f 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74  ournal() for det
3ef0: 61 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66  ails..*/./* #def
3f00: 69 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  ine PAGER_MJ_PGN
3f10: 4f 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59  O(x) (PENDING_BY
3f20: 54 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a  TE/((x)->pageSiz
3f30: 65 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50  e)) */.#define P
3f40: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20  AGER_MJ_PGNO(x) 
3f50: 28 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28  ((PENDING_BYTE/(
3f60: 28 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b  (x)->pageSize))+
3f70: 31 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61  1)../*.** The ma
3f80: 78 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65  ximum legal page
3f90: 20 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31   number is (2^31
3fa0: 20 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e   - 1)..*/.#defin
3fb0: 65 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f  e PAGER_MAX_PGNO
3fc0: 20 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a   2147483647../*.
3fd0: 2a 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65  ** Enable refere
3fe0: 6e 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69  nce count tracki
3ff0: 6e 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e  ng (for debuggin
4000: 67 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64  g) here:.*/.#ifd
4010: 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a  ef SQLITE_DEBUG.
4020: 20 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66    int pager3_ref
4030: 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b  info_enable = 0;
4040: 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70  .  static void p
4050: 61 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48  ager_refinfo(PgH
4060: 64 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74  dr *p){.    stat
4070: 69 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a  ic int cnt = 0;.
4080: 20 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f      if( !pager3_
4090: 72 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29  refinfo_enable )
40a0: 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c   return;.    sql
40b0: 69 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28  ite3DebugPrintf(
40c0: 0a 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a  .       "REFCNT:
40d0: 20 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65   %4d addr=%p nRe
40e0: 66 3d 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  f=%d\n",.       
40f0: 70 2d 3e 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54  p->pgno, PGHDR_T
4100: 4f 5f 44 41 54 41 28 70 29 2c 20 70 2d 3e 6e 52  O_DATA(p), p->nR
4110: 65 66 0a 20 20 20 20 29 3b 0a 20 20 20 20 63 6e  ef.    );.    cn
4120: 74 2b 2b 3b 20 20 20 2f 2a 20 53 6f 6d 65 74 68  t++;   /* Someth
4130: 69 6e 67 20 74 6f 20 73 65 74 20 61 20 62 72 65  ing to set a bre
4140: 61 6b 70 6f 69 6e 74 20 6f 6e 20 2a 2f 0a 20 20  akpoint on */.  
4150: 7d 0a 23 20 64 65 66 69 6e 65 20 52 45 46 49 4e  }.# define REFIN
4160: 46 4f 28 58 29 20 20 70 61 67 65 72 5f 72 65 66  FO(X)  pager_ref
4170: 69 6e 66 6f 28 58 29 0a 23 65 6c 73 65 0a 23 20  info(X).#else.# 
4180: 64 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58  define REFINFO(X
4190: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
41a0: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
41b0: 74 65 67 65 72 20 66 72 6f 6d 20 74 68 65 20 67  teger from the g
41c0: 69 76 65 6e 20 66 69 6c 65 20 64 65 73 63 72 69  iven file descri
41d0: 70 74 6f 72 2e 20 20 53 74 6f 72 65 20 74 68 65  ptor.  Store the
41e0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 74 68 61 74   integer.** that
41f0: 20 69 73 20 72 65 61 64 20 69 6e 20 2a 70 52 65   is read in *pRe
4200: 73 2e 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54  s.  Return SQLIT
4210: 45 5f 4f 4b 20 69 66 20 65 76 65 72 79 74 68 69  E_OK if everythi
4220: 6e 67 20 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e  ng worked, or an
4230: 0a 2a 2a 20 65 72 72 6f 72 20 63 6f 64 65 20 69  .** error code i
4240: 73 20 73 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73  s something goes
4250: 20 77 72 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c   wrong..**.** Al
4260: 6c 20 76 61 6c 75 65 73 20 61 72 65 20 73 74 6f  l values are sto
4270: 72 65 64 20 6f 6e 20 64 69 73 6b 20 61 73 20 62  red on disk as b
4280: 69 67 2d 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74  ig-endian..*/.st
4290: 61 74 69 63 20 69 6e 74 20 72 65 61 64 33 32 62  atic int read32b
42a0: 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20  its(OsFile *fd, 
42b0: 75 33 32 20 2a 70 52 65 73 29 7b 0a 20 20 75 33  u32 *pRes){.  u3
42c0: 32 20 72 65 73 3b 0a 20 20 69 6e 74 20 72 63 3b  2 res;.  int rc;
42d0: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
42e0: 73 52 65 61 64 28 66 64 2c 20 26 72 65 73 2c 20  sRead(fd, &res, 
42f0: 73 69 7a 65 6f 66 28 72 65 73 29 29 3b 0a 20 20  sizeof(res));.  
4300: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
4310: 4b 20 29 7b 0a 20 20 20 20 75 6e 73 69 67 6e 65  K ){.    unsigne
4320: 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a 20 20  d char ac[4];.  
4330: 20 20 6d 65 6d 63 70 79 28 61 63 2c 20 26 72 65    memcpy(ac, &re
4340: 73 2c 20 34 29 3b 0a 20 20 20 20 72 65 73 20 3d  s, 4);.    res =
4350: 20 28 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28   (ac[0]<<24) | (
4360: 61 63 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63  ac[1]<<16) | (ac
4370: 5b 32 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b  [2]<<8) | ac[3];
4380: 0a 20 20 7d 0a 20 20 2a 70 52 65 73 20 3d 20 72  .  }.  *pRes = r
4390: 65 73 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  es;.  return rc;
43a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20  .}../*.** Write 
43b0: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
43c0: 20 69 6e 74 6f 20 74 68 65 20 67 69 76 65 6e 20   into the given 
43d0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 2e  file descriptor.
43e0: 20 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    Return SQLITE_
43f0: 4f 4b 0a 2a 2a 20 6f 6e 20 73 75 63 63 65 73 73  OK.** on success
4400: 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 63 6f 64   or an error cod
4410: 65 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 67  e is something g
4420: 6f 65 73 20 77 72 6f 6e 67 2e 0a 2a 2f 0a 73 74  oes wrong..*/.st
4430: 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 33 32  atic int write32
4440: 62 69 74 73 28 4f 73 46 69 6c 65 20 2a 66 64 2c  bits(OsFile *fd,
4450: 20 75 33 32 20 76 61 6c 29 7b 0a 20 20 75 6e 73   u32 val){.  uns
4460: 69 67 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d  igned char ac[4]
4470: 3b 0a 20 20 61 63 5b 30 5d 20 3d 20 28 76 61 6c  ;.  ac[0] = (val
4480: 3e 3e 32 34 29 20 26 20 30 78 66 66 3b 0a 20 20  >>24) & 0xff;.  
4490: 61 63 5b 31 5d 20 3d 20 28 76 61 6c 3e 3e 31 36  ac[1] = (val>>16
44a0: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 32  ) & 0xff;.  ac[2
44b0: 5d 20 3d 20 28 76 61 6c 3e 3e 38 29 20 26 20 30  ] = (val>>8) & 0
44c0: 78 66 66 3b 0a 20 20 61 63 5b 33 5d 20 3d 20 76  xff;.  ac[3] = v
44d0: 61 6c 20 26 20 30 78 66 66 3b 0a 20 20 72 65 74  al & 0xff;.  ret
44e0: 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 57 72 69  urn sqlite3OsWri
44f0: 74 65 28 66 64 2c 20 61 63 2c 20 34 29 3b 0a 7d  te(fd, ac, 4);.}
4500: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
4510: 65 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  e 32-bit integer
4520: 20 27 76 61 6c 27 20 69 6e 74 6f 20 74 68 65 20   'val' into the 
4530: 70 61 67 65 20 69 64 65 6e 74 69 66 69 65 64 20  page identified 
4540: 62 79 20 70 61 67 65 20 68 65 61 64 65 72 0a 2a  by page header.*
4550: 2a 20 27 70 27 20 61 74 20 6f 66 66 73 65 74 20  * 'p' at offset 
4560: 27 6f 66 66 73 65 74 27 2e 0a 2a 2f 0a 73 74 61  'offset'..*/.sta
4570: 74 69 63 20 76 6f 69 64 20 73 74 6f 72 65 33 32  tic void store32
4580: 62 69 74 73 28 75 33 32 20 76 61 6c 2c 20 50 67  bits(u32 val, Pg
4590: 48 64 72 20 2a 70 2c 20 69 6e 74 20 6f 66 66 73  Hdr *p, int offs
45a0: 65 74 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  et){.  unsigned 
45b0: 63 68 61 72 20 2a 61 63 3b 0a 20 20 61 63 20 3d  char *ac;.  ac =
45c0: 20 26 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61   &((unsigned cha
45d0: 72 2a 29 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  r*)PGHDR_TO_DATA
45e0: 28 70 29 29 5b 6f 66 66 73 65 74 5d 3b 0a 20 20  (p))[offset];.  
45f0: 61 63 5b 30 5d 20 3d 20 28 76 61 6c 3e 3e 32 34  ac[0] = (val>>24
4600: 29 20 26 20 30 78 66 66 3b 0a 20 20 61 63 5b 31  ) & 0xff;.  ac[1
4610: 5d 20 3d 20 28 76 61 6c 3e 3e 31 36 29 20 26 20  ] = (val>>16) & 
4620: 30 78 66 66 3b 0a 20 20 61 63 5b 32 5d 20 3d 20  0xff;.  ac[2] = 
4630: 28 76 61 6c 3e 3e 38 29 20 26 20 30 78 66 66 3b  (val>>8) & 0xff;
4640: 0a 20 20 61 63 5b 33 5d 20 3d 20 76 61 6c 20 26  .  ac[3] = val &
4650: 20 30 78 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   0xff;.}../*.** 
4660: 52 65 61 64 20 61 20 33 32 2d 62 69 74 20 69 6e  Read a 32-bit in
4670: 74 65 67 65 72 20 61 74 20 6f 66 66 73 65 74 20  teger at offset 
4680: 27 6f 66 66 73 65 74 27 20 66 72 6f 6d 20 74 68  'offset' from th
4690: 65 20 70 61 67 65 20 69 64 65 6e 74 69 66 69 65  e page identifie
46a0: 64 20 62 79 0a 2a 2a 20 70 61 67 65 20 68 65 61  d by.** page hea
46b0: 64 65 72 20 27 70 27 2e 0a 2a 2f 0a 73 74 61 74  der 'p'..*/.stat
46c0: 69 63 20 75 33 32 20 72 65 74 72 69 65 76 65 33  ic u32 retrieve3
46d0: 32 62 69 74 73 28 50 67 48 64 72 20 2a 70 2c 20  2bits(PgHdr *p, 
46e0: 69 6e 74 20 6f 66 66 73 65 74 29 7b 0a 20 20 75  int offset){.  u
46f0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 63  nsigned char *ac
4700: 3b 0a 20 20 61 63 20 3d 20 26 28 28 75 6e 73 69  ;.  ac = &((unsi
4710: 67 6e 65 64 20 63 68 61 72 2a 29 50 47 48 44 52  gned char*)PGHDR
4720: 5f 54 4f 5f 44 41 54 41 28 70 29 29 5b 6f 66 66  _TO_DATA(p))[off
4730: 73 65 74 5d 3b 0a 20 20 72 65 74 75 72 6e 20 28  set];.  return (
4740: 61 63 5b 30 5d 3c 3c 32 34 29 20 7c 20 28 61 63  ac[0]<<24) | (ac
4750: 5b 31 5d 3c 3c 31 36 29 20 7c 20 28 61 63 5b 32  [1]<<16) | (ac[2
4760: 5d 3c 3c 38 29 20 7c 20 61 63 5b 33 5d 3b 0a 7d  ]<<8) | ac[3];.}
4770: 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74  .../*.** Convert
4780: 20 74 68 65 20 62 69 74 73 20 69 6e 20 74 68 65   the bits in the
4790: 20 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b   pPager->errMask
47a0: 20 69 6e 74 6f 20 61 6e 20 61 70 70 72 6f 70 72   into an appropr
47b0: 61 74 65 0a 2a 2a 20 72 65 74 75 72 6e 20 63 6f  ate.** return co
47c0: 64 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  de..*/.static in
47d0: 74 20 70 61 67 65 72 5f 65 72 72 63 6f 64 65 28  t pager_errcode(
47e0: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
47f0: 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
4800: 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50 61 67  E_OK;.  if( pPag
4810: 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41  er->errMask & PA
4820: 47 45 52 5f 45 52 52 5f 4c 4f 43 4b 20 29 20 20  GER_ERR_LOCK )  
4830: 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 50 52    rc = SQLITE_PR
4840: 4f 54 4f 43 4f 4c 3b 0a 20 20 69 66 28 20 70 50  OTOCOL;.  if( pP
4850: 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20  ager->errMask & 
4860: 50 41 47 45 52 5f 45 52 52 5f 44 49 53 4b 20 29  PAGER_ERR_DISK )
4870: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
4880: 49 4f 45 52 52 3b 0a 20 20 69 66 28 20 70 50 61  IOERR;.  if( pPa
4890: 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50  ger->errMask & P
48a0: 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20 29 20  AGER_ERR_FULL ) 
48b0: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 46     rc = SQLITE_F
48c0: 55 4c 4c 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ULL;.  if( pPage
48d0: 72 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47  r->errMask & PAG
48e0: 45 52 5f 45 52 52 5f 4d 45 4d 20 29 20 20 20 20  ER_ERR_MEM )    
48f0: 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d   rc = SQLITE_NOM
4900: 45 4d 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  EM;.  if( pPager
4910: 2d 3e 65 72 72 4d 61 73 6b 20 26 20 50 41 47 45  ->errMask & PAGE
4920: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 20 29 20  R_ERR_CORRUPT ) 
4930: 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
4940: 55 50 54 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  UPT;.  return rc
4950: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  ;.}../*.** When 
4960: 74 68 69 73 20 69 73 20 63 61 6c 6c 65 64 20 74  this is called t
4970: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
4980: 66 6f 72 20 70 61 67 65 72 20 70 50 61 67 65 72  for pager pPager
4990: 20 6d 75 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a   must be open..*
49a0: 2a 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  * The master jou
49b0: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
49c0: 73 20 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20  s read from the 
49d0: 65 6e 64 20 6f 66 20 74 68 65 20 66 69 6c 65 20  end of the file 
49e0: 61 6e 64 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20  and .** written 
49f0: 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
4a00: 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
4a10: 4d 61 6c 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73  Malloc(). *pzMas
4a20: 74 65 72 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f  ter is.** set to
4a30: 20 70 6f 69 6e 74 20 61 74 20 74 68 65 20 6d 65   point at the me
4a40: 6d 6f 72 79 20 61 6e 64 20 53 51 4c 49 54 45 5f  mory and SQLITE_
4a50: 4f 4b 20 72 65 74 75 72 6e 65 64 2e 20 54 68 65  OK returned. The
4a60: 20 63 61 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20   caller must.** 
4a70: 73 71 6c 69 74 65 46 72 65 65 28 29 20 2a 70 7a  sqliteFree() *pz
4a80: 4d 61 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66  Master..**.** If
4a90: 20 6e 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   no master journ
4aa0: 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20  al file name is 
4ab0: 70 72 65 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65  present *pzMaste
4ac0: 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 61 6e  r is set to 0 an
4ad0: 64 0a 2a 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72  d.** SQLITE_OK r
4ae0: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
4af0: 69 63 20 69 6e 74 20 72 65 61 64 4d 61 73 74 65  ic int readMaste
4b00: 72 4a 6f 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20  rJournal(OsFile 
4b10: 2a 70 4a 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70  *pJrnl, char **p
4b20: 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e 74 20  zMaster){.  int 
4b30: 72 63 3b 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20  rc;.  u32 len;. 
4b40: 20 69 36 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20   i64 szJ;.  u32 
4b50: 63 6b 73 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  cksum;.  int i;.
4b60: 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
4b70: 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20  aMagic[8]; /* A 
4b80: 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20 74  buffer to hold t
4b90: 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72 20  he magic header 
4ba0: 2a 2f 0a 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20  */..  *pzMaster 
4bb0: 3d 20 30 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  = 0;..  rc = sql
4bc0: 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
4bd0: 4a 72 6e 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69  Jrnl, &szJ);.  i
4be0: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
4bf0: 20 7c 7c 20 73 7a 4a 3c 31 36 20 29 20 72 65 74   || szJ<16 ) ret
4c00: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
4c10: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 4a  sqlite3OsSeek(pJ
4c20: 72 6e 6c 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20  rnl, szJ-16);.  
4c30: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4c40: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
4c50: 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69  .  rc = read32bi
4c60: 74 73 28 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b  ts(pJrnl, &len);
4c70: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
4c80: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
4c90: 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  ;..  rc = read32
4ca0: 62 69 74 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73  bits(pJrnl, &cks
4cb0: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
4cc0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
4cd0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
4ce0: 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a 72 6e  lite3OsRead(pJrn
4cf0: 6c 2c 20 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20  l, aMagic, 8);. 
4d00: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
4d10: 4f 4b 20 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61  OK || memcmp(aMa
4d20: 67 69 63 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67  gic, aJournalMag
4d30: 69 63 2c 20 38 29 20 29 20 72 65 74 75 72 6e 20  ic, 8) ) return 
4d40: 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69  rc;..  rc = sqli
4d50: 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c  te3OsSeek(pJrnl,
4d60: 20 73 7a 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20   szJ-16-len);.  
4d70: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
4d80: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
4d90: 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 28 63    *pzMaster = (c
4da0: 68 61 72 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c  har *)sqliteMall
4db0: 6f 63 28 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28  oc(len+1);.  if(
4dc0: 20 21 2a 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20   !*pzMaster ){. 
4dd0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
4de0: 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63  _NOMEM;.  }.  rc
4df0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
4e00: 28 70 4a 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65  (pJrnl, *pzMaste
4e10: 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72  r, len);.  if( r
4e20: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
4e30: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 2a      sqliteFree(*
4e40: 70 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 2a  pzMaster);.    *
4e50: 70 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20  pzMaster = 0;.  
4e60: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
4e70: 0a 0a 20 20 2f 2a 20 53 65 65 20 69 66 20 74 68  ..  /* See if th
4e80: 65 20 63 68 65 63 6b 73 75 6d 20 6d 61 74 63 68  e checksum match
4e90: 65 73 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  es the master jo
4ea0: 75 72 6e 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20  urnal name */.  
4eb0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20  for(i=0; i<len; 
4ec0: 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20  i++){.    cksum 
4ed0: 2d 3d 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69  -= (*pzMaster)[i
4ee0: 5d 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 6b 73  ];.  }.  if( cks
4ef0: 75 6d 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  um ){.    /* If 
4f00: 74 68 65 20 63 68 65 63 6b 73 75 6d 20 64 6f 65  the checksum doe
4f10: 73 6e 27 74 20 61 64 64 20 75 70 2c 20 74 68 65  sn't add up, the
4f20: 6e 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66  n one or more of
4f30: 20 74 68 65 20 64 69 73 6b 20 73 65 63 74 6f 72   the disk sector
4f40: 73 0a 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e  s.    ** contain
4f50: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
4f60: 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20  ournal filename 
4f70: 69 73 20 63 6f 72 72 75 70 74 65 64 2e 20 54 68  is corrupted. Th
4f80: 69 73 20 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20  is means.    ** 
4f90: 64 65 66 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20  definitely roll 
4fa0: 62 61 63 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65  back, so just re
4fb0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61  turn SQLITE_OK a
4fc0: 6e 64 20 72 65 70 6f 72 74 20 61 20 28 6e 75 6c  nd report a (nul
4fd0: 29 0a 20 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d  ).    ** master-
4fe0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65  journal filename
4ff0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c  ..    */.    sql
5000: 69 74 65 46 72 65 65 28 2a 70 7a 4d 61 73 74 65  iteFree(*pzMaste
5010: 72 29 3b 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65  r);.    *pzMaste
5020: 72 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a  r = 0;.  }else{.
5030: 20 20 20 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b      (*pzMaster)[
5040: 6c 65 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d  len] = '\0';.  }
5050: 0a 20 20 20 0a 20 20 72 65 74 75 72 6e 20 53 51  .   .  return SQ
5060: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
5070: 2a 20 53 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e  * Seek the journ
5080: 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  al file descript
5090: 6f 72 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73  or to the next s
50a0: 65 63 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 77  ector boundary w
50b0: 68 65 72 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61  here a.** journa
50c0: 6c 20 68 65 61 64 65 72 20 6d 61 79 20 62 65 20  l header may be 
50d0: 72 65 61 64 20 6f 72 20 77 72 69 74 74 65 6e 2e  read or written.
50e0: 20 50 61 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66   Pager.journalOf
50f0: 66 20 69 73 20 75 70 64 61 74 65 64 20 77 69 74  f is updated wit
5100: 68 0a 2a 2a 20 74 68 65 20 6e 65 77 20 73 65 65  h.** the new see
5110: 6b 20 6f 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  k offset..**.** 
5120: 69 2e 65 20 66 6f 72 20 61 20 73 65 63 74 6f 72  i.e for a sector
5130: 20 73 69 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a   size of 512:.**
5140: 0a 2a 2a 20 49 6e 70 75 74 20 4f 66 66 73 65 74  .** Input Offset
5150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 75                Ou
5160: 74 70 75 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d  tput Offset.** -
5170: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5180: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
5190: 2d 2d 2d 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20  ------.** 0     
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51b0: 20 20 20 20 30 0a 2a 2a 20 35 31 32 20 20 20 20      0.** 512    
51c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51d0: 20 20 20 35 31 32 0a 2a 2a 20 31 30 30 20 20 20     512.** 100   
51e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
51f0: 20 20 20 20 35 31 32 0a 2a 2a 20 32 30 30 30 20      512.** 2000 
5200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5210: 20 20 20 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f       2048.** .*/
5220: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 65 6b  .static int seek
5230: 4a 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72  JournalHdr(Pager
5240: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36 34   *pPager){.  i64
5250: 20 6f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69   offset = 0;.  i
5260: 36 34 20 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a  64 c = pPager->j
5270: 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28  ournalOff;.  if(
5280: 20 63 20 29 7b 0a 20 20 20 20 6f 66 66 73 65 74   c ){.    offset
5290: 20 3d 20 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41   = ((c-1)/JOURNA
52a0: 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29  L_HDR_SZ(pPager)
52b0: 20 2b 20 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f   + 1) * JOURNAL_
52c0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
52d0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 6f 66    }.  assert( of
52e0: 66 73 65 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52  fset%JOURNAL_HDR
52f0: 5f 53 5a 28 70 50 61 67 65 72 29 3d 3d 30 20 29  _SZ(pPager)==0 )
5300: 3b 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73  ;.  assert( offs
5310: 65 74 3e 3d 63 20 29 3b 0a 20 20 61 73 73 65 72  et>=c );.  asser
5320: 74 28 20 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f  t( (offset-c)<JO
5330: 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61  URNAL_HDR_SZ(pPa
5340: 67 65 72 29 20 29 3b 0a 20 20 70 50 61 67 65 72  ger) );.  pPager
5350: 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f  ->journalOff = o
5360: 66 66 73 65 74 3b 0a 20 20 72 65 74 75 72 6e 20  ffset;.  return 
5370: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
5380: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
5390: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
53a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f  .}../*.** The jo
53b0: 75 72 6e 61 6c 20 66 69 6c 65 20 6d 75 73 74 20  urnal file must 
53c0: 62 65 20 6f 70 65 6e 20 77 68 65 6e 20 74 68 69  be open when thi
53d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
53e0: 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a  led. A journal.*
53f0: 2a 20 68 65 61 64 65 72 20 28 4a 4f 55 52 4e 41  * header (JOURNA
5400: 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 29 20  L_HDR_SZ bytes) 
5410: 69 73 20 77 72 69 74 74 65 6e 20 69 6e 74 6f 20  is written into 
5420: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
5430: 20 61 74 20 74 68 65 0a 2a 2a 20 63 75 72 72 65   at the.** curre
5440: 6e 74 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a  nt location..**.
5450: 2a 2a 20 54 68 65 20 66 6f 72 6d 61 74 20 66 6f  ** The format fo
5460: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  r the journal he
5470: 61 64 65 72 20 69 73 20 61 73 20 66 6f 6c 6c 6f  ader is as follo
5480: 77 73 3a 0a 2a 2a 20 2d 20 38 20 62 79 74 65 73  ws:.** - 8 bytes
5490: 3a 20 4d 61 67 69 63 20 69 64 65 6e 74 69 66 79  : Magic identify
54a0: 69 6e 67 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d  ing journal form
54b0: 61 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73  at..** - 4 bytes
54c0: 3a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f  : Number of reco
54d0: 72 64 73 20 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20  rds in journal, 
54e0: 6f 72 20 2d 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f  or -1 no-sync mo
54f0: 64 65 20 69 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34  de is on..** - 4
5500: 20 62 79 74 65 73 3a 20 52 61 6e 64 6f 6d 20 6e   bytes: Random n
5510: 75 6d 62 65 72 20 75 73 65 64 20 66 6f 72 20 70  umber used for p
5520: 61 67 65 20 68 61 73 68 2e 0a 2a 2a 20 2d 20 34  age hash..** - 4
5530: 20 62 79 74 65 73 3a 20 49 6e 69 74 69 61 6c 20   bytes: Initial 
5540: 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
5550: 75 6e 74 2e 0a 2a 2a 20 2d 20 34 20 62 79 74 65  unt..** - 4 byte
5560: 73 3a 20 53 65 63 74 6f 72 20 73 69 7a 65 20 75  s: Sector size u
5570: 73 65 64 20 62 79 20 74 68 65 20 70 72 6f 63 65  sed by the proce
5580: 73 73 20 74 68 61 74 20 77 72 6f 74 65 20 74 68  ss that wrote th
5590: 69 73 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a  is journal..** .
55a0: 2a 2a 20 46 6f 6c 6c 6f 77 65 64 20 62 79 20 28  ** Followed by (
55b0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d  JOURNAL_HDR_SZ -
55c0: 20 32 34 29 20 62 79 74 65 73 20 6f 66 20 75 6e   24) bytes of un
55d0: 75 73 65 64 20 73 70 61 63 65 2e 0a 2a 2f 0a 73  used space..*/.s
55e0: 74 61 74 69 63 20 69 6e 74 20 77 72 69 74 65 4a  tatic int writeJ
55f0: 6f 75 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20  ournalHdr(Pager 
5600: 2a 70 50 61 67 65 72 29 7b 0a 0a 20 20 69 6e 74  *pPager){..  int
5610: 20 72 63 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61   rc = seekJourna
5620: 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 20 20  lHdr(pPager);.  
5630: 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
5640: 72 63 3b 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a  rc;..  pPager->j
5650: 6f 75 72 6e 61 6c 48 64 72 20 3d 20 70 50 61 67  ournalHdr = pPag
5660: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a  er->journalOff;.
5670: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
5680: 6d 74 48 64 72 4f 66 66 3d 3d 30 20 29 7b 0a 20  mtHdrOff==0 ){. 
5690: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48     pPager->stmtH
56a0: 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72 2d 3e  drOff = pPager->
56b0: 6a 6f 75 72 6e 61 6c 48 64 72 3b 0a 20 20 7d 0a  journalHdr;.  }.
56c0: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
56d0: 6c 4f 66 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f  lOff += JOURNAL_
56e0: 48 44 52 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a  HDR_SZ(pPager);.
56f0: 0a 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20  .  /* FIX ME: . 
5700: 20 2a 2a 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c   **.  ** Possibl
5710: 79 20 66 6f 72 20 61 20 70 61 67 65 72 20 6e 6f  y for a pager no
5720: 74 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64  t in no-sync mod
5730: 65 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d  e, the journal m
5740: 61 67 69 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a  agic should not.
5750: 20 20 2a 2a 20 62 65 20 77 72 69 74 74 65 6e 20    ** be written 
5760: 75 6e 74 69 6c 20 6e 52 65 63 20 69 73 20 66 69  until nRec is fi
5770: 6c 6c 65 64 20 69 6e 20 61 73 20 70 61 72 74 20  lled in as part 
5780: 6f 66 20 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72  of next syncJour
5790: 6e 61 6c 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a  nal(). .  **.  *
57a0: 2a 20 41 63 74 75 61 6c 6c 79 20 6d 61 79 62 65  * Actually maybe
57b0: 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
57c0: 61 6c 20 68 65 61 64 65 72 20 73 68 6f 75 6c 64  al header should
57d0: 20 62 65 20 64 65 6c 61 79 65 64 20 75 6e 74 69   be delayed unti
57e0: 6c 20 74 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e  l that.  ** poin
57f0: 74 2e 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  t. Think about t
5800: 68 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d  his..  */.  rc =
5810: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
5820: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a  &pPager->jfd, aJ
5830: 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a  ournalMagic, siz
5840: 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
5850: 63 29 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d  c));..  if( rc==
5860: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
5870: 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69 65   /* The nRec Fie
5880: 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20 66  ld. 0xFFFFFFFF f
5890: 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72 6e  or no-sync journ
58a0: 61 6c 73 2e 20 2a 2f 0a 20 20 20 20 72 63 20 3d  als. */.    rc =
58b0: 20 77 72 69 74 65 33 32 62 69 74 73 28 26 70 50   write32bits(&pP
58c0: 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
58d0: 72 2d 3e 6e 6f 53 79 6e 63 20 3f 20 30 78 66 66  r->noSync ? 0xff
58e0: 66 66 66 66 66 66 20 3a 20 30 29 3b 0a 20 20 7d  ffffff : 0);.  }
58f0: 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
5900: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 54  E_OK ){.    /* T
5910: 68 65 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d  he random check-
5920: 68 61 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72  hash initialiser
5930: 20 2a 2f 20 0a 20 20 20 20 73 71 6c 69 74 65 33   */ .    sqlite3
5940: 52 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  Randomness(sizeo
5950: 66 28 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49  f(pPager->cksumI
5960: 6e 69 74 29 2c 20 26 70 50 61 67 65 72 2d 3e 63  nit), &pPager->c
5970: 6b 73 75 6d 49 6e 69 74 29 3b 0a 20 20 20 20 72  ksumInit);.    r
5980: 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
5990: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
59a0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
59b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
59c0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
59d0: 20 2f 2a 20 54 68 65 20 69 6e 69 74 69 61 6c 20   /* The initial 
59e0: 64 61 74 61 62 61 73 65 20 73 69 7a 65 20 2a 2f  database size */
59f0: 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74 65 33  .    rc = write3
5a00: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
5a10: 66 64 2c 20 70 50 61 67 65 72 2d 3e 64 62 53 69  fd, pPager->dbSi
5a20: 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ze);.  }.  if( r
5a30: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
5a40: 20 20 20 20 2f 2a 20 54 68 65 20 61 73 73 75 6d      /* The assum
5a50: 65 64 20 73 65 63 74 6f 72 20 73 69 7a 65 20 66  ed sector size f
5a60: 6f 72 20 74 68 69 73 20 70 72 6f 63 65 73 73 20  or this process 
5a70: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 77 72 69 74  */.    rc = writ
5a80: 65 33 32 62 69 74 73 28 26 70 50 61 67 65 72 2d  e32bits(&pPager-
5a90: 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 73 65  >jfd, pPager->se
5aa0: 63 74 6f 72 53 69 7a 65 29 3b 0a 20 20 7d 0a 0a  ctorSize);.  }..
5ab0: 20 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c    /* The journal
5ac0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
5ad0: 20 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73   written success
5ae0: 66 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20  fully. Seek the 
5af0: 6a 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c  journal.  ** fil
5b00: 65 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20  e descriptor to 
5b10: 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a  the end of the j
5b20: 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65  ournal header se
5b30: 63 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  ctor..  */.  if(
5b40: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
5b50: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 53  {.    sqlite3OsS
5b60: 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  eek(&pPager->jfd
5b70: 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  , pPager->journa
5b80: 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 72 63 20  lOff-1);.    rc 
5b90: 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
5ba0: 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 22  (&pPager->jfd, "
5bb0: 5c 30 30 30 22 2c 20 31 29 3b 0a 20 20 7d 0a 20  \000", 1);.  }. 
5bc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
5bd0: 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c  *.** The journal
5be0: 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f 70   file must be op
5bf0: 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69 73 20  en when this is 
5c00: 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72 6e 61  called. A journa
5c10: 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a 2a 2a  l header file.**
5c20: 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a   (JOURNAL_HDR_SZ
5c30: 20 62 79 74 65 73 29 20 69 73 20 72 65 61 64 20   bytes) is read 
5c40: 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65 6e 74  from the current
5c50: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65   location in the
5c60: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c 65   journal.** file
5c70: 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 61  . See comments a
5c80: 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20 77 72  bove function wr
5c90: 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20  iteJournalHdr() 
5ca0: 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f  for a descriptio
5cb0: 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  n of.** the jour
5cc0: 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72 6d 61  nal header forma
5cd0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
5ce0: 68 65 61 64 65 72 20 69 73 20 72 65 61 64 20 73  header is read s
5cf0: 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a 6e 52  uccessfully, *nR
5d00: 65 63 20 69 73 20 73 65 74 20 74 6f 20 74 68 65  ec is set to the
5d10: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 70 61   number of.** pa
5d20: 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c 6c 6f  ge records follo
5d30: 77 69 6e 67 20 74 68 69 73 20 68 65 61 64 65 72  wing this header
5d40: 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69 73 20   and *dbSize is 
5d50: 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a 65 20  set to the size 
5d60: 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61 62 61  of the.** databa
5d70: 73 65 20 62 65 66 6f 72 65 20 74 68 65 20 74 72  se before the tr
5d80: 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61 6e 2c  ansaction began,
5d90: 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73 6f 2c   in pages. Also,
5da0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
5db0: 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20  it.** is set to 
5dc0: 74 68 65 20 76 61 6c 75 65 20 72 65 61 64 20 66  the value read f
5dd0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
5de0: 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45 5f 4f  header. SQLITE_O
5df0: 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a 2a  K is returned.**
5e00: 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a   in this case..*
5e10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72  *.** If the jour
5e20: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 20  nal header file 
5e30: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 63 6f  appears to be co
5e40: 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54 45 5f  rrupted, SQLITE_
5e50: 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74 75 72  DONE is.** retur
5e60: 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20 61 6e  ned and *nRec an
5e70: 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20 6e 6f  d *dbSize are no
5e80: 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55 52 4e  t set.  If JOURN
5e90: 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65 73 0a  AL_HDR_SZ bytes.
5ea0: 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 61  ** cannot be rea
5eb0: 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e  d from the journ
5ec0: 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72 6f 72  al file an error
5ed0: 20 63 6f 64 65 20 69 73 20 72 65 74 75 72 6e 65   code is returne
5ee0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
5ef0: 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28   readJournalHdr(
5f00: 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
5f10: 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c  , .  i64 journal
5f20: 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70 4e 52  Size,.  u32 *pNR
5f30: 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44 62 53  ec, .  u32 *pDbS
5f40: 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ize.){.  int rc;
5f50: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5f60: 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a 20 41   aMagic[8]; /* A
5f70: 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c 64 20   buffer to hold 
5f80: 74 68 65 20 6d 61 67 69 63 20 68 65 61 64 65 72  the magic header
5f90: 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65 65 6b   */..  rc = seek
5fa0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
5fb0: 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72  r);.  if( rc ) r
5fc0: 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
5fd0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
5fe0: 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  Off+JOURNAL_HDR_
5ff0: 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a 6f 75  SZ(pPager) > jou
6000: 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20 20 20  rnalSize ){.    
6010: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
6020: 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20 3d 20  NE;.  }..  rc = 
6030: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70  sqlite3OsRead(&p
6040: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61 67  Pager->jfd, aMag
6050: 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67 69  ic, sizeof(aMagi
6060: 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  c));.  if( rc ) 
6070: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66  return rc;..  if
6080: 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63 2c  ( memcmp(aMagic,
6090: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c 20   aJournalMagic, 
60a0: 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29 21  sizeof(aMagic))!
60b0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
60c0: 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20 20   SQLITE_DONE;.  
60d0: 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32  }..  rc = read32
60e0: 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66  bits(&pPager->jf
60f0: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
6100: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
6110: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
6120: 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  its(&pPager->jfd
6130: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
6140: 49 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20  Init);.  if( rc 
6150: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
6160: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
6170: 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44  &pPager->jfd, pD
6180: 62 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63  bSize);.  if( rc
6190: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
61a0: 20 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 61   /* Update the a
61b0: 73 73 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69  ssumed sector-si
61c0: 7a 65 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20  ze to match the 
61d0: 76 61 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20  value used by . 
61e0: 20 2a 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20   ** the process 
61f0: 74 68 61 74 20 63 72 65 61 74 65 64 20 74 68 69  that created thi
6200: 73 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68  s journal. If th
6210: 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20  is journal was. 
6220: 20 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 61   ** created by a
6230: 20 70 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74   process other t
6240: 68 61 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68  han this one, th
6250: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
6260: 20 20 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61    ** is being ca
6270: 6c 6c 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e  lled from within
6280: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
6290: 29 2e 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c  ). The local val
62a0: 75 65 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72  ue.  ** of Pager
62b0: 2e 73 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72  .sectorSize is r
62c0: 65 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 65  estored at the e
62d0: 6e 64 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69  nd of that routi
62e0: 6e 65 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ne..  */.  rc = 
62f0: 72 65 61 64 33 32 62 69 74 73 28 26 70 50 61 67  read32bits(&pPag
6300: 65 72 2d 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29  er->jfd, (u32 *)
6310: 26 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53  &pPager->sectorS
6320: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
6330: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
6340: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
6350: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
6360: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 72  _SZ(pPager);.  r
6370: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
6380: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
6390: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
63a0: 66 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ff);.  return rc
63b0: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74  ;.}.../*.** Writ
63c0: 65 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 6d  e the supplied m
63d0: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
63e0: 6d 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72  me into the jour
63f0: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20 70 61 67  nal file for pag
6400: 65 72 0a 2a 2a 20 70 50 61 67 65 72 20 61 74 20  er.** pPager at 
6410: 74 68 65 20 63 75 72 72 65 6e 74 20 6c 6f 63 61  the current loca
6420: 74 69 6f 6e 2e 20 54 68 65 20 6d 61 73 74 65 72  tion. The master
6430: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 6d 75   journal name mu
6440: 73 74 20 62 65 20 74 68 65 20 6c 61 73 74 0a 2a  st be the last.*
6450: 2a 20 74 68 69 6e 67 20 77 72 69 74 74 65 6e 20  * thing written 
6460: 74 6f 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  to a journal fil
6470: 65 2e 20 49 66 20 74 68 65 20 70 61 67 65 72 20  e. If the pager 
6480: 69 73 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20  is in full-sync 
6490: 6d 6f 64 65 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75  mode, the.** jou
64a0: 72 6e 61 6c 20 66 69 6c 65 20 64 65 73 63 72 69  rnal file descri
64b0: 70 74 6f 72 20 69 73 20 61 64 76 61 6e 63 65 64  ptor is advanced
64c0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63   to the next sec
64d0: 74 6f 72 20 62 6f 75 6e 64 61 72 79 20 62 65 66  tor boundary bef
64e0: 6f 72 65 0a 2a 2a 20 61 6e 79 74 68 69 6e 67 20  ore.** anything 
64f0: 69 73 20 77 72 69 74 74 65 6e 2e 20 54 68 65 20  is written. The 
6500: 66 6f 72 6d 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a  format is:.**.**
6510: 20 2b 20 34 20 62 79 74 65 73 3a 20 50 41 47 45   + 4 bytes: PAGE
6520: 52 5f 4d 4a 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20  R_MJ_PGNO..** + 
6530: 4e 20 62 79 74 65 73 3a 20 6c 65 6e 67 74 68 20  N bytes: length 
6540: 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  of master journa
6550: 6c 20 6e 61 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62  l name..** + 4 b
6560: 79 74 65 73 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62  ytes: N.** + 4 b
6570: 79 74 65 73 3a 20 4d 61 73 74 65 72 20 6a 6f 75  ytes: Master jou
6580: 72 6e 61 6c 20 6e 61 6d 65 20 63 68 65 63 6b 73  rnal name checks
6590: 75 6d 2e 0a 2a 2a 20 2b 20 38 20 62 79 74 65 73  um..** + 8 bytes
65a0: 3a 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  : aJournalMagic[
65b0: 5d 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 73  ]..**.** The mas
65c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  ter journal page
65d0: 20 63 68 65 63 6b 73 75 6d 20 69 73 20 74 68 65   checksum is the
65e0: 20 73 75 6d 20 6f 66 20 74 68 65 20 62 79 74 65   sum of the byte
65f0: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 0a  s in the master.
6600: 2a 2a 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e  ** journal name.
6610: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
6620: 72 69 74 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61  riteMasterJourna
6630: 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  l(Pager *pPager,
6640: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61   const char *zMa
6650: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
6660: 0a 20 20 69 6e 74 20 6c 65 6e 3b 20 0a 20 20 69  .  int len; .  i
6670: 6e 74 20 69 3b 20 0a 20 20 75 33 32 20 63 6b 73  nt i; .  u32 cks
6680: 75 6d 20 3d 20 30 3b 20 0a 0a 20 20 69 66 28 20  um = 0; ..  if( 
6690: 21 7a 4d 61 73 74 65 72 20 7c 7c 20 70 50 61 67  !zMaster || pPag
66a0: 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 29 20 72  er->setMaster) r
66b0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
66c0: 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61  .  pPager->setMa
66d0: 73 74 65 72 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e  ster = 1;..  len
66e0: 20 3d 20 73 74 72 6c 65 6e 28 7a 4d 61 73 74 65   = strlen(zMaste
66f0: 72 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  r);.  for(i=0; i
6700: 3c 6c 65 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  <len; i++){.    
6710: 63 6b 73 75 6d 20 2b 3d 20 7a 4d 61 73 74 65 72  cksum += zMaster
6720: 5b 69 5d 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  [i];.  }..  /* I
6730: 66 20 69 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d  f in full-sync m
6740: 6f 64 65 2c 20 61 64 76 61 6e 63 65 20 74 6f 20  ode, advance to 
6750: 74 68 65 20 6e 65 78 74 20 64 69 73 6b 20 73 65  the next disk se
6760: 63 74 6f 72 20 62 65 66 6f 72 65 20 77 72 69 74  ctor before writ
6770: 69 6e 67 0a 20 20 2a 2a 20 74 68 65 20 6d 61 73  ing.  ** the mas
6780: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65  ter journal name
6790: 2e 20 54 68 69 73 20 69 73 20 69 6e 20 63 61 73  . This is in cas
67a0: 65 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 70  e the previous p
67b0: 61 67 65 20 77 72 69 74 74 65 6e 20 74 6f 0a 20  age written to. 
67c0: 20 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   ** the journal 
67d0: 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e  has already been
67e0: 20 73 79 6e 63 65 64 2e 0a 20 20 2a 2f 0a 20 20   synced..  */.  
67f0: 69 66 28 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  if( pPager->full
6800: 53 79 6e 63 20 29 7b 0a 20 20 20 20 72 63 20 3d  Sync ){.    rc =
6810: 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28   seekJournalHdr(
6820: 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
6830: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6840: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
6850: 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
6860: 6c 4f 66 66 20 2b 3d 20 28 6c 65 6e 2b 32 30 29  lOff += (len+20)
6870: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6880: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6890: 66 64 2c 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e  fd, PAGER_MJ_PGN
68a0: 4f 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  O(pPager));.  if
68b0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
68c0: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20  ) return rc;..  
68d0: 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72  rc = sqlite3OsWr
68e0: 69 74 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ite(&pPager->jfd
68f0: 2c 20 7a 4d 61 73 74 65 72 2c 20 6c 65 6e 29 3b  , zMaster, len);
6900: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
6910: 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
6920: 3b 0a 0a 20 20 72 63 20 3d 20 77 72 69 74 65 33  ;..  rc = write3
6930: 32 62 69 74 73 28 26 70 50 61 67 65 72 2d 3e 6a  2bits(&pPager->j
6940: 66 64 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28 20  fd, len);.  if( 
6950: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
6960: 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63  return rc;..  rc
6970: 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28 26   = write32bits(&
6980: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 63 6b 73  pPager->jfd, cks
6990: 75 6d 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  um);.  if( rc!=S
69a0: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
69b0: 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71  n rc;..  rc = sq
69c0: 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70 50  lite3OsWrite(&pP
69d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4a 6f 75 72  ager->jfd, aJour
69e0: 6e 61 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66  nalMagic, sizeof
69f0: 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29  (aJournalMagic))
6a00: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  ;.  pPager->need
6a10: 53 79 6e 63 20 3d 20 31 3b 0a 20 20 72 65 74 75  Sync = 1;.  retu
6a20: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
6a30: 41 64 64 20 6f 72 20 72 65 6d 6f 76 65 20 61 20  Add or remove a 
6a40: 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20 6c 69  page from the li
6a50: 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65 73 20  st of all pages 
6a60: 74 68 61 74 20 61 72 65 20 69 6e 20 74 68 65 0a  that are in the.
6a70: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  ** statement jou
6a80: 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  rnal..**.** The 
6a90: 50 61 67 65 72 20 6b 65 65 70 73 20 61 20 73 65  Pager keeps a se
6aa0: 70 61 72 61 74 65 20 6c 69 73 74 20 6f 66 20 70  parate list of p
6ab0: 61 67 65 73 20 74 68 61 74 20 61 72 65 20 63 75  ages that are cu
6ac0: 72 72 65 6e 74 6c 79 20 69 6e 0a 2a 2a 20 74 68  rrently in.** th
6ad0: 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
6ae0: 6e 61 6c 2e 20 20 54 68 69 73 20 68 65 6c 70 73  nal.  This helps
6af0: 20 74 68 65 20 73 71 6c 69 74 65 33 70 61 67 65   the sqlite3page
6b00: 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 29 0a  r_stmt_commit().
6b10: 2a 2a 20 72 6f 75 74 69 6e 65 20 72 75 6e 20 4d  ** routine run M
6b20: 55 43 48 20 66 61 73 74 65 72 20 66 6f 72 20 74  UCH faster for t
6b30: 68 65 20 63 6f 6d 6d 6f 6e 20 63 61 73 65 20 77  he common case w
6b40: 68 65 72 65 20 74 68 65 72 65 20 61 72 65 20 6d  here there are m
6b50: 61 6e 79 0a 2a 2a 20 70 61 67 65 73 20 69 6e 20  any.** pages in 
6b60: 6d 65 6d 6f 72 79 20 62 75 74 20 6f 6e 6c 79 20  memory but only 
6b70: 61 20 66 65 77 20 61 72 65 20 69 6e 20 74 68 65  a few are in the
6b80: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
6b90: 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  al..*/.static vo
6ba0: 69 64 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73  id page_add_to_s
6bb0: 74 6d 74 5f 6c 69 73 74 28 50 67 48 64 72 20 2a  tmt_list(PgHdr *
6bc0: 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
6bd0: 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
6be0: 67 65 72 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e  ger;.  if( pPg->
6bf0: 69 6e 53 74 6d 74 20 29 20 72 65 74 75 72 6e 3b  inStmt ) return;
6c00: 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
6c10: 70 50 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20  pPrevStmt==0 && 
6c20: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  pPg->pNextStmt==
6c30: 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65  0 );.  pPg->pPre
6c40: 76 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  vStmt = 0;.  if(
6c50: 20 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 29   pPager->pStmt )
6c60: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53  {.    pPager->pS
6c70: 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d  tmt->pPrevStmt =
6c80: 20 70 50 67 3b 0a 20 20 7d 0a 20 20 70 50 67 2d   pPg;.  }.  pPg-
6c90: 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70 50 61  >pNextStmt = pPa
6ca0: 67 65 72 2d 3e 70 53 74 6d 74 3b 0a 20 20 70 50  ger->pStmt;.  pP
6cb0: 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50  ager->pStmt = pP
6cc0: 67 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74  g;.  pPg->inStmt
6cd0: 20 3d 20 31 3b 0a 7d 0a 73 74 61 74 69 63 20 76   = 1;.}.static v
6ce0: 6f 69 64 20 70 61 67 65 5f 72 65 6d 6f 76 65 5f  oid page_remove_
6cf0: 66 72 6f 6d 5f 73 74 6d 74 5f 6c 69 73 74 28 50  from_stmt_list(P
6d00: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
6d10: 28 20 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29  ( !pPg->inStmt )
6d20: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
6d30: 50 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 29 7b  Pg->pPrevStmt ){
6d40: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
6d50: 2d 3e 70 50 72 65 76 53 74 6d 74 2d 3e 70 4e 65  ->pPrevStmt->pNe
6d60: 78 74 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  xtStmt==pPg );. 
6d70: 20 20 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d     pPg->pPrevStm
6d80: 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 70  t->pNextStmt = p
6d90: 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 3b 0a 20  Pg->pNextStmt;. 
6da0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
6db0: 72 74 28 20 70 50 67 2d 3e 70 50 61 67 65 72 2d  rt( pPg->pPager-
6dc0: 3e 70 53 74 6d 74 3d 3d 70 50 67 20 29 3b 0a 20  >pStmt==pPg );. 
6dd0: 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e     pPg->pPager->
6de0: 70 53 74 6d 74 20 3d 20 70 50 67 2d 3e 70 4e 65  pStmt = pPg->pNe
6df0: 78 74 53 74 6d 74 3b 0a 20 20 7d 0a 20 20 69 66  xtStmt;.  }.  if
6e00: 28 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74  ( pPg->pNextStmt
6e10: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
6e20: 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d 74 2d 3e  pPg->pNextStmt->
6e30: 70 50 72 65 76 53 74 6d 74 3d 3d 70 50 67 20 29  pPrevStmt==pPg )
6e40: 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
6e50: 53 74 6d 74 2d 3e 70 50 72 65 76 53 74 6d 74 20  Stmt->pPrevStmt 
6e60: 3d 20 70 50 67 2d 3e 70 50 72 65 76 53 74 6d 74  = pPg->pPrevStmt
6e70: 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65  ;.  }.  pPg->pNe
6e80: 78 74 53 74 6d 74 20 3d 20 30 3b 0a 20 20 70 50  xtStmt = 0;.  pP
6e90: 67 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 30  g->pPrevStmt = 0
6ea0: 3b 0a 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20  ;.  pPg->inStmt 
6eb0: 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  = 0;.}../*.** Fi
6ec0: 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65  nd a page in the
6ed0: 20 68 61 73 68 20 74 61 62 6c 65 20 67 69 76 65   hash table give
6ee0: 6e 20 69 74 73 20 70 61 67 65 20 6e 75 6d 62 65  n its page numbe
6ef0: 72 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20 61 20  r.  Return.** a 
6f00: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 70  pointer to the p
6f10: 61 67 65 20 6f 72 20 4e 55 4c 4c 20 69 66 20 6e  age or NULL if n
6f20: 6f 74 20 66 6f 75 6e 64 2e 0a 2a 2f 0a 73 74 61  ot found..*/.sta
6f30: 74 69 63 20 50 67 48 64 72 20 2a 70 61 67 65 72  tic PgHdr *pager
6f40: 5f 6c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a 70  _lookup(Pager *p
6f50: 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f  Pager, Pgno pgno
6f60: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20  ){.  PgHdr *p = 
6f70: 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61  pPager->aHash[pa
6f80: 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 5d 3b  ger_hash(pgno)];
6f90: 0a 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70  .  while( p && p
6fa0: 2d 3e 70 67 6e 6f 21 3d 70 67 6e 6f 20 29 7b 0a  ->pgno!=pgno ){.
6fb0: 20 20 20 20 70 20 3d 20 70 2d 3e 70 4e 65 78 74      p = p->pNext
6fc0: 48 61 73 68 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Hash;.  }.  retu
6fd0: 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55  rn p;.}../*.** U
6fe0: 6e 6c 6f 63 6b 20 74 68 65 20 64 61 74 61 62 61  nlock the databa
6ff0: 73 65 20 61 6e 64 20 63 6c 65 61 72 20 74 68 65  se and clear the
7000: 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65   in-memory cache
7010: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 0a  .  This routine.
7020: 2a 2a 20 73 65 74 73 20 74 68 65 20 73 74 61 74  ** sets the stat
7030: 65 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 62  e of the pager b
7040: 61 63 6b 20 74 6f 20 77 68 61 74 20 69 74 20 77  ack to what it w
7050: 61 73 20 77 68 65 6e 20 69 74 20 77 61 73 20 66  as when it was f
7060: 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65 64 2e 20  irst.** opened. 
7070: 20 41 6e 79 20 6f 75 74 73 74 61 6e 64 69 6e 67   Any outstanding
7080: 20 70 61 67 65 73 20 61 72 65 20 69 6e 76 61 6c   pages are inval
7090: 69 64 61 74 65 64 20 61 6e 64 20 73 75 62 73 65  idated and subse
70a0: 71 75 65 6e 74 20 61 74 74 65 6d 70 74 73 0a 2a  quent attempts.*
70b0: 2a 20 74 6f 20 61 63 63 65 73 73 20 74 68 6f 73  * to access thos
70c0: 65 20 70 61 67 65 73 20 77 69 6c 6c 20 6c 69 6b  e pages will lik
70d0: 65 6c 79 20 72 65 73 75 6c 74 20 69 6e 20 61 20  ely result in a 
70e0: 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 73 74 61  coredump..*/.sta
70f0: 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f 72  tic void pager_r
7100: 65 73 65 74 28 50 61 67 65 72 20 2a 70 50 61 67  eset(Pager *pPag
7110: 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  er){.  PgHdr *pP
7120: 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 66 6f 72  g, *pNext;.  for
7130: 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c  (pPg=pPager->pAl
7140: 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78  l; pPg; pPg=pNex
7150: 74 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20  t){.    pNext = 
7160: 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
7170: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50     sqliteFree(pP
7180: 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72  g);.  }.  pPager
7190: 2d 3e 70 46 69 72 73 74 20 3d 20 30 3b 0a 20 20  ->pFirst = 0;.  
71a0: 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
71b0: 6e 63 65 64 20 3d 20 30 3b 0a 20 20 70 50 61 67  nced = 0;.  pPag
71c0: 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30 3b 0a 20  er->pLast = 0;. 
71d0: 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 3d 20   pPager->pAll = 
71e0: 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70 50 61 67  0;.  memset(pPag
71f0: 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c 20 73 69  er->aHash, 0, si
7200: 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 61 48 61  zeof(pPager->aHa
7210: 73 68 29 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  sh));.  pPager->
7220: 6e 50 61 67 65 20 3d 20 30 3b 0a 20 20 69 66 28  nPage = 0;.  if(
7230: 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d   pPager->state>=
7240: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29  PAGER_RESERVED )
7250: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  {.    sqlite3pag
7260: 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
7270: 65 72 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  er);.  }.  sqlit
7280: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
7290: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
72a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74  ;.  pPager->stat
72b0: 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  e = PAGER_UNLOCK
72c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69  ;.  pPager->dbSi
72d0: 7a 65 20 3d 20 2d 31 3b 0a 20 20 70 50 61 67 65  ze = -1;.  pPage
72e0: 72 2d 3e 6e 52 65 66 20 3d 20 30 3b 0a 20 20 61  r->nRef = 0;.  a
72f0: 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a  ssert( pPager->j
7300: 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b  ournalOpen==0 );
7310: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74  .}../*.** When t
7320: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
7330: 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
7340: 20 68 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c   has the journal
7350: 20 66 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a   file open and.*
7360: 2a 20 61 20 52 45 53 45 52 56 45 44 20 6f 72 20  * a RESERVED or 
7370: 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f  EXCLUSIVE lock o
7380: 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  n the database. 
7390: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
73a0: 6c 65 61 73 65 73 0a 2a 2a 20 74 68 65 20 64 61  leases.** the da
73b0: 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e 64 20  tabase lock and 
73c0: 61 63 71 75 69 72 65 73 20 61 20 53 48 41 52 45  acquires a SHARE
73d0: 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20 70 6c  D lock in its pl
73e0: 61 63 65 2e 20 20 54 68 65 20 6a 6f 75 72 6e 61  ace.  The journa
73f0: 6c 0a 2a 2a 20 66 69 6c 65 20 69 73 20 64 65 6c  l.** file is del
7400: 65 74 65 64 20 61 6e 64 20 63 6c 6f 73 65 64 2e  eted and closed.
7410: 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43 6f 6e  .**.** TODO: Con
7420: 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20 74 68  sider keeping th
7430: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7440: 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72 61 72  pen for temporar
7450: 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a 2a 20  y databases..** 
7460: 54 68 69 73 20 6d 69 67 68 74 20 67 69 76 65 20  This might give 
7470: 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6d  a performance im
7480: 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77 69 6e  provement on win
7490: 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65 6e 69  dows where openi
74a0: 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69 73 20  ng.** a file is 
74b0: 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f 70 65  an expensive ope
74c0: 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  ration..*/.stati
74d0: 63 20 69 6e 74 20 70 61 67 65 72 5f 75 6e 77 72  c int pager_unwr
74e0: 69 74 65 6c 6f 63 6b 28 50 61 67 65 72 20 2a 70  itelock(Pager *p
74f0: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
7500: 2a 70 50 67 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  *pPg;.  int rc;.
7510: 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44 42    assert( !MEMDB
7520: 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
7530: 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
7540: 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
7550: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
7560: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 70 61 67    }.  sqlite3pag
7570: 65 72 5f 73 74 6d 74 5f 63 6f 6d 6d 69 74 28 70  er_stmt_commit(p
7580: 50 61 67 65 72 29 3b 0a 20 20 69 66 28 20 70 50  Pager);.  if( pP
7590: 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29  ager->stmtOpen )
75a0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
75b0: 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73 74  lose(&pPager->st
75c0: 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  fd);.    pPager-
75d0: 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a 20  >stmtOpen = 0;. 
75e0: 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
75f0: 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a  >journalOpen ){.
7600: 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f      sqlite3OsClo
7610: 73 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 29  se(&pPager->jfd)
7620: 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f  ;.    pPager->jo
7630: 75 72 6e 61 6c 4f 70 65 6e 20 3d 20 30 3b 0a 20  urnalOpen = 0;. 
7640: 20 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65     sqlite3OsDele
7650: 74 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72  te(pPager->zJour
7660: 6e 61 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  nal);.    sqlite
7670: 46 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49  Free( pPager->aI
7680: 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20  nJournal );.    
7690: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
76a0: 61 6c 20 3d 20 30 3b 0a 20 20 20 20 66 6f 72 28  al = 0;.    for(
76b0: 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
76c0: 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
76d0: 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
76e0: 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20   pPg->inJournal 
76f0: 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
7700: 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20  dirty = 0;.     
7710: 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
7720: 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
7730: 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
7740: 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
7750: 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65  ->nRec = 0;.  }e
7760: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
7770: 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
7780: 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61 67 65 72  che==0 || pPager
7790: 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d 3d 30 20  ->useJournal==0 
77a0: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
77b0: 6c 69 74 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70  lite3OsUnlock(&p
77c0: 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41 52 45  Pager->fd, SHARE
77d0: 44 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50 61 67 65  D_LOCK);.  pPage
77e0: 72 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52  r->state = PAGER
77f0: 5f 53 48 41 52 45 44 3b 0a 20 20 70 50 61 67 65  _SHARED;.  pPage
7800: 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
7810: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 65 74  0;.  pPager->set
7820: 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 72 65  Master = 0;.  re
7830: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
7840: 2a 20 43 6f 6d 70 75 74 65 20 61 6e 64 20 72 65  * Compute and re
7850: 74 75 72 6e 20 61 20 63 68 65 63 6b 73 75 6d 20  turn a checksum 
7860: 66 6f 72 20 74 68 65 20 70 61 67 65 20 6f 66 20  for the page of 
7870: 64 61 74 61 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  data..**.** This
7880: 20 69 73 20 6e 6f 74 20 61 20 72 65 61 6c 20 63   is not a real c
7890: 68 65 63 6b 73 75 6d 2e 20 20 49 74 20 69 73 20  hecksum.  It is 
78a0: 72 65 61 6c 6c 79 20 6a 75 73 74 20 74 68 65 20  really just the 
78b0: 73 75 6d 20 6f 66 20 74 68 65 20 0a 2a 2a 20 72  sum of the .** r
78c0: 61 6e 64 6f 6d 20 69 6e 69 74 69 61 6c 20 76 61  andom initial va
78d0: 6c 75 65 20 61 6e 64 20 74 68 65 20 70 61 67 65  lue and the page
78e0: 20 6e 75 6d 62 65 72 2e 20 20 57 65 20 65 78 70   number.  We exp
78f0: 65 72 69 6d 65 6e 74 65 64 20 77 69 74 68 0a 2a  erimented with.*
7900: 2a 20 61 20 63 68 65 63 6b 73 75 6d 20 6f 66 20  * a checksum of 
7910: 74 68 65 20 65 6e 74 69 72 65 20 64 61 74 61 2c  the entire data,
7920: 20 62 75 74 20 74 68 61 74 20 77 61 73 20 66 6f   but that was fo
7930: 75 6e 64 20 74 6f 20 62 65 20 74 6f 6f 20 73 6c  und to be too sl
7940: 6f 77 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74  ow..**.** Note t
7950: 68 61 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d  hat the page num
7960: 62 65 72 20 69 73 20 73 74 6f 72 65 64 20 61 74  ber is stored at
7970: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f   the beginning o
7980: 66 20 64 61 74 61 20 61 6e 64 0a 2a 2a 20 74 68  f data and.** th
7990: 65 20 63 68 65 63 6b 73 75 6d 20 69 73 20 73 74  e checksum is st
79a0: 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64 2e  ored at the end.
79b0: 20 20 54 68 69 73 20 69 73 20 69 6d 70 6f 72 74    This is import
79c0: 61 6e 74 2e 20 20 49 66 20 6a 6f 75 72 6e 61 6c  ant.  If journal
79d0: 0a 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20 6f  .** corruption o
79e0: 63 63 75 72 73 20 64 75 65 20 74 6f 20 61 20 70  ccurs due to a p
79f0: 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 74 68  ower failure, th
7a00: 65 20 6d 6f 73 74 20 6c 69 6b 65 6c 79 20 73 63  e most likely sc
7a10: 65 6e 61 72 69 6f 0a 2a 2a 20 69 73 20 74 68 61  enario.** is tha
7a20: 74 20 6f 6e 65 20 65 6e 64 20 6f 72 20 74 68 65  t one end or the
7a30: 20 6f 74 68 65 72 20 6f 66 20 74 68 65 20 72 65   other of the re
7a40: 63 6f 72 64 20 77 69 6c 6c 20 62 65 20 63 68 61  cord will be cha
7a50: 6e 67 65 64 2e 20 20 49 74 20 69 73 0a 2a 2a 20  nged.  It is.** 
7a60: 6d 75 63 68 20 6c 65 73 73 20 6c 69 6b 65 6c 79  much less likely
7a70: 20 74 68 61 74 20 74 68 65 20 74 77 6f 20 65 6e   that the two en
7a80: 64 73 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ds of the journa
7a90: 6c 20 72 65 63 6f 72 64 20 77 69 6c 6c 20 62 65  l record will be
7aa0: 0a 2a 2a 20 63 6f 72 72 65 63 74 20 61 6e 64 20  .** correct and 
7ab0: 74 68 65 20 6d 69 64 64 6c 65 20 62 65 20 63 6f  the middle be co
7ac0: 72 72 75 70 74 2e 20 20 54 68 75 73 2c 20 74 68  rrupt.  Thus, th
7ad0: 69 73 20 22 63 68 65 63 6b 73 75 6d 22 20 73 63  is "checksum" sc
7ae0: 68 65 6d 65 2c 0a 2a 2a 20 74 68 6f 75 67 68 20  heme,.** though 
7af0: 66 61 73 74 20 61 6e 64 20 73 69 6d 70 6c 65 2c  fast and simple,
7b00: 20 63 61 74 63 68 65 73 20 74 68 65 20 6d 6f 73   catches the mos
7b10: 74 6c 79 20 6c 69 6b 65 6c 79 20 6b 69 6e 64 20  tly likely kind 
7b20: 6f 66 20 63 6f 72 72 75 70 74 69 6f 6e 2e 0a 2a  of corruption..*
7b30: 2a 0a 2a 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f  *.** FIX ME:  Co
7b40: 6e 73 69 64 65 72 20 61 64 64 69 6e 67 20 65 76  nsider adding ev
7b50: 65 72 79 20 32 30 30 74 68 20 28 6f 72 20 73 6f  ery 200th (or so
7b60: 29 20 62 79 74 65 20 6f 66 20 74 68 65 20 64 61  ) byte of the da
7b70: 74 61 20 74 6f 20 74 68 65 0a 2a 2a 20 63 68 65  ta to the.** che
7b80: 63 6b 73 75 6d 2e 20 20 54 68 61 74 20 77 61 79  cksum.  That way
7b90: 20 69 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67   if a single pag
7ba0: 65 20 73 70 61 6e 73 20 33 20 6f 72 20 6d 6f 72  e spans 3 or mor
7bb0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 20 61  e disk sectors a
7bc0: 6e 64 0a 2a 2a 20 6f 6e 6c 79 20 74 68 65 20 6d  nd.** only the m
7bd0: 69 64 64 6c 65 20 73 65 63 74 6f 72 20 69 73 20  iddle sector is 
7be0: 63 6f 72 72 75 70 74 2c 20 77 65 20 77 69 6c 6c  corrupt, we will
7bf0: 20 73 74 69 6c 6c 20 68 61 76 65 20 61 20 72 65   still have a re
7c00: 61 73 6f 6e 61 62 6c 65 0a 2a 2a 20 63 68 61 6e  asonable.** chan
7c10: 63 65 20 6f 66 20 66 61 69 6c 69 6e 67 20 74 68  ce of failing th
7c20: 65 20 63 68 65 63 6b 73 75 6d 20 61 6e 64 20 74  e checksum and t
7c30: 68 75 73 20 64 65 74 65 63 74 69 6e 67 20 74 68  hus detecting th
7c40: 65 20 70 72 6f 62 6c 65 6d 2e 0a 2a 2f 0a 73 74  e problem..*/.st
7c50: 61 74 69 63 20 75 33 32 20 70 61 67 65 72 5f 63  atic u32 pager_c
7c60: 6b 73 75 6d 28 50 61 67 65 72 20 2a 70 50 61 67  ksum(Pager *pPag
7c70: 65 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 63  er, Pgno pgno, c
7c80: 6f 6e 73 74 20 63 68 61 72 20 2a 61 44 61 74 61  onst char *aData
7c90: 29 7b 0a 20 20 75 33 32 20 63 6b 73 75 6d 20 3d  ){.  u32 cksum =
7ca0: 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
7cb0: 69 74 3b 0a 20 20 69 6e 74 20 69 20 3d 20 70 50  it;.  int i = pP
7cc0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2d 32  ager->pageSize-2
7cd0: 30 30 3b 0a 20 20 77 68 69 6c 65 28 20 69 3e 30  00;.  while( i>0
7ce0: 20 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2b 3d   ){.    cksum +=
7cf0: 20 61 44 61 74 61 5b 69 5d 3b 0a 20 20 20 20 69   aData[i];.    i
7d00: 20 2d 3d 20 32 30 30 3b 0a 20 20 7d 0a 20 20 72   -= 200;.  }.  r
7d10: 65 74 75 72 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a  eturn cksum;.}..
7d20: 2f 2a 0a 2a 2a 20 52 65 61 64 20 61 20 73 69 6e  /*.** Read a sin
7d30: 67 6c 65 20 70 61 67 65 20 66 72 6f 6d 20 74 68  gle page from th
7d40: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 6f  e journal file o
7d50: 70 65 6e 65 64 20 6f 6e 20 66 69 6c 65 20 64 65  pened on file de
7d60: 73 63 72 69 70 74 6f 72 0a 2a 2a 20 6a 66 64 2e  scriptor.** jfd.
7d70: 20 20 50 6c 61 79 62 61 63 6b 20 74 68 69 73 20    Playback this 
7d80: 6f 6e 65 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  one page..**.** 
7d90: 49 66 20 75 73 65 43 6b 73 75 6d 3d 3d 30 20 69  If useCksum==0 i
7da0: 74 20 6d 65 61 6e 73 20 74 68 69 73 20 6a 6f 75  t means this jou
7db0: 72 6e 61 6c 20 64 6f 65 73 20 6e 6f 74 20 75 73  rnal does not us
7dc0: 65 20 63 68 65 63 6b 73 75 6d 73 2e 20 20 43 68  e checksums.  Ch
7dd0: 65 63 6b 73 75 6d 73 0a 2a 2a 20 61 72 65 20 6e  ecksums.** are n
7de0: 6f 74 20 75 73 65 64 20 69 6e 20 73 74 61 74 65  ot used in state
7df0: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 62 65  ment journals be
7e00: 63 61 75 73 65 20 73 74 61 74 65 6d 65 6e 74 20  cause statement 
7e10: 6a 6f 75 72 6e 61 6c 73 20 64 6f 20 6e 6f 74 0a  journals do not.
7e20: 2a 2a 20 6e 65 65 64 20 74 6f 20 73 75 72 76 69  ** need to survi
7e30: 76 65 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65  ve power failure
7e40: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
7e50: 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 5f   pager_playback_
7e60: 6f 6e 65 5f 70 61 67 65 28 50 61 67 65 72 20 2a  one_page(Pager *
7e70: 70 50 61 67 65 72 2c 20 4f 73 46 69 6c 65 20 2a  pPager, OsFile *
7e80: 6a 66 64 2c 20 69 6e 74 20 75 73 65 43 6b 73 75  jfd, int useCksu
7e90: 6d 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  m){.  int rc;.  
7ea0: 50 67 48 64 72 20 2a 70 50 67 3b 20 20 20 20 20  PgHdr *pPg;     
7eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7ec0: 20 41 6e 20 65 78 69 73 74 69 6e 67 20 70 61 67   An existing pag
7ed0: 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 2a  e in the cache *
7ee0: 2f 0a 20 20 50 67 6e 6f 20 70 67 6e 6f 3b 20 20  /.  Pgno pgno;  
7ef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f00: 20 20 2f 2a 20 54 68 65 20 70 61 67 65 20 6e 75    /* The page nu
7f10: 6d 62 65 72 20 6f 66 20 61 20 70 61 67 65 20 69  mber of a page i
7f20: 6e 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  n journal */.  u
7f30: 33 32 20 63 6b 73 75 6d 3b 20 20 20 20 20 20 20  32 cksum;       
7f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
7f50: 43 68 65 63 6b 73 75 6d 20 75 73 65 64 20 66 6f  Checksum used fo
7f60: 72 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  r sanity checkin
7f70: 67 20 2a 2f 0a 20 20 75 38 20 61 44 61 74 61 5b  g */.  u8 aData[
7f80: 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45 5f  SQLITE_MAX_PAGE_
7f90: 53 49 5a 45 5d 3b 20 20 2f 2a 20 54 65 6d 70 20  SIZE];  /* Temp 
7fa0: 73 74 6f 72 61 67 65 20 66 6f 72 20 61 20 70 61  storage for a pa
7fb0: 67 65 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 72 65  ge */..  rc = re
7fc0: 61 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70  ad32bits(jfd, &p
7fd0: 67 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  gno);.  if( rc!=
7fe0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
7ff0: 72 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71  rn rc;.  rc = sq
8000: 6c 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c  lite3OsRead(jfd,
8010: 20 26 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d   &aData, pPager-
8020: 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66  >pageSize);.  if
8030: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
8040: 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70  ) return rc;.  p
8050: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
8060: 66 20 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67  f += pPager->pag
8070: 65 53 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a  eSize + 4;..  /*
8080: 20 53 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67   Sanity checking
8090: 20 6f 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54   on the page.  T
80a0: 68 69 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f  his is more impo
80b0: 72 74 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69  rtant that I ori
80c0: 67 69 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f  ginally.  ** tho
80d0: 75 67 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65  ught.  If a powe
80e0: 72 20 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73  r failure occurs
80f0: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
8100: 61 6c 20 69 73 20 62 65 69 6e 67 20 77 72 69 74  al is being writ
8110: 74 65 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75  ten,.  ** it cou
8120: 6c 64 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64  ld cause invalid
8130: 20 64 61 74 61 20 74 6f 20 62 65 20 77 72 69 74   data to be writ
8140: 74 65 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75  ten into the jou
8150: 72 6e 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74  rnal.  We need t
8160: 6f 0a 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68  o.  ** detect th
8170: 69 73 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20  is invalid data 
8180: 28 77 69 74 68 20 68 69 67 68 20 70 72 6f 62 61  (with high proba
8190: 62 69 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f  bility) and igno
81a0: 72 65 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  re it..  */.  if
81b0: 28 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  ( pgno==0 || pgn
81c0: 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
81d0: 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
81e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f  return SQLITE_DO
81f0: 4e 45 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67  NE;.  }.  if( pg
8200: 6e 6f 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61  no>(unsigned)pPa
8210: 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20  ger->dbSize ){. 
8220: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
8230: 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75  _OK;.  }.  if( u
8240: 73 65 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72  seCksum ){.    r
8250: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a  c = read32bits(j
8260: 66 64 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20  fd, &cksum);.   
8270: 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
8280: 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d   rc;.    pPager-
8290: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34  >journalOff += 4
82a0: 3b 0a 20 20 20 20 69 66 28 20 70 61 67 65 72 5f  ;.    if( pager_
82b0: 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 70 67  cksum(pPager, pg
82c0: 6e 6f 2c 20 61 44 61 74 61 29 21 3d 63 6b 73 75  no, aData)!=cksu
82d0: 6d 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  m ){.      retur
82e0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
82f0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 61 73 73 65     }.  }..  asse
8300: 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
8310: 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
8320: 44 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73 74 61  D || pPager->sta
8330: 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
8340: 49 56 45 20 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  IVE );..  /* If 
8350: 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e 20  the pager is in 
8360: 52 45 53 45 52 56 45 44 20 73 74 61 74 65 2c 20  RESERVED state, 
8370: 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74 20  then there must 
8380: 62 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 69  be a copy of thi
8390: 73 0a 20 20 2a 2a 20 70 61 67 65 20 69 6e 20 74  s.  ** page in t
83a0: 68 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20  he pager cache. 
83b0: 49 6e 20 74 68 69 73 20 63 61 73 65 20 6a 75 73  In this case jus
83c0: 74 20 75 70 64 61 74 65 20 74 68 65 20 70 61 67  t update the pag
83d0: 65 72 20 63 61 63 68 65 2c 0a 20 20 2a 2a 20 6e  er cache,.  ** n
83e0: 6f 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ot the database 
83f0: 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20 69  file. The page i
8400: 73 20 6c 65 66 74 20 6d 61 72 6b 65 64 20 64 69  s left marked di
8410: 72 74 79 20 69 6e 20 74 68 69 73 20 63 61 73 65  rty in this case
8420: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69  ..  **.  ** If i
8430: 6e 20 45 58 43 4c 55 53 49 56 45 20 73 74 61 74  n EXCLUSIVE stat
8440: 65 2c 20 74 68 65 6e 20 77 65 20 75 70 64 61 74  e, then we updat
8450: 65 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68  e the pager cach
8460: 65 20 69 66 20 69 74 20 65 78 69 73 74 73 0a 20  e if it exists. 
8470: 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d 61 69 6e   ** and the main
8480: 20 66 69 6c 65 2e 20 54 68 65 20 70 61 67 65 20   file. The page 
8490: 69 73 20 74 68 65 6e 20 6d 61 72 6b 65 64 20 6e  is then marked n
84a0: 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a 2f 0a 20  ot dirty..  */. 
84b0: 20 70 50 67 20 3d 20 70 61 67 65 72 5f 6c 6f 6f   pPg = pager_loo
84c0: 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  kup(pPager, pgno
84d0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  );.  assert( pPa
84e0: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
84f0: 52 5f 45 58 43 4c 55 53 49 56 45 20 7c 7c 20 70  R_EXCLUSIVE || p
8500: 50 67 20 29 3b 0a 20 20 54 52 41 43 45 33 28 22  Pg );.  TRACE3("
8510: 50 4c 41 59 42 41 43 4b 20 25 64 20 70 61 67 65  PLAYBACK %d page
8520: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
8530: 70 50 61 67 65 72 29 2c 20 70 67 6e 6f 29 3b 0a  pPager), pgno);.
8540: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
8550: 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55  ate>=PAGER_EXCLU
8560: 53 49 56 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  SIVE ){.    sqli
8570: 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61 67 65  te3OsSeek(&pPage
8580: 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31 29 2a  r->fd, (pgno-1)*
8590: 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61 67  (i64)pPager->pag
85a0: 65 53 69 7a 65 29 3b 0a 20 20 20 20 72 63 20 3d  eSize);.    rc =
85b0: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
85c0: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61  &pPager->fd, aDa
85d0: 74 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ta, pPager->page
85e0: 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28  Size);.  }.  if(
85f0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
8600: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
8610: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
8620: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
8630: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
8640: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
8650: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
8660: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
8670: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
8680: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
8690: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
86a0: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
86b0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
86c0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
86d0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
86e0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
86f0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
8700: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
8710: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
8720: 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
8730: 6b 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  k()..    */.    
8740: 76 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20  void *pData;.   
8750: 20 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d   /* assert( pPg-
8760: 3e 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d  >nRef==0 || pPg-
8770: 3e 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20  >pgno==1 ); */. 
8780: 20 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52     pData = PGHDR
8790: 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20  _TO_DATA(pPg);. 
87a0: 20 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c     memcpy(pData,
87b0: 20 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   aData, pPager->
87c0: 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69  pageSize);.    i
87d0: 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
87e0: 72 75 63 74 6f 72 20 29 7b 20 20 2f 2a 2a 2a 20  ructor ){  /*** 
87f0: 46 49 58 20 4d 45 3a 20 20 53 68 6f 75 6c 64 20  FIX ME:  Should 
8800: 74 68 69 73 20 62 65 20 78 52 65 69 6e 69 74 3f  this be xReinit?
8810: 20 2a 2a 2a 2f 0a 20 20 20 20 20 20 70 50 61 67   ***/.      pPag
8820: 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72 28  er->xDestructor(
8830: 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  pData, pPager->p
8840: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  ageSize);.    }.
8850: 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
8860: 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43  state>=PAGER_EXC
8870: 4c 55 53 49 56 45 20 29 7b 0a 20 20 20 20 20 20  LUSIVE ){.      
8880: 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a  pPg->dirty = 0;.
8890: 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53        pPg->needS
88a0: 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  ync = 0;.    }. 
88b0: 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
88c0: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
88d0: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
88e0: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
88f0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
8900: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
8910: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
8920: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
8930: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
8940: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
8950: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
8960: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
8970: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
8980: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
8990: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
89a0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
89b0: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
89c0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
89d0: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
89e0: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
89f0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
8a00: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
8a10: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
8a20: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
8a30: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
8a40: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
8a50: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
8a60: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
8a70: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
8a80: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
8a90: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
8aa0: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
8ab0: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
8ac0: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
8ad0: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
8ae0: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
8af0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
8b00: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
8b10: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
8b20: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
8b30: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
8b40: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
8b50: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
8b60: 20 6d 61 73 74 65 72 3b 0a 20 20 63 68 61 72 20   master;.  char 
8b70: 2a 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20  *zMasterJournal 
8b80: 3d 20 30 3b 20 2f 2a 20 43 6f 6e 74 65 6e 74 73  = 0; /* Contents
8b90: 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e   of master journ
8ba0: 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36 34  al file */.  i64
8bb0: 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b   nMasterJournal;
8bc0: 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f         /* Size o
8bd0: 66 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  f master journal
8be0: 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 2f 2a 20 4f   file */..  /* O
8bf0: 70 65 6e 20 74 68 65 20 6d 61 73 74 65 72 20 6a  pen the master j
8c00: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 65 78 63 6c  ournal file excl
8c10: 75 73 69 76 65 6c 79 20 69 6e 20 63 61 73 65 20  usively in case 
8c20: 73 6f 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65  some other proce
8c30: 73 73 0a 20 20 2a 2a 20 69 73 20 72 75 6e 6e 69  ss.  ** is runni
8c40: 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ng this routine 
8c50: 61 6c 73 6f 2e 20 4e 6f 74 20 74 68 61 74 20 69  also. Not that i
8c60: 74 20 6d 61 6b 65 73 20 74 6f 6f 20 6d 75 63 68  t makes too much
8c70: 20 64 69 66 66 65 72 65 6e 63 65 2e 0a 20 20 2a   difference..  *
8c80: 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6d 61 73 74  /.  memset(&mast
8c90: 65 72 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6d 61  er, 0, sizeof(ma
8ca0: 73 74 65 72 29 29 3b 0a 20 20 72 63 20 3d 20 73  ster));.  rc = s
8cb0: 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64  qlite3OsOpenRead
8cc0: 4f 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d  Only(zMaster, &m
8cd0: 61 73 74 65 72 29 3b 0a 20 20 69 66 28 20 72 63  aster);.  if( rc
8ce0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
8cf0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
8d00: 3b 0a 20 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  ;.  master_open 
8d10: 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  = 1;.  rc = sqli
8d20: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 6d  te3OsFileSize(&m
8d30: 61 73 74 65 72 2c 20 26 6e 4d 61 73 74 65 72 4a  aster, &nMasterJ
8d40: 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66 28 20 72  ournal);.  if( r
8d50: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
8d60: 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75  oto delmaster_ou
8d70: 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61 73 74 65  t;..  if( nMaste
8d80: 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b 0a 20 20  rJournal>0 ){.  
8d90: 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72 6e 61 6c    char *zJournal
8da0: 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4d 61 73  ;.    char *zMas
8db0: 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a 20 20 20  terPtr = 0;..   
8dc0: 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20 65 6e 74   /* Load the ent
8dd0: 69 72 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  ire master journ
8de0: 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20 73 70 61  al file into spa
8df0: 63 65 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ce obtained from
8e00: 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74 65 4d 61  .    ** sqliteMa
8e10: 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f 69 6e 74  lloc() and point
8e20: 65 64 20 74 6f 20 62 79 20 7a 4d 61 73 74 65 72  ed to by zMaster
8e30: 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20 20 2a 2f  Journal. .    */
8e40: 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a 6f 75 72  .    zMasterJour
8e50: 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a 29 73 71  nal = (char *)sq
8e60: 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d 61 73 74  liteMalloc(nMast
8e70: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20 20  erJournal);.    
8e80: 69 66 28 20 21 7a 4d 61 73 74 65 72 4a 6f 75 72  if( !zMasterJour
8e90: 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20  nal ){.      rc 
8ea0: 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a  = SQLITE_NOMEM;.
8eb0: 20 20 20 20 20 20 67 6f 74 6f 20 64 65 6c 6d 61        goto delma
8ec0: 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a  ster_out;.    }.
8ed0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
8ee0: 4f 73 52 65 61 64 28 26 6d 61 73 74 65 72 2c 20  OsRead(&master, 
8ef0: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 2c 20  zMasterJournal, 
8f00: 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  nMasterJournal);
8f10: 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
8f20: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 64 65  ITE_OK ) goto de
8f30: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a 20 20  lmaster_out;..  
8f40: 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a 4d 61    zJournal = zMa
8f50: 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20 20 20  sterJournal;.   
8f60: 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72 6e 61   while( (zJourna
8f70: 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  l-zMasterJournal
8f80: 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  )<nMasterJournal
8f90: 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71   ){.      if( sq
8fa0: 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69 73 74  lite3OsFileExist
8fb0: 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b 0a 20  s(zJournal) ){. 
8fc0: 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 66         /* One of
8fd0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20 70 6f   the journals po
8fe0: 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68 65 20  inted to by the 
8ff0: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 65  master journal e
9000: 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20 20 2a  xists..        *
9010: 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20 63 68  * Open it and ch
9020: 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e 74 73  eck if it points
9030: 20 61 74 20 74 68 65 20 6d 61 73 74 65 72 20 6a   at the master j
9040: 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20 20 20  ournal. If.     
9050: 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75 72 6e     ** so, return
9060: 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74 69 6e   without deletin
9070: 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  g the master jou
9080: 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20 20 20  rnal file..     
9090: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 4f 73     */.        Os
90a0: 46 69 6c 65 20 6a 6f 75 72 6e 61 6c 3b 0a 20 20  File journal;.  
90b0: 20 20 20 20 20 20 69 6e 74 20 63 3b 0a 0a 20 20        int c;..  
90c0: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6a 6f        memset(&jo
90d0: 75 72 6e 61 6c 2c 20 30 2c 20 73 69 7a 65 6f 66  urnal, 0, sizeof
90e0: 28 6a 6f 75 72 6e 61 6c 29 29 3b 0a 20 20 20 20  (journal));.    
90f0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
9100: 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c 79 28 7a  OsOpenReadOnly(z
9110: 4a 6f 75 72 6e 61 6c 2c 20 26 6a 6f 75 72 6e 61  Journal, &journa
9120: 6c 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  l);.        if( 
9130: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
9140: 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
9150: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20  delmaster_out;. 
9160: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
9170: 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73 74 65    rc = readMaste
9180: 72 4a 6f 75 72 6e 61 6c 28 26 6a 6f 75 72 6e 61  rJournal(&journa
9190: 6c 2c 20 26 7a 4d 61 73 74 65 72 50 74 72 29 3b  l, &zMasterPtr);
91a0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
91b0: 4f 73 43 6c 6f 73 65 28 26 6a 6f 75 72 6e 61 6c  OsClose(&journal
91c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
91d0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
91e0: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64            goto d
91f0: 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20  elmaster_out;.  
9200: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
9210: 20 63 20 3d 20 7a 4d 61 73 74 65 72 50 74 72 21   c = zMasterPtr!
9220: 3d 30 20 26 26 20 73 74 72 63 6d 70 28 7a 4d 61  =0 && strcmp(zMa
9230: 73 74 65 72 50 74 72 2c 20 7a 4d 61 73 74 65 72  sterPtr, zMaster
9240: 29 3d 3d 30 3b 0a 20 20 20 20 20 20 20 20 73 71  )==0;.        sq
9250: 6c 69 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72  liteFree(zMaster
9260: 50 74 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Ptr);.        if
9270: 28 20 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ( c ){.         
9280: 20 2f 2a 20 57 65 20 68 61 76 65 20 61 20 6d 61   /* We have a ma
9290: 74 63 68 2e 20 44 6f 20 6e 6f 74 20 64 65 6c 65  tch. Do not dele
92a0: 74 65 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  te the master jo
92b0: 75 72 6e 61 6c 20 66 69 6c 65 2e 20 2a 2f 0a 20  urnal file. */. 
92c0: 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 64 65           goto de
92d0: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
92e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
92f0: 20 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 2b 3d       zJournal +=
9300: 20 28 73 74 72 6c 65 6e 28 7a 4a 6f 75 72 6e 61   (strlen(zJourna
9310: 6c 29 2b 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  l)+1);.    }.  }
9320: 0a 20 20 0a 20 20 73 71 6c 69 74 65 33 4f 73 44  .  .  sqlite3OsD
9330: 65 6c 65 74 65 28 7a 4d 61 73 74 65 72 29 3b 0a  elete(zMaster);.
9340: 0a 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3a 0a  .delmaster_out:.
9350: 20 20 69 66 28 20 7a 4d 61 73 74 65 72 4a 6f 75    if( zMasterJou
9360: 72 6e 61 6c 20 29 7b 0a 20 20 20 20 73 71 6c 69  rnal ){.    sqli
9370: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 4a 6f  teFree(zMasterJo
9380: 75 72 6e 61 6c 29 3b 0a 20 20 7d 20 20 0a 20 20  urnal);.  }  .  
9390: 69 66 28 20 6d 61 73 74 65 72 5f 6f 70 65 6e 20  if( master_open 
93a0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
93b0: 43 6c 6f 73 65 28 26 6d 61 73 74 65 72 29 3b 0a  Close(&master);.
93c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
93d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 65  .}../*.** Make e
93e0: 76 65 72 79 20 70 61 67 65 20 69 6e 20 74 68 65  very page in the
93f0: 20 63 61 63 68 65 20 61 67 72 65 65 20 77 69 74   cache agree wit
9400: 68 20 77 68 61 74 20 69 73 20 6f 6e 20 64 69 73  h what is on dis
9410: 6b 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  k.  In other wor
9420: 64 73 2c 0a 2a 2a 20 72 65 72 65 61 64 20 74 68  ds,.** reread th
9430: 65 20 64 69 73 6b 20 74 6f 20 72 65 73 65 74 20  e disk to reset 
9440: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
9450: 20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   cache..**.** Th
9460: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61  is routine is ca
9470: 6c 6c 65 64 20 61 66 74 65 72 20 61 20 72 6f 6c  lled after a rol
9480: 6c 62 61 63 6b 20 69 6e 20 77 68 69 63 68 20 73  lback in which s
9490: 6f 6d 65 20 6f 66 20 74 68 65 20 64 69 72 74 79  ome of the dirty
94a0: 20 63 61 63 68 65 0a 2a 2a 20 70 61 67 65 73 20   cache.** pages 
94b0: 68 61 64 20 6e 65 76 65 72 20 62 65 65 6e 20 77  had never been w
94c0: 72 69 74 74 65 6e 20 6f 75 74 20 74 6f 20 64 69  ritten out to di
94d0: 73 6b 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 20  sk.  We need to 
94e0: 72 6f 6c 6c 20 62 61 63 6b 20 74 68 65 0a 2a 2a  roll back the.**
94f0: 20 63 61 63 68 65 20 63 6f 6e 74 65 6e 74 20 61   cache content a
9500: 6e 64 20 74 68 65 20 65 61 73 69 65 73 74 20 77  nd the easiest w
9510: 61 79 20 74 6f 20 64 6f 20 74 68 61 74 20 69 73  ay to do that is
9520: 20 74 6f 20 72 65 72 65 61 64 20 74 68 65 20 6f   to reread the o
9530: 6c 64 20 63 6f 6e 74 65 6e 74 0a 2a 2a 20 62 61  ld content.** ba
9540: 63 6b 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ck from the disk
9550: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9560: 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63  pager_reload_cac
9570: 68 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  he(Pager *pPager
9580: 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b  ){.  PgHdr *pPg;
9590: 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
95a0: 54 45 5f 4f 4b 3b 0a 20 20 66 6f 72 28 70 50 67  TE_OK;.  for(pPg
95b0: 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
95c0: 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
95d0: 78 74 41 6c 6c 29 7b 0a 20 20 20 20 63 68 61 72  xtAll){.    char
95e0: 20 7a 42 75 66 5b 53 51 4c 49 54 45 5f 4d 41 58   zBuf[SQLITE_MAX
95f0: 5f 50 41 47 45 5f 53 49 5a 45 5d 3b 0a 20 20 20  _PAGE_SIZE];.   
9600: 20 69 66 28 20 21 70 50 67 2d 3e 64 69 72 74 79   if( !pPg->dirty
9610: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9620: 20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70   if( (int)pPg->p
9630: 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f  gno <= pPager->o
9640: 72 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20  rigDbSize ){.   
9650: 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
9660: 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50  (&pPager->fd, pP
9670: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 2a 28  ager->pageSize*(
9680: 69 36 34 29 28 70 50 67 2d 3e 70 67 6e 6f 2d 31  i64)(pPg->pgno-1
9690: 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  ));.      rc = s
96a0: 71 6c 69 74 65 33 4f 73 52 65 61 64 28 26 70 50  qlite3OsRead(&pP
96b0: 61 67 65 72 2d 3e 66 64 2c 20 7a 42 75 66 2c 20  ager->fd, zBuf, 
96c0: 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
96d0: 29 3b 0a 20 20 20 20 20 20 54 52 41 43 45 33 28  );.      TRACE3(
96e0: 22 52 45 46 45 54 43 48 20 25 64 20 70 61 67 65  "REFETCH %d page
96f0: 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
9700: 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
9710: 6e 6f 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  no);.      if( r
9720: 63 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  c ) break;.     
9730: 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 7a   CODEC(pPager, z
9740: 42 75 66 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20  Buf, pPg->pgno, 
9750: 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  2);.    }else{. 
9760: 20 20 20 20 20 6d 65 6d 73 65 74 28 7a 42 75 66       memset(zBuf
9770: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
9780: 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20  eSize);.    }.  
9790: 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3d    if( pPg->nRef=
97a0: 3d 30 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 42 75  =0 || memcmp(zBu
97b0: 66 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  f, PGHDR_TO_DATA
97c0: 28 70 50 67 29 2c 20 70 50 61 67 65 72 2d 3e 70  (pPg), pPager->p
97d0: 61 67 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20  ageSize) ){.    
97e0: 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
97f0: 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 7a 42 75  O_DATA(pPg), zBu
9800: 66 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  f, pPager->pageS
9810: 69 7a 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ize);.      if( 
9820: 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65  pPager->xReinite
9830: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61  r ){.        pPa
9840: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 50  ger->xReiniter(P
9850: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
9860: 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
9870: 69 7a 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ize);.      }els
9880: 65 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65  e{.        memse
9890: 74 28 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  t(PGHDR_TO_EXTRA
98a0: 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30  (pPg, pPager), 0
98b0: 2c 20 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61  , pPager->nExtra
98c0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
98d0: 0a 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79  .    pPg->needSy
98e0: 6e 63 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d  nc = 0;.    pPg-
98f0: 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a  >dirty = 0;.  }.
9900: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
9910: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
9920: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
9930: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
9940: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
9950: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
9960: 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ted..*/.static i
9970: 6e 74 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74  nt pager_truncat
9980: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
9990: 20 69 6e 74 20 6e 50 61 67 65 29 7b 0a 20 20 72   int nPage){.  r
99a0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 4f 73 54  eturn sqlite3OsT
99b0: 72 75 6e 63 61 74 65 28 26 70 50 61 67 65 72 2d  runcate(&pPager-
99c0: 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  >fd, pPager->pag
99d0: 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61 67 65  eSize*(i64)nPage
99e0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79  );.}../*.** Play
99f0: 62 61 63 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c  back the journal
9a00: 20 61 6e 64 20 74 68 75 73 20 72 65 73 74 6f 72   and thus restor
9a10: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  e the database f
9a20: 69 6c 65 20 74 6f 0a 2a 2a 20 74 68 65 20 73 74  ile to.** the st
9a30: 61 74 65 20 69 74 20 77 61 73 20 69 6e 20 62 65  ate it was in be
9a40: 66 6f 72 65 20 77 65 20 73 74 61 72 74 65 64 20  fore we started 
9a50: 6d 61 6b 69 6e 67 20 63 68 61 6e 67 65 73 2e 20  making changes. 
9a60: 20 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72   .**.** The jour
9a70: 6e 61 6c 20 66 69 6c 65 20 66 6f 72 6d 61 74 20  nal file format 
9a80: 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a  is as follows: .
9a90: 2a 2a 0a 2a 2a 20 20 28 31 29 20 20 38 20 62 79  **.**  (1)  8 by
9aa0: 74 65 20 70 72 65 66 69 78 2e 20 20 41 20 63 6f  te prefix.  A co
9ab0: 70 79 20 6f 66 20 61 4a 6f 75 72 6e 61 6c 4d 61  py of aJournalMa
9ac0: 67 69 63 5b 5d 2e 0a 2a 2a 20 20 28 32 29 20 20  gic[]..**  (2)  
9ad0: 34 20 62 79 74 65 20 62 69 67 2d 65 6e 64 69 61  4 byte big-endia
9ae0: 6e 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20  n integer which 
9af0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9b00: 20 76 61 6c 69 64 20 70 61 67 65 20 72 65 63 6f   valid page reco
9b10: 72 64 73 0a 2a 2a 20 20 20 20 20 20 20 69 6e 20  rds.**       in 
9b20: 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 49 66  the journal.  If
9b30: 20 74 68 69 73 20 76 61 6c 75 65 20 69 73 20 30   this value is 0
9b40: 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20  xffffffff, then 
9b50: 63 6f 6d 70 75 74 65 20 74 68 65 0a 2a 2a 20 20  compute the.**  
9b60: 20 20 20 20 20 6e 75 6d 62 65 72 20 6f 66 20 70       number of p
9b70: 61 67 65 20 72 65 63 6f 72 64 73 20 66 72 6f 6d  age records from
9b80: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 73 69 7a   the journal siz
9b90: 65 2e 0a 2a 2a 20 20 28 33 29 20 20 34 20 62 79  e..**  (3)  4 by
9ba0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
9bb0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
9bc0: 68 65 20 69 6e 69 74 69 61 6c 20 76 61 6c 75 65  he initial value
9bd0: 20 66 6f 72 20 74 68 65 20 0a 2a 2a 20 20 20 20   for the .**    
9be0: 20 20 20 73 61 6e 69 74 79 20 63 68 65 63 6b 73     sanity checks
9bf0: 75 6d 2e 0a 2a 2a 20 20 28 34 29 20 20 34 20 62  um..**  (4)  4 b
9c00: 79 74 65 20 69 6e 74 65 67 65 72 20 77 68 69 63  yte integer whic
9c10: 68 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  h is the number 
9c20: 6f 66 20 70 61 67 65 73 20 74 6f 20 74 72 75 6e  of pages to trun
9c30: 63 61 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20  cate the.**     
9c40: 20 20 64 61 74 61 62 61 73 65 20 74 6f 20 64 75    database to du
9c50: 72 69 6e 67 20 61 20 72 6f 6c 6c 62 61 63 6b 2e  ring a rollback.
9c60: 0a 2a 2a 20 20 28 35 29 20 20 34 20 62 79 74 65  .**  (5)  4 byte
9c70: 20 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69   integer which i
9c80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
9c90: 62 79 74 65 73 20 69 6e 20 74 68 65 20 6d 61 73  bytes in the mas
9ca0: 74 65 72 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20  ter journal.**  
9cb0: 20 20 20 20 20 6e 61 6d 65 2e 20 20 54 68 65 20       name.  The 
9cc0: 76 61 6c 75 65 20 6d 61 79 20 62 65 20 7a 65 72  value may be zer
9cd0: 6f 20 28 69 6e 64 69 63 61 74 65 20 74 68 61 74  o (indicate that
9ce0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 73   there is no mas
9cf0: 74 65 72 0a 2a 2a 20 20 20 20 20 20 20 6a 6f 75  ter.**       jou
9d00: 72 6e 61 6c 2e 29 0a 2a 2a 20 20 28 36 29 20 20  rnal.).**  (6)  
9d10: 4e 20 62 79 74 65 73 20 6f 66 20 74 68 65 20 6d  N bytes of the m
9d20: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
9d30: 6d 65 2e 20 20 54 68 65 20 6e 61 6d 65 20 77 69  me.  The name wi
9d40: 6c 6c 20 62 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ll be nul-termin
9d50: 61 74 65 64 0a 2a 2a 20 20 20 20 20 20 20 61 6e  ated.**       an
9d60: 64 20 6d 69 67 68 74 20 62 65 20 73 68 6f 72 74  d might be short
9d70: 65 72 20 74 68 61 6e 20 74 68 65 20 76 61 6c 75  er than the valu
9d80: 65 20 72 65 61 64 20 66 72 6f 6d 20 28 35 29 2e  e read from (5).
9d90: 20 20 49 66 20 74 68 65 20 66 69 72 73 74 20 62    If the first b
9da0: 79 74 65 0a 2a 2a 20 20 20 20 20 20 20 6f 66 20  yte.**       of 
9db0: 74 68 65 20 6e 61 6d 65 20 69 73 20 5c 30 30 30  the name is \000
9dc0: 20 74 68 65 6e 20 74 68 65 72 65 20 69 73 20 6e   then there is n
9dd0: 6f 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  o master journal
9de0: 2e 20 20 54 68 65 20 6d 61 73 74 65 72 0a 2a 2a  .  The master.**
9df0: 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c 20 6e         journal n
9e00: 61 6d 65 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ame is stored in
9e10: 20 55 54 46 2d 38 2e 0a 2a 2a 20 20 28 37 29 20   UTF-8..**  (7) 
9e20: 20 5a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 70 61   Zero or more pa
9e30: 67 65 73 20 69 6e 73 74 61 6e 63 65 73 2c 20 65  ges instances, e
9e40: 61 63 68 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a  ach as follows:.
9e50: 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 34 20 62  **        +  4 b
9e60: 79 74 65 20 70 61 67 65 20 6e 75 6d 62 65 72 2e  yte page number.
9e70: 0a 2a 2a 20 20 20 20 20 20 20 20 2b 20 20 70 50  .**        +  pP
9e80: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
9e90: 79 74 65 73 20 6f 66 20 64 61 74 61 2e 0a 2a 2a  ytes of data..**
9ea0: 20 20 20 20 20 20 20 20 2b 20 20 34 20 62 79 74          +  4 byt
9eb0: 65 20 63 68 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a  e checksum.**.**
9ec0: 20 57 68 65 6e 20 77 65 20 73 70 65 61 6b 20 6f   When we speak o
9ed0: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
9ee0: 61 64 65 72 2c 20 77 65 20 6d 65 61 6e 20 74 68  ader, we mean th
9ef0: 65 20 66 69 72 73 74 20 36 20 69 74 65 6d 73 20  e first 6 items 
9f00: 61 62 6f 76 65 2e 0a 2a 2a 20 45 61 63 68 20 65  above..** Each e
9f10: 6e 74 72 79 20 69 6e 20 74 68 65 20 6a 6f 75 72  ntry in the jour
9f20: 6e 61 6c 20 69 73 20 61 6e 20 69 6e 73 74 61 6e  nal is an instan
9f30: 63 65 20 6f 66 20 74 68 65 20 37 74 68 20 69 74  ce of the 7th it
9f40: 65 6d 2e 0a 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74  em..**.** Call t
9f50: 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68  he value from th
9f60: 65 20 73 65 63 6f 6e 64 20 62 75 6c 6c 65 74 20  e second bullet 
9f70: 22 6e 52 65 63 22 2e 20 20 6e 52 65 63 20 69 73  "nRec".  nRec is
9f80: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
9f90: 2a 20 76 61 6c 69 64 20 70 61 67 65 20 65 6e 74  * valid page ent
9fa0: 72 69 65 73 20 69 6e 20 74 68 65 20 6a 6f 75 72  ries in the jour
9fb0: 6e 61 6c 2e 20 20 49 6e 20 6d 6f 73 74 20 63 61  nal.  In most ca
9fc0: 73 65 73 2c 20 79 6f 75 20 63 61 6e 20 63 6f 6d  ses, you can com
9fd0: 70 75 74 65 20 74 68 65 0a 2a 2a 20 76 61 6c 75  pute the.** valu
9fe0: 65 20 6f 66 20 6e 52 65 63 20 66 72 6f 6d 20 74  e of nRec from t
9ff0: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
a000: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 42 75  ournal file.  Bu
a010: 74 20 69 66 20 61 20 70 6f 77 65 72 0a 2a 2a 20  t if a power.** 
a020: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 72 65 64  failure occurred
a030: 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e   while the journ
a040: 61 6c 20 77 61 73 20 62 65 69 6e 67 20 77 72 69  al was being wri
a050: 74 74 65 6e 2c 20 69 74 20 63 6f 75 6c 64 20 62  tten, it could b
a060: 65 20 74 68 65 0a 2a 2a 20 63 61 73 65 20 74 68  e the.** case th
a070: 61 74 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  at the size of t
a080: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20  he journal file 
a090: 68 61 64 20 61 6c 72 65 61 64 79 20 62 65 65 6e  had already been
a0a0: 20 69 6e 63 72 65 61 73 65 64 20 62 75 74 0a 2a   increased but.*
a0b0: 2a 20 74 68 65 20 65 78 74 72 61 20 65 6e 74 72  * the extra entr
a0c0: 69 65 73 20 68 61 64 20 6e 6f 74 20 79 65 74 20  ies had not yet 
a0d0: 6d 61 64 65 20 69 74 20 73 61 66 65 6c 79 20 74  made it safely t
a0e0: 6f 20 64 69 73 6b 2e 20 20 49 6e 20 73 75 63 68  o disk.  In such
a0f0: 20 61 20 63 61 73 65 2c 0a 2a 2a 20 74 68 65 20   a case,.** the 
a100: 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20 63 6f  value of nRec co
a110: 6d 70 75 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mputed from the 
a120: 66 69 6c 65 20 73 69 7a 65 20 77 6f 75 6c 64 20  file size would 
a130: 62 65 20 74 6f 6f 20 6c 61 72 67 65 2e 20 20 46  be too large.  F
a140: 6f 72 0a 2a 2a 20 74 68 61 74 20 72 65 61 73 6f  or.** that reaso
a150: 6e 2c 20 77 65 20 61 6c 77 61 79 73 20 75 73 65  n, we always use
a160: 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
a170: 69 6e 20 74 68 65 20 68 65 61 64 65 72 2e 0a 2a  in the header..*
a180: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 52 65 63  *.** If the nRec
a190: 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66 66   value is 0xffff
a1a0: 66 66 66 66 20 69 74 20 6d 65 61 6e 73 20 74 68  ffff it means th
a1b0: 61 74 20 6e 52 65 63 20 73 68 6f 75 6c 64 20 62  at nRec should b
a1c0: 65 20 63 6f 6d 70 75 74 65 64 0a 2a 2a 20 66 72  e computed.** fr
a1d0: 6f 6d 20 74 68 65 20 66 69 6c 65 20 73 69 7a 65  om the file size
a1e0: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 69 73  .  This value is
a1f0: 20 75 73 65 64 20 77 68 65 6e 20 74 68 65 20 75   used when the u
a200: 73 65 72 20 73 65 6c 65 63 74 73 20 74 68 65 0a  ser selects the.
a210: 2a 2a 20 6e 6f 2d 73 79 6e 63 20 6f 70 74 69 6f  ** no-sync optio
a220: 6e 20 66 6f 72 20 74 68 65 20 6a 6f 75 72 6e 61  n for the journa
a230: 6c 2e 20 20 41 20 70 6f 77 65 72 20 66 61 69 6c  l.  A power fail
a240: 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 64 20 74  ure could lead t
a250: 6f 20 63 6f 72 72 75 70 74 69 6f 6e 0a 2a 2a 20  o corruption.** 
a260: 69 6e 20 74 68 69 73 20 63 61 73 65 2e 20 20 42  in this case.  B
a270: 75 74 20 66 6f 72 20 74 68 69 6e 67 73 20 6c 69  ut for things li
a280: 6b 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  ke temporary tab
a290: 6c 65 20 28 77 68 69 63 68 20 77 69 6c 6c 20 62  le (which will b
a2a0: 65 0a 2a 2a 20 64 65 6c 65 74 65 64 20 77 68 65  e.** deleted whe
a2b0: 6e 20 74 68 65 20 70 6f 77 65 72 20 69 73 20 72  n the power is r
a2c0: 65 73 74 6f 72 65 64 29 20 77 65 20 64 6f 6e 27  estored) we don'
a2d0: 74 20 63 61 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20  t care.  .**.** 
a2e0: 49 66 20 74 68 65 20 66 69 6c 65 20 6f 70 65 6e  If the file open
a2f0: 65 64 20 61 73 20 74 68 65 20 6a 6f 75 72 6e 61  ed as the journa
a300: 6c 20 66 69 6c 65 20 69 73 20 6e 6f 74 20 61 20  l file is not a 
a310: 77 65 6c 6c 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a  well-formed.** j
a320: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 74 68 65 6e  ournal file then
a330: 20 61 6c 6c 20 70 61 67 65 73 20 75 70 20 74 6f   all pages up to
a340: 20 74 68 65 20 66 69 72 73 74 20 63 6f 72 72 75   the first corru
a350: 70 74 65 64 20 70 61 67 65 20 61 72 65 20 72 6f  pted page are ro
a360: 6c 6c 65 64 0a 2a 2a 20 62 61 63 6b 20 28 6f 72  lled.** back (or
a370: 20 6e 6f 20 70 61 67 65 73 20 69 66 20 74 68 65   no pages if the
a380: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
a390: 69 73 20 63 6f 72 72 75 70 74 65 64 29 2e 20 54  is corrupted). T
a3a0: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 0a  he journal file.
a3b0: 2a 2a 20 69 73 20 74 68 65 6e 20 64 65 6c 65 74  ** is then delet
a3c0: 65 64 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b  ed and SQLITE_OK
a3d0: 20 72 65 74 75 72 6e 65 64 2c 20 6a 75 73 74 20   returned, just 
a3e0: 61 73 20 69 66 20 6e 6f 20 63 6f 72 72 75 70 74  as if no corrupt
a3f0: 69 6f 6e 20 68 61 64 0a 2a 2a 20 62 65 65 6e 20  ion had.** been 
a400: 65 6e 63 6f 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a  encountered..**.
a410: 2a 2a 20 49 66 20 61 6e 20 49 2f 4f 20 6f 72 20  ** If an I/O or 
a420: 6d 61 6c 6c 6f 63 28 29 20 65 72 72 6f 72 20 6f  malloc() error o
a430: 63 63 75 72 73 2c 20 74 68 65 20 6a 6f 75 72 6e  ccurs, the journ
a440: 61 6c 2d 66 69 6c 65 20 69 73 20 6e 6f 74 20 64  al-file is not d
a450: 65 6c 65 74 65 64 0a 2a 2a 20 61 6e 64 20 61 6e  eleted.** and an
a460: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 72   error code is r
a470: 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74  eturned..*/.stat
a480: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
a490: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
a4a0: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4c0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
a4d0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 20  journal file in 
a4e0: 62 79 74 65 73 20 2a 2f 0a 20 20 75 33 32 20 6e  bytes */.  u32 n
a4f0: 52 65 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  Rec;            
a500: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a510: 20 52 65 63 6f 72 64 73 20 69 6e 20 74 68 65 20   Records in the 
a520: 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 69 6e 74  journal */.  int
a530: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
a540: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
a550: 75 6e 74 65 72 20 2a 2f 0a 20 20 50 67 6e 6f 20  unter */.  Pgno 
a560: 6d 78 50 67 20 3d 20 30 3b 20 20 20 20 20 20 20  mxPg = 0;       
a570: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74      /* Size of t
a580: 68 65 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  he original file
a590: 20 69 6e 20 70 61 67 65 73 20 2a 2f 0a 20 20 69   in pages */.  i
a5a0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
a5b0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c          /* Resul
a5c0: 74 20 63 6f 64 65 20 6f 66 20 61 20 73 75 62 72  t code of a subr
a5d0: 6f 75 74 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72  outine */.  char
a5e0: 20 2a 7a 4d 61 73 74 65 72 20 3d 20 30 3b 20 20   *zMaster = 0;  
a5f0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
a600: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
a610: 69 6c 65 20 69 66 20 61 6e 79 20 2a 2f 0a 0a 20  ile if any */.. 
a620: 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 68   /* Figure out h
a630: 6f 77 20 6d 61 6e 79 20 72 65 63 6f 72 64 73 20  ow many records 
a640: 61 72 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e  are in the journ
a650: 61 6c 2e 20 20 41 62 6f 72 74 20 65 61 72 6c 79  al.  Abort early
a660: 20 69 66 0a 20 20 2a 2a 20 74 68 65 20 6a 6f 75   if.  ** the jou
a670: 72 6e 61 6c 20 69 73 20 65 6d 70 74 79 2e 0a 20  rnal is empty.. 
a680: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50   */.  assert( pP
a690: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
a6a0: 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  n );.  rc = sqli
a6b0: 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70  te3OsFileSize(&p
a6c0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 73 7a 4a  Pager->jfd, &szJ
a6d0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
a6e0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 67 6f  ITE_OK ){.    go
a6f0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a700: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
a710: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
a720: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
a730: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
a740: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
a750: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
a760: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
a770: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
a780: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
a790: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
a7a0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
a7b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
a7c0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
a7d0: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
a7e0: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
a7f0: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
a800: 74 65 72 4a 6f 75 72 6e 61 6c 28 26 70 50 61 67  terJournal(&pPag
a810: 65 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65  er->jfd, &zMaste
a820: 72 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63  r);.  assert( rc
a830: 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b  !=SQLITE_DONE );
a840: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
a850: 45 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72  E_OK || (zMaster
a860: 20 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69   && !sqlite3OsFi
a870: 6c 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72  leExists(zMaster
a880: 29 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  )) ){.    sqlite
a890: 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20  Free(zMaster);. 
a8a0: 20 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a     zMaster = 0;.
a8b0: 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
a8c0: 54 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53  TE_DONE ) rc = S
a8d0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f  QLITE_OK;.    go
a8e0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
a8f0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73  .  }.  sqlite3Os
a900: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
a910: 64 2c 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d  d, 0);.  pPager-
a920: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b  >journalOff = 0;
a930: 0a 0a 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70  ..  /* This loop
a940: 20 74 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68   terminates eith
a950: 65 72 20 77 68 65 6e 20 74 68 65 20 72 65 61 64  er when the read
a960: 4a 6f 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c  JournalHdr() cal
a970: 6c 20 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53  l returns.  ** S
a980: 51 4c 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e  QLITE_DONE or an
a990: 20 49 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73   IO error occurs
a9a0: 2e 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20  . */.  while( 1 
a9b0: 29 7b 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20  ){..    /* Read 
a9c0: 74 68 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c  the next journal
a9d0: 20 68 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65   header from the
a9e0: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20   journal file.  
a9f0: 49 66 20 74 68 65 72 65 20 61 72 65 0a 20 20 20  If there are.   
aa00: 20 2a 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62   ** not enough b
aa10: 79 74 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65  ytes left in the
aa20: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f   journal file fo
aa30: 72 20 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61  r a complete hea
aa40: 64 65 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69  der, or.    ** i
aa50: 74 20 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20  t is corrupted, 
aa60: 74 68 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d  then a process m
aa70: 75 73 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68  ust of failed wh
aa80: 69 6c 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a  ile writing it..
aa90: 20 20 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69      ** This indi
aaa0: 63 61 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f  cates nothing mo
aab0: 72 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  re needs to be r
aac0: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
aad0: 2a 2f 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64  */.    rc = read
aae0: 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
aaf0: 72 2c 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26  r, szJ, &nRec, &
ab00: 6d 78 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72  mxPg);.    if( r
ab10: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20  c!=SQLITE_OK ){ 
ab20: 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
ab30: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
ab40: 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
ab50: 45 5f 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  E_OK;.      }.  
ab60: 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61      goto end_pla
ab70: 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  yback;.    }..  
ab80: 20 20 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20    /* If nRec is 
ab90: 30 78 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e  0xffffffff, then
aba0: 20 74 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61   this journal wa
abb0: 73 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  s created by a p
abc0: 72 6f 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f  rocess.    ** wo
abd0: 72 6b 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63  rking in no-sync
abe0: 20 6d 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e   mode. This mean
abf0: 73 20 74 68 61 74 20 74 68 65 20 72 65 73 74 20  s that the rest 
ac00: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20  of the journal. 
ac10: 20 20 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69     ** file consi
ac20: 73 74 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68  sts of pages, th
ac30: 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20  ere are no more 
ac40: 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e  journal headers.
ac50: 20 43 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20   Compute.    ** 
ac60: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65  the value of nRe
ac70: 63 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20  c based on this 
ac80: 61 73 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20  assumption..    
ac90: 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d  */.    if( nRec=
aca0: 3d 30 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20  =0xffffffff ){. 
acb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
acc0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d  ger->journalOff=
acd0: 3d 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28  =JOURNAL_HDR_SZ(
ace0: 70 50 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20  pPager) );.     
acf0: 20 6e 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a   nRec = (szJ - J
ad00: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
ad10: 61 67 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50  ager))/JOURNAL_P
ad20: 47 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20  G_SZ(pPager);.  
ad30: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74    }..    /* If t
ad40: 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73 74  his is the first
ad50: 20 68 65 61 64 65 72 20 72 65 61 64 20 66 72 6f   header read fro
ad60: 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2c 20 74  m the journal, t
ad70: 72 75 6e 63 61 74 65 20 74 68 65 0a 20 20 20 20  runcate the.    
ad80: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
ad90: 20 62 61 63 6b 20 74 6f 20 69 74 27 73 20 6f 72   back to it's or
ada0: 69 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 20  iginal size..   
adb0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 61 67   */.    if( pPag
adc0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d  er->journalOff==
add0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
ade0: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20  Pager) ){.      
adf0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
ae00: 6f 72 69 67 44 62 53 69 7a 65 3d 3d 30 20 7c 7c  origDbSize==0 ||
ae10: 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53   pPager->origDbS
ae20: 69 7a 65 3d 3d 6d 78 50 67 20 29 3b 0a 20 20 20  ize==mxPg );.   
ae30: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72     rc = pager_tr
ae40: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6d  uncate(pPager, m
ae50: 78 50 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  xPg);.      if( 
ae60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
ae70: 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  .        goto en
ae80: 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20 20  d_playback;.    
ae90: 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
aea0: 2d 3e 64 62 53 69 7a 65 20 3d 20 6d 78 50 67 3b  ->dbSize = mxPg;
aeb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 72  .    }..    /* r
aec0: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65  c = sqlite3OsSee
aed0: 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  k(&pPager->jfd, 
aee0: 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70  JOURNAL_HDR_SZ(p
aef0: 50 61 67 65 72 29 29 3b 20 2a 2f 0a 20 20 20 20  Pager)); */.    
af00: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
af10: 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61  K ) goto end_pla
af20: 79 62 61 63 6b 3b 0a 20 20 0a 20 20 20 20 2f 2a  yback;.  .    /*
af30: 20 43 6f 70 79 20 6f 72 69 67 69 6e 61 6c 20 70   Copy original p
af40: 61 67 65 73 20 6f 75 74 20 6f 66 20 74 68 65 20  ages out of the 
af50: 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b  journal and back
af60: 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62 61   into the databa
af70: 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a  se file..    */.
af80: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
af90: 52 65 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Rec; i++){.     
afa0: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
afb0: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
afc0: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a  ager, &pPager->j
afd0: 66 64 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  fd, 1);.      if
afe0: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
aff0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  ){.        if( r
b000: 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
b010: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
b020: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20   SQLITE_OK;.    
b030: 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
b040: 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a 3b 0a  urnalOff = szJ;.
b050: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
b060: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
b070: 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65            goto e
b080: 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20 20  nd_playback;.   
b090: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
b0a0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
b0b0: 61 67 65 73 20 74 68 61 74 20 68 61 76 65 20 62  ages that have b
b0c0: 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 74  een written to t
b0d0: 68 65 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 6e  he journal but n
b0e0: 65 76 65 72 20 73 79 6e 63 65 64 0a 20 20 2a 2a  ever synced.  **
b0f0: 20 77 68 65 72 65 20 6e 6f 74 20 72 65 73 74 6f   where not resto
b100: 72 65 64 20 62 79 20 74 68 65 20 6c 6f 6f 70 20  red by the loop 
b110: 61 62 6f 76 65 2e 20 20 57 65 20 68 61 76 65 20  above.  We have 
b120: 74 6f 20 72 65 73 74 6f 72 65 20 74 68 6f 73 65  to restore those
b130: 0a 20 20 2a 2a 20 70 61 67 65 73 20 62 79 20 72  .  ** pages by r
b140: 65 61 64 69 6e 67 20 74 68 65 6d 20 62 61 63 6b  eading them back
b150: 20 66 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e   from the origin
b160: 61 6c 20 64 61 74 61 62 61 73 65 2e 0a 20 20 2a  al database..  *
b170: 2f 0a 20 20 61 73 73 65 72 74 28 20 72 63 3d 3d  /.  assert( rc==
b180: 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 70  SQLITE_OK );.  p
b190: 61 67 65 72 5f 72 65 6c 6f 61 64 5f 63 61 63 68  ager_reload_cach
b1a0: 65 28 70 50 61 67 65 72 29 3b 0a 0a 65 6e 64 5f  e(pPager);..end_
b1b0: 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28 20  playback:.  if( 
b1c0: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
b1d0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
b1e0: 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67  unwritelock(pPag
b1f0: 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  er);.  }.  if( z
b200: 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20 2f 2a  Master ){.    /*
b210: 20 49 66 20 74 68 65 72 65 20 77 61 73 20 61 20   If there was a 
b220: 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 61  master journal a
b230: 6e 64 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  nd this routine 
b240: 77 69 6c 6c 20 72 65 74 75 72 6e 20 74 72 75 65  will return true
b250: 2c 0a 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20  ,.    ** see if 
b260: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
b270: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
b280: 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 20  ter journal..   
b290: 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
b2a0: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
b2b0: 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 64 65     rc = pager_de
b2c0: 6c 6d 61 73 74 65 72 28 7a 4d 61 73 74 65 72 29  lmaster(zMaster)
b2d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
b2e0: 74 65 46 72 65 65 28 7a 4d 61 73 74 65 72 29 3b  teFree(zMaster);
b2f0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 54 68 65 20 50  .  }..  /* The P
b300: 61 67 65 72 2e 73 65 63 74 6f 72 53 69 7a 65 20  ager.sectorSize 
b310: 76 61 72 69 61 62 6c 65 20 6d 61 79 20 68 61 76  variable may hav
b320: 65 20 62 65 65 6e 20 75 70 64 61 74 65 64 20 77  e been updated w
b330: 68 69 6c 65 20 72 6f 6c 6c 69 6e 67 0a 20 20 2a  hile rolling.  *
b340: 2a 20 62 61 63 6b 20 61 20 6a 6f 75 72 6e 61 6c  * back a journal
b350: 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72   created by a pr
b360: 6f 63 65 73 73 20 77 69 74 68 20 61 20 64 69 66  ocess with a dif
b370: 66 65 72 65 6e 74 20 50 41 47 45 52 5f 53 45 43  ferent PAGER_SEC
b380: 54 4f 52 5f 53 49 5a 45 0a 20 20 2a 2a 20 76 61  TOR_SIZE.  ** va
b390: 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20 74 6f  lue. Reset it to
b3a0: 20 74 68 65 20 63 6f 72 72 65 63 74 20 76 61 6c   the correct val
b3b0: 75 65 20 66 6f 72 20 74 68 69 73 20 70 72 6f 63  ue for this proc
b3c0: 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 70 50 61 67  ess..  */.  pPag
b3d0: 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20 3d  er->sectorSize =
b3e0: 20 50 41 47 45 52 5f 53 45 43 54 4f 52 5f 53 49   PAGER_SECTOR_SI
b3f0: 5a 45 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b  ZE;.  return rc;
b400: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61  .}../*.** Playba
b410: 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  ck the statement
b420: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
b430: 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72 20  This is similar 
b440: 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b 20  to playing back 
b450: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
b460: 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74 68  journal but with
b470: 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61 20  .** a few extra 
b480: 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20 20  twists..**.**   
b490: 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65 72   (1)  The number
b4a0: 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65   of pages in the
b4b0: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 61   database file a
b4c0: 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a 2a  t the start of.*
b4d0: 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73 74  *         the st
b4e0: 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72 65  atement is store
b4f0: 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74 6d  d in pPager->stm
b500: 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74 68  tSize, not in th
b510: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f 75  e.**         jou
b520: 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c 66  rnal file itself
b530: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20 20  ..**.**    (2)  
b540: 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20 70  In addition to p
b550: 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65 20  laying back the 
b560: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b570: 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 20  l, also.**      
b580: 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c 20     playback all 
b590: 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72 61  pages of the tra
b5a0: 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
b5b0: 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20 20   beginning.**   
b5c0: 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74 20        at offset 
b5d0: 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
b5e0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
b5f0: 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61 79   pager_stmt_play
b600: 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61 67  back(Pager *pPag
b610: 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b 20  er){.  i64 szJ; 
b620: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b630: 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20 66  /* Size of the f
b640: 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  ull journal */. 
b650: 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20 69   i64 hdrOff;.  i
b660: 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20 20  nt nRec;        
b670: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b680: 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f 0a  r of Records */.
b690: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
b6a0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
b6b0: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
b6c0: 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20 3d  int rc;..  szJ =
b6d0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
b6e0: 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45  Off;.#ifndef NDE
b6f0: 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36 34  BUG .  {.    i64
b700: 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63 20   os_szJ;.    rc 
b710: 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53  = sqlite3OsFileS
b720: 69 7a 65 28 26 70 50 61 67 65 72 2d 3e 6a 66 64  ize(&pPager->jfd
b730: 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20  , &os_szJ);.    
b740: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
b750: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
b760: 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d     assert( szJ==
b770: 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65  os_szJ );.  }.#e
b780: 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68  ndif..  /* Set h
b790: 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
b7a0: 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 66 69  offset to the fi
b7b0: 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64  rst journal head
b7c0: 65 72 20 77 72 69 74 74 65 6e 0a 20 20 2a 2a 20  er written.  ** 
b7d0: 74 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74  this statement t
b7e0: 72 61 6e 73 61 63 74 69 6f 6e 2c 20 6f 72 20 74  ransaction, or t
b7f0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  he end of the fi
b800: 6c 65 20 69 66 20 6e 6f 20 6a 6f 75 72 6e 61 6c  le if no journal
b810: 0a 20 20 2a 2a 20 68 65 61 64 65 72 20 77 61 73  .  ** header was
b820: 20 77 72 69 74 74 65 6e 2e 0a 20 20 2a 2f 0a 20   written..  */. 
b830: 20 68 64 72 4f 66 66 20 3d 20 70 50 61 67 65 72   hdrOff = pPager
b840: 2d 3e 73 74 6d 74 48 64 72 4f 66 66 3b 0a 20 20  ->stmtHdrOff;.  
b850: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
b860: 66 75 6c 6c 53 79 6e 63 20 7c 7c 20 21 68 64 72  fullSync || !hdr
b870: 4f 66 66 20 29 3b 0a 20 20 69 66 28 20 21 68 64  Off );.  if( !hd
b880: 72 4f 66 66 20 29 7b 0a 20 20 20 20 68 64 72 4f  rOff ){.    hdrO
b890: 66 66 20 3d 20 73 7a 4a 3b 0a 20 20 7d 0a 20 20  ff = szJ;.  }.  
b8a0: 0a 0a 20 20 2f 2a 20 54 72 75 6e 63 61 74 65 20  ..  /* Truncate 
b8b0: 74 68 65 20 64 61 74 61 62 61 73 65 20 62 61 63  the database bac
b8c0: 6b 20 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61  k to its origina
b8d0: 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f 0a 20 20 72  l size..  */.  r
b8e0: 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63 61  c = pager_trunca
b8f0: 74 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65  te(pPager, pPage
b900: 72 2d 3e 73 74 6d 74 53 69 7a 65 29 3b 0a 20 20  r->stmtSize);.  
b910: 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
b920: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a   pPager->stmtSiz
b930: 65 3b 0a 0a 20 20 2f 2a 20 46 69 67 75 72 65 20  e;..  /* Figure 
b940: 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72 65 63  out how many rec
b950: 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68 65 20  ords are in the 
b960: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
b970: 6c 2e 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74  l..  */.  assert
b980: 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
b990: 55 73 65 20 26 26 20 70 50 61 67 65 72 2d 3e 6a  Use && pPager->j
b9a0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20  ournalOpen );.  
b9b0: 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70  sqlite3OsSeek(&p
b9c0: 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b  Pager->stfd, 0);
b9d0: 0a 20 20 6e 52 65 63 20 3d 20 70 50 61 67 65 72  .  nRec = pPager
b9e0: 2d 3e 73 74 6d 74 4e 52 65 63 3b 0a 20 20 0a 20  ->stmtNRec;.  . 
b9f0: 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e 61   /* Copy origina
ba00: 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20 74  l pages out of t
ba10: 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
ba20: 72 6e 61 6c 20 61 6e 64 20 62 61 63 6b 20 69 6e  rnal and back in
ba30: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
ba40: 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 65  base file.  Note
ba50: 20 74 68 61 74 20 74 68 65 20 73 74 61 74 65 6d   that the statem
ba60: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6f 6d 69 74  ent journal omit
ba70: 73 20 63 68 65 63 6b 73 75 6d 73 20 66 72 6f 6d  s checksums from
ba80: 0a 20 20 2a 2a 20 65 61 63 68 20 72 65 63 6f 72  .  ** each recor
ba90: 64 20 73 69 6e 63 65 20 70 6f 77 65 72 2d 66 61  d since power-fa
baa0: 69 6c 75 72 65 20 72 65 63 6f 76 65 72 79 20 69  ilure recovery i
bab0: 73 20 6e 6f 74 20 69 6d 70 6f 72 74 61 6e 74 20  s not important 
bac0: 74 6f 20 73 74 61 74 65 6d 65 6e 74 0a 20 20 2a  to statement.  *
bad0: 2a 20 6a 6f 75 72 6e 61 6c 73 2e 0a 20 20 2a 2f  * journals..  */
bae0: 0a 20 20 66 6f 72 28 69 3d 6e 52 65 63 2d 31 3b  .  for(i=nRec-1;
baf0: 20 69 3e 3d 30 3b 20 69 2d 2d 29 7b 0a 20 20 20   i>=0; i--){.   
bb00: 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79   rc = pager_play
bb10: 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50  back_one_page(pP
bb20: 61 67 65 72 2c 20 26 70 50 61 67 65 72 2d 3e 73  ager, &pPager->s
bb30: 74 66 64 2c 20 30 29 3b 0a 20 20 20 20 61 73 73  tfd, 0);.    ass
bb40: 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f  ert( rc!=SQLITE_
bb50: 44 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20  DONE );.    if( 
bb60: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
bb70: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
bb80: 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 2f  ayback;.  }..  /
bb90: 2a 20 4e 6f 77 20 72 6f 6c 6c 20 73 6f 6d 65 20  * Now roll some 
bba0: 70 61 67 65 73 20 62 61 63 6b 20 66 72 6f 6d 20  pages back from 
bbb0: 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  the transaction 
bbc0: 6a 6f 75 72 6e 61 6c 2e 20 50 61 67 65 72 2e 73  journal. Pager.s
bbd0: 74 6d 74 4a 53 69 7a 65 0a 20 20 2a 2a 20 77 61  tmtJSize.  ** wa
bbe0: 73 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  s the size of th
bbf0: 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 77  e journal file w
bc00: 68 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d 65  hen this stateme
bc10: 6e 74 20 77 61 73 20 73 74 61 72 74 65 64 2c 20  nt was started, 
bc20: 73 6f 0a 20 20 2a 2a 20 65 76 65 72 79 74 68 69  so.  ** everythi
bc30: 6e 67 20 61 66 74 65 72 20 74 68 61 74 20 6e 65  ng after that ne
bc40: 65 64 73 20 74 6f 20 62 65 20 72 6f 6c 6c 65 64  eds to be rolled
bc50: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 69 6e   back, either in
bc60: 74 6f 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  to the.  ** data
bc70: 62 61 73 65 2c 20 74 68 65 20 6d 65 6d 6f 72 79  base, the memory
bc80: 20 63 61 63 68 65 2c 20 6f 72 20 62 6f 74 68 2e   cache, or both.
bc90: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 66 20 69 74  .  **.  ** If it
bca0: 20 69 73 20 6e 6f 74 20 7a 65 72 6f 2c 20 74 68   is not zero, th
bcb0: 65 6e 20 50 61 67 65 72 2e 73 74 6d 74 48 64 72  en Pager.stmtHdr
bcc0: 4f 66 66 20 69 73 20 74 68 65 20 6f 66 66 73 65  Off is the offse
bcd0: 74 20 74 6f 20 74 68 65 20 73 74 61 72 74 0a 20  t to the start. 
bce0: 20 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74   ** of the first
bcf0: 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72 20   journal header 
bd00: 77 72 69 74 74 65 6e 20 64 75 72 69 6e 67 20 74  written during t
bd10: 68 69 73 20 73 74 61 74 65 6d 65 6e 74 20 74 72  his statement tr
bd20: 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2f 0a  ansaction..  */.
bd30: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
bd40: 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e 6a 66  Seek(&pPager->jf
bd50: 64 2c 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a  d, pPager->stmtJ
bd60: 53 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 21  Size);.  if( rc!
bd70: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
bd80: 20 20 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f    goto end_stmt_
bd90: 70 6c 61 79 62 61 63 6b 3b 0a 20 20 7d 0a 20 20  playback;.  }.  
bda0: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
bdb0: 66 66 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d  ff = pPager->stm
bdc0: 74 4a 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  tJSize;.  pPager
bdd0: 2d 3e 63 6b 73 75 6d 49 6e 69 74 20 3d 20 70 50  ->cksumInit = pP
bde0: 61 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 3b  ager->stmtCksum;
bdf0: 0a 20 20 61 73 73 65 72 74 28 20 4a 4f 55 52 4e  .  assert( JOURN
be00: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
be10: 29 3c 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53  )<(pPager->pageS
be20: 69 7a 65 2b 38 29 20 29 3b 0a 20 20 77 68 69 6c  ize+8) );.  whil
be30: 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  e( pPager->journ
be40: 61 6c 4f 66 66 20 3c 3d 20 28 68 64 72 4f 66 66  alOff <= (hdrOff
be50: 2d 28 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  -(pPager->pageSi
be60: 7a 65 2b 38 29 29 20 29 7b 0a 20 20 20 20 72 63  ze+8)) ){.    rc
be70: 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63   = pager_playbac
be80: 6b 5f 6f 6e 65 5f 70 61 67 65 28 70 50 61 67 65  k_one_page(pPage
be90: 72 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c  r, &pPager->jfd,
bea0: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
beb0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
bec0: 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   );.    if( rc!=
bed0: 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
bee0: 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61   end_stmt_playba
bef0: 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  ck;.  }..  while
bf00: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
bf10: 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b 0a 20 20  lOff < szJ ){.  
bf20: 20 20 75 33 32 20 6e 52 65 63 3b 0a 20 20 20 20    u32 nRec;.    
bf30: 75 33 32 20 64 75 6d 6d 79 3b 0a 20 20 20 20 72  u32 dummy;.    r
bf40: 63 20 3d 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48  c = readJournalH
bf50: 64 72 28 70 50 61 67 65 72 2c 20 73 7a 4a 2c 20  dr(pPager, szJ, 
bf60: 26 6e 52 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a  &nRec, &dummy);.
bf70: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
bf80: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61  TE_OK ){.      a
bf90: 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c 49 54  ssert( rc!=SQLIT
bfa0: 45 5f 44 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20  E_DONE );.      
bfb0: 67 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c  goto end_stmt_pl
bfc0: 61 79 62 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20  ayback;.    }.  
bfd0: 20 20 69 66 28 20 6e 52 65 63 3d 3d 30 20 29 7b    if( nRec==0 ){
bfe0: 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20 28 73  .      nRec = (s
bff0: 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  zJ - pPager->jou
c000: 72 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67  rnalOff) / (pPag
c010: 65 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b  er->pageSize+8);
c020: 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
c030: 3d 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  =nRec-1; i>=0 &&
c040: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
c050: 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
c060: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
c070: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
c080: 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 61  age(pPager, &pPa
c090: 67 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20  ger->jfd, 1);.  
c0a0: 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d      assert( rc!=
c0b0: 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20  SQLITE_DONE );. 
c0c0: 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
c0d0: 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
c0e0: 64 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b  d_stmt_playback;
c0f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50  .    }.  }..  pP
c100: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
c110: 20 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73   = szJ;.  .end_s
c120: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20  tmt_playback:.  
c130: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
c140: 4b 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  K ){.    pPager-
c150: 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
c160: 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
c170: 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43     rc = SQLITE_C
c180: 4f 52 52 55 50 54 3b 20 20 2f 2a 20 62 6b 70 74  ORRUPT;  /* bkpt
c190: 2d 43 4f 52 52 55 50 54 20 2a 2f 0a 20 20 7d 65  -CORRUPT */.  }e
c1a0: 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  lse{.    pPager-
c1b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
c1c0: 4a 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f  J;.    /* pager_
c1d0: 72 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61  reload_cache(pPa
c1e0: 67 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72  ger); */.  }.  r
c1f0: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
c200: 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61  ** Change the ma
c210: 78 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20  ximum number of 
c220: 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20  in-memory pages 
c230: 74 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64  that are allowed
c240: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6d 61 78 69  ..**.** The maxi
c250: 6d 75 6d 20 6e 75 6d 62 65 72 20 69 73 20 74 68  mum number is th
c260: 65 20 61 62 73 6f 6c 75 74 65 20 76 61 6c 75 65  e absolute value
c270: 20 6f 66 20 74 68 65 20 6d 78 50 61 67 65 20 70   of the mxPage p
c280: 61 72 61 6d 65 74 65 72 2e 0a 2a 2a 20 49 66 20  arameter..** If 
c290: 6d 78 50 61 67 65 20 69 73 20 6e 65 67 61 74 69  mxPage is negati
c2a0: 76 65 2c 20 74 68 65 20 6e 6f 53 79 6e 63 20 66  ve, the noSync f
c2b0: 6c 61 67 20 69 73 20 61 6c 73 6f 20 73 65 74 2e  lag is also set.
c2c0: 20 20 6e 6f 53 79 6e 63 20 62 79 70 61 73 73 65    noSync bypasse
c2d0: 73 0a 2a 2a 20 63 61 6c 6c 73 20 74 6f 20 73 71  s.** calls to sq
c2e0: 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 2e 20 20  lite3OsSync().  
c2f0: 54 68 65 20 70 61 67 65 72 20 72 75 6e 73 20 6d  The pager runs m
c300: 75 63 68 20 66 61 73 74 65 72 20 77 69 74 68 20  uch faster with 
c310: 6e 6f 53 79 6e 63 20 6f 6e 2c 0a 2a 2a 20 62 75  noSync on,.** bu
c320: 74 20 69 66 20 74 68 65 20 6f 70 65 72 61 74 69  t if the operati
c330: 6e 67 20 73 79 73 74 65 6d 20 63 72 61 73 68 65  ng system crashe
c340: 73 20 6f 72 20 74 68 65 72 65 20 69 73 20 61 6e  s or there is an
c350: 20 61 62 72 75 70 74 20 70 6f 77 65 72 20 0a 2a   abrupt power .*
c360: 2a 20 66 61 69 6c 75 72 65 2c 20 74 68 65 20 64  * failure, the d
c370: 61 74 61 62 61 73 65 20 66 69 6c 65 20 6d 69 67  atabase file mig
c380: 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20 61 6e  ht be left in an
c390: 20 69 6e 63 6f 6e 73 69 73 74 65 6e 74 20 61 6e   inconsistent an
c3a0: 64 0a 2a 2a 20 75 6e 72 65 70 61 69 72 61 62 6c  d.** unrepairabl
c3b0: 65 20 73 74 61 74 65 2e 20 20 0a 2a 2f 0a 76 6f  e state.  .*/.vo
c3c0: 69 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  id sqlite3pager_
c3d0: 73 65 74 5f 63 61 63 68 65 73 69 7a 65 28 50 61  set_cachesize(Pa
c3e0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
c3f0: 20 6d 78 50 61 67 65 29 7b 0a 20 20 69 66 28 20   mxPage){.  if( 
c400: 6d 78 50 61 67 65 3e 3d 30 20 29 7b 0a 20 20 20  mxPage>=0 ){.   
c410: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c420: 3d 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69  = pPager->tempFi
c430: 6c 65 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  le;.    if( pPag
c440: 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61  er->noSync ) pPa
c450: 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
c460: 30 3b 20 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  0; .  }else{.   
c470: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
c480: 3d 20 31 3b 0a 20 20 20 20 6d 78 50 61 67 65 20  = 1;.    mxPage 
c490: 3d 20 2d 6d 78 50 61 67 65 3b 0a 20 20 7d 0a 20  = -mxPage;.  }. 
c4a0: 20 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29   if( mxPage>10 )
c4b0: 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78  {.    pPager->mx
c4c0: 50 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20  Page = mxPage;. 
c4d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67   }else{.    pPag
c4e0: 65 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b  er->mxPage = 10;
c4f0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  .  }.}../*.** Ad
c500: 6a 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e  just the robustn
c510: 65 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62  ess of the datab
c520: 61 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75  ase to damage du
c530: 65 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a  e to OS crashes.
c540: 2a 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c  ** or power fail
c550: 75 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67  ures by changing
c560: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
c570: 79 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69  yncs()s when wri
c580: 74 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c  ting.** the roll
c590: 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  back journal.  T
c5a0: 68 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c  here are three l
c5b0: 65 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  evels:.**.**    
c5c0: 4f 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65  OFF       sqlite
c5d0: 33 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76  3OsSync() is nev
c5e0: 65 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73  er called.  This
c5f0: 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a   is the default.
c600: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c610: 66 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e  for temporary an
c620: 64 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65  d transient file
c630: 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d  s..**.**    NORM
c640: 41 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61  AL    The journa
c650: 6c 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65  l is synced once
c660: 20 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62   before writes b
c670: 65 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20  egin on the.**  
c680: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
c690: 62 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e  base.  This is n
c6a0: 6f 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65  ormally adequate
c6b0: 20 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74   protection, but
c6c0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
c6d0: 20 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63   it is theoretic
c6e0: 61 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74  ally possible, t
c6f0: 68 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b  hough very unlik
c700: 65 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20  ely,.**         
c710: 20 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f       that an ino
c720: 70 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61  pertune power fa
c730: 69 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76  ilure could leav
c740: 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  e the journal.**
c750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
c760: 20 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77   a state which w
c770: 6f 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67  ould cause damag
c780: 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  e to the databas
c790: 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  e.**            
c7a0: 20 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c    when it is rol
c7b0: 6c 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  led back..**.** 
c7c0: 20 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65     FULL      The
c7d0: 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63   journal is sync
c7e0: 65 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20  ed twice before 
c7f0: 77 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20  writes begin on 
c800: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
c810: 20 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69      database (wi
c820: 74 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e  th some addition
c830: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d  al information -
c840: 20 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a   the nRec field.
c850: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c860: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68  of the journal h
c870: 65 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72  eader - being wr
c880: 69 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e  itten in between
c890: 20 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20   the two.**     
c8a0: 20 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e           syncs).
c8b0: 20 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74    If we assume t
c8c0: 68 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a  hat writing a.**
c8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69                si
c8e0: 6e 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72  ngle disk sector
c8f0: 20 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e   is atomic, then
c900: 20 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69   this mode provi
c910: 64 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  des.**          
c920: 20 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68      assurance th
c930: 61 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  at the journal w
c940: 69 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75  ill not be corru
c950: 70 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20  pted to the.**  
c960: 20 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e              poin
c970: 74 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d  t of causing dam
c980: 61 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62  age to the datab
c990: 61 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62  ase during rollb
c9a0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72  ack..**.** Numer
c9b0: 69 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69  ic values associ
c9c0: 61 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20  ated with these 
c9d0: 73 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d  states are OFF==
c9e0: 31 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20  1, NORMAL=2,.** 
c9f0: 61 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23  and FULL=3..*/.#
ca00: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
ca10: 49 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53  IT_PAGER_PRAGMAS
ca20: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
ca30: 65 72 5f 73 65 74 5f 73 61 66 65 74 79 5f 6c 65  er_set_safety_le
ca40: 76 65 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  vel(Pager *pPage
ca50: 72 2c 20 69 6e 74 20 6c 65 76 65 6c 29 7b 0a 20  r, int level){. 
ca60: 20 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20   pPager->noSync 
ca70: 3d 20 20 6c 65 76 65 6c 3d 3d 31 20 7c 7c 20 70  =  level==1 || p
ca80: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
ca90: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
caa0: 79 6e 63 20 3d 20 6c 65 76 65 6c 3d 3d 33 20 26  ync = level==3 &
cab0: 26 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  & !pPager->tempF
cac0: 69 6c 65 3b 0a 20 20 69 66 28 20 70 50 61 67 65  ile;.  if( pPage
cad0: 72 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67  r->noSync ) pPag
cae0: 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  er->needSync = 0
caf0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
cb00: 2a 20 4f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  * Open a tempora
cb10: 72 79 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20  ry file.  Write 
cb20: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
cb30: 66 69 6c 65 20 69 6e 74 6f 20 7a 4e 61 6d 65 0a  file into zName.
cb40: 2a 2a 20 28 7a 4e 61 6d 65 20 6d 75 73 74 20 62  ** (zName must b
cb50: 65 20 61 74 20 6c 65 61 73 74 20 53 51 4c 49 54  e at least SQLIT
cb60: 45 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 20  E_TEMPNAME_SIZE 
cb70: 62 79 74 65 73 20 6c 6f 6e 67 2e 29 20 20 57 72  bytes long.)  Wr
cb80: 69 74 65 0a 2a 2a 20 74 68 65 20 66 69 6c 65 20  ite.** the file 
cb90: 64 65 73 63 72 69 70 74 6f 72 20 69 6e 74 6f 20  descriptor into 
cba0: 2a 66 64 2e 20 20 52 65 74 75 72 6e 20 53 51 4c  *fd.  Return SQL
cbb0: 49 54 45 5f 4f 4b 20 6f 6e 20 73 75 63 63 65 73  ITE_OK on succes
cbc0: 73 20 6f 72 20 73 6f 6d 65 0a 2a 2a 20 6f 74 68  s or some.** oth
cbd0: 65 72 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  er error code if
cbe0: 20 77 65 20 66 61 69 6c 2e 0a 2a 2a 0a 2a 2a 20   we fail..**.** 
cbf0: 54 68 65 20 4f 53 20 77 69 6c 6c 20 61 75 74 6f  The OS will auto
cc00: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
cc10: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
cc20: 69 6c 65 20 77 68 65 6e 20 69 74 20 69 73 0a 2a  ile when it is.*
cc30: 2a 20 63 6c 6f 73 65 64 2e 0a 2a 2f 0a 73 74 61  * closed..*/.sta
cc40: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 70  tic int sqlite3p
cc50: 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 63 68  ager_opentemp(ch
cc60: 61 72 20 2a 7a 46 69 6c 65 2c 20 4f 73 46 69 6c  ar *zFile, OsFil
cc70: 65 20 2a 66 64 29 7b 0a 20 20 69 6e 74 20 63 6e  e *fd){.  int cn
cc80: 74 20 3d 20 38 3b 0a 20 20 69 6e 74 20 72 63 3b  t = 8;.  int rc;
cc90: 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d 2d  .  do{.    cnt--
cca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 54  ;.    sqlite3OsT
ccb0: 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69 6c  empFileName(zFil
ccc0: 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e);.    rc = sql
ccd0: 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75 73  ite3OsOpenExclus
cce0: 69 76 65 28 7a 46 69 6c 65 2c 20 66 64 2c 20 31  ive(zFile, fd, 1
ccf0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 63 6e 74  );.  }while( cnt
cd00: 3e 30 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45  >0 && rc!=SQLITE
cd10: 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
cd20: 45 5f 4e 4f 4d 45 4d 20 29 3b 0a 20 20 72 65 74  E_NOMEM );.  ret
cd30: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
cd40: 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 70 61   Create a new pa
cd50: 67 65 20 63 61 63 68 65 20 61 6e 64 20 70 75 74  ge cache and put
cd60: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68   a pointer to th
cd70: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 6e 20  e page cache in 
cd80: 2a 70 70 50 61 67 65 72 2e 0a 2a 2a 20 54 68 65  *ppPager..** The
cd90: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
cda0: 65 64 20 6e 65 65 64 20 6e 6f 74 20 65 78 69 73  ed need not exis
cdb0: 74 2e 20 20 54 68 65 20 66 69 6c 65 20 69 73 20  t.  The file is 
cdc0: 6e 6f 74 20 6c 6f 63 6b 65 64 20 75 6e 74 69 6c  not locked until
cdd0: 0a 2a 2a 20 74 68 65 20 66 69 72 73 74 20 63 61  .** the first ca
cde0: 6c 6c 20 74 6f 20 73 71 6c 69 74 65 33 70 61 67  ll to sqlite3pag
cdf0: 65 72 5f 67 65 74 28 29 20 61 6e 64 20 69 73 20  er_get() and is 
ce00: 6f 6e 6c 79 20 68 65 6c 64 20 6f 70 65 6e 20 75  only held open u
ce10: 6e 74 69 6c 20 74 68 65 0a 2a 2a 20 6c 61 73 74  ntil the.** last
ce20: 20 70 61 67 65 20 69 73 20 72 65 6c 65 61 73 65   page is release
ce30: 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 70  d using sqlite3p
ce40: 61 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2a  ager_unref()..**
ce50: 0a 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65  .** If zFilename
ce60: 20 69 73 20 4e 55 4c 4c 20 74 68 65 6e 20 61 20   is NULL then a 
ce70: 72 61 6e 64 6f 6d 6c 79 2d 6e 61 6d 65 64 20 74  randomly-named t
ce80: 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 69 73  emporary file is
ce90: 20 63 72 65 61 74 65 64 0a 2a 2a 20 61 6e 64 20   created.** and 
cea0: 75 73 65 64 20 61 73 20 74 68 65 20 66 69 6c 65  used as the file
ceb0: 20 74 6f 20 62 65 20 63 61 63 68 65 64 2e 20 20   to be cached.  
cec0: 54 68 65 20 66 69 6c 65 20 77 69 6c 6c 20 62 65  The file will be
ced0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 61 75 74 6f   deleted.** auto
cee0: 6d 61 74 69 63 61 6c 6c 79 20 77 68 65 6e 20 69  matically when i
cef0: 74 20 69 73 20 63 6c 6f 73 65 64 2e 0a 2a 2a 0a  t is closed..**.
cf00: 2a 2a 20 49 66 20 7a 46 69 6c 65 6e 61 6d 65 20  ** If zFilename 
cf10: 69 73 20 22 3a 6d 65 6d 6f 72 79 3a 22 20 74 68  is ":memory:" th
cf20: 65 6e 20 61 6c 6c 20 69 6e 66 6f 72 6d 61 74 69  en all informati
cf30: 6f 6e 20 69 73 20 68 65 6c 64 20 69 6e 20 63 61  on is held in ca
cf40: 63 68 65 2e 0a 2a 2a 20 49 74 20 69 73 20 6e 65  che..** It is ne
cf50: 76 65 72 20 77 72 69 74 74 65 6e 20 74 6f 20 64  ver written to d
cf60: 69 73 6b 2e 20 20 54 68 69 73 20 63 61 6e 20 62  isk.  This can b
cf70: 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  e used to implem
cf80: 65 6e 74 20 61 6e 0a 2a 2a 20 69 6e 2d 6d 65 6d  ent an.** in-mem
cf90: 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ory database..*/
cfa0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
cfb0: 72 5f 6f 70 65 6e 28 0a 20 20 50 61 67 65 72 20  r_open(.  Pager 
cfc0: 2a 2a 70 70 50 61 67 65 72 2c 20 20 20 20 20 20  **ppPager,      
cfd0: 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 74 68 65     /* Return the
cfe0: 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
cff0: 20 68 65 72 65 20 2a 2f 0a 20 20 63 6f 6e 73 74   here */.  const
d000: 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
d010: 2c 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  ,   /* Name of t
d020: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
d030: 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 69 6e   to open */.  in
d040: 74 20 6e 45 78 74 72 61 2c 20 20 20 20 20 20 20  t nExtra,       
d050: 20 20 20 20 20 20 20 2f 2a 20 45 78 74 72 61 20         /* Extra 
d060: 62 79 74 65 73 20 61 70 70 65 6e 64 20 74 6f 20  bytes append to 
d070: 65 61 63 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70  each in-memory p
d080: 61 67 65 20 2a 2f 0a 20 20 69 6e 74 20 75 73 65  age */.  int use
d090: 4a 6f 75 72 6e 61 6c 20 20 20 20 20 20 20 20 20  Journal         
d0a0: 20 20 2f 2a 20 54 52 55 45 20 74 6f 20 75 73 65    /* TRUE to use
d0b0: 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72   a rollback jour
d0c0: 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69 6c 65  nal on this file
d0d0: 20 2a 2f 0a 29 7b 0a 20 20 50 61 67 65 72 20 2a   */.){.  Pager *
d0e0: 70 50 61 67 65 72 3b 0a 20 20 63 68 61 72 20 2a  pPager;.  char *
d0f0: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20  zFullPathname = 
d100: 30 3b 0a 20 20 69 6e 74 20 6e 61 6d 65 4c 65 6e  0;.  int nameLen
d110: 3b 0a 20 20 4f 73 46 69 6c 65 20 66 64 3b 0a 20  ;.  OsFile fd;. 
d120: 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
d130: 5f 4f 4b 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  _OK;.  int i;.  
d140: 69 6e 74 20 74 65 6d 70 46 69 6c 65 20 3d 20 30  int tempFile = 0
d150: 3b 0a 20 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20  ;.  int memDb = 
d160: 30 3b 0a 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c  0;.  int readOnl
d170: 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 54  y = 0;.  char zT
d180: 65 6d 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e  emp[SQLITE_TEMPN
d190: 41 4d 45 5f 53 49 5a 45 5d 3b 0a 0a 20 20 2a 70  AME_SIZE];..  *p
d1a0: 70 50 61 67 65 72 20 3d 20 30 3b 0a 20 20 6d 65  pPager = 0;.  me
d1b0: 6d 73 65 74 28 26 66 64 2c 20 30 2c 20 73 69 7a  mset(&fd, 0, siz
d1c0: 65 6f 66 28 66 64 29 29 3b 0a 20 20 69 66 28 20  eof(fd));.  if( 
d1d0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
d1e0: 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74  ailed ){.    ret
d1f0: 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  urn SQLITE_NOMEM
d200: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 46 69 6c  ;.  }.  if( zFil
d210: 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e 61  ename && zFilena
d220: 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65 66  me[0] ){.#ifndef
d230: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d   SQLITE_OMIT_MEM
d240: 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73 74  ORYDB.    if( st
d250: 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c 22  rcmp(zFilename,"
d260: 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29 7b  :memory:")==0 ){
d270: 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20 31  .      memDb = 1
d280: 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  ;.      zFullPat
d290: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  hname = sqliteSt
d2a0: 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 20 20  rDup("");.      
d2b0: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
d2c0: 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66      }else.#endif
d2d0: 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 7a 46 75  .    {.      zFu
d2e0: 6c 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c  llPathname = sql
d2f0: 69 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61  ite3OsFullPathna
d300: 6d 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  me(zFilename);. 
d310: 20 20 20 20 20 69 66 28 20 7a 46 75 6c 6c 50 61       if( zFullPa
d320: 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  thname ){.      
d330: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
d340: 4f 70 65 6e 52 65 61 64 57 72 69 74 65 28 7a 46  OpenReadWrite(zF
d350: 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 26 66 64  ullPathname, &fd
d360: 2c 20 26 72 65 61 64 4f 6e 6c 79 29 3b 0a 20 20  , &readOnly);.  
d370: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
d380: 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
d390: 6c 69 74 65 33 70 61 67 65 72 5f 6f 70 65 6e 74  lite3pager_opent
d3a0: 65 6d 70 28 7a 54 65 6d 70 2c 20 26 66 64 29 3b  emp(zTemp, &fd);
d3b0: 0a 20 20 20 20 7a 46 69 6c 65 6e 61 6d 65 20 3d  .    zFilename =
d3c0: 20 7a 54 65 6d 70 3b 0a 20 20 20 20 7a 46 75 6c   zTemp;.    zFul
d3d0: 6c 50 61 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69  lPathname = sqli
d3e0: 74 65 33 4f 73 46 75 6c 6c 50 61 74 68 6e 61 6d  te3OsFullPathnam
d3f0: 65 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  e(zFilename);.  
d400: 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
d410: 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 74 65 6d  _OK ){.      tem
d420: 70 46 69 6c 65 20 3d 20 31 3b 0a 20 20 20 20 7d  pFile = 1;.    }
d430: 0a 20 20 7d 0a 20 20 69 66 28 20 21 7a 46 75 6c  .  }.  if( !zFul
d440: 6c 50 61 74 68 6e 61 6d 65 20 29 7b 0a 20 20 20  lPathname ){.   
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 72 65 74 75 72 6e  &fd);.    return
d470: 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
d480: 20 7d 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c   }.  if( rc!=SQL
d490: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
d4a0: 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64  lite3OsClose(&fd
d4b0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
d4c0: 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
d4d0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
d4e0: 0a 20 20 7d 0a 20 20 6e 61 6d 65 4c 65 6e 20 3d  .  }.  nameLen =
d4f0: 20 73 74 72 6c 65 6e 28 7a 46 75 6c 6c 50 61 74   strlen(zFullPat
d500: 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  hname);.  pPager
d510: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
d520: 20 73 69 7a 65 6f 66 28 2a 70 50 61 67 65 72 29   sizeof(*pPager)
d530: 20 2b 20 6e 61 6d 65 4c 65 6e 2a 33 20 2b 20 33   + nameLen*3 + 3
d540: 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  0 );.  if( pPage
d550: 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  r==0 ){.    sqli
d560: 74 65 33 4f 73 43 6c 6f 73 65 28 26 66 64 29 3b  te3OsClose(&fd);
d570: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
d580: 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a  zFullPathname);.
d590: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
d5a0: 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 20 20 54  E_NOMEM;.  }.  T
d5b0: 52 41 43 45 33 28 22 4f 50 45 4e 20 25 64 20 25  RACE3("OPEN %d %
d5c0: 73 5c 6e 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45  s\n", FILEHANDLE
d5d0: 49 44 28 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74  ID(fd), zFullPat
d5e0: 68 6e 61 6d 65 29 3b 0a 20 20 70 50 61 67 65 72  hname);.  pPager
d5f0: 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
d600: 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
d610: 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
d620: 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
d630: 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
d640: 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
d650: 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
d660: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
d670: 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 73 74  nameLen+1];.  st
d680: 72 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  rcpy(pPager->zFi
d690: 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
d6a0: 68 6e 61 6d 65 29 3b 0a 20 20 73 74 72 63 70 79  hname);.  strcpy
d6b0: 28 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74  (pPager->zDirect
d6c0: 6f 72 79 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  ory, zFullPathna
d6d0: 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 6e 61 6d  me);.  for(i=nam
d6e0: 65 4c 65 6e 3b 20 69 3e 30 20 26 26 20 70 50 61  eLen; i>0 && pPa
d6f0: 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
d700: 69 2d 31 5d 21 3d 27 2f 27 3b 20 69 2d 2d 29 7b  i-1]!='/'; i--){
d710: 7d 0a 20 20 69 66 28 20 69 3e 30 20 29 20 70 50  }.  if( i>0 ) pP
d720: 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
d730: 5b 69 2d 31 5d 20 3d 20 30 3b 0a 20 20 73 74 72  [i-1] = 0;.  str
d740: 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75  cpy(pPager->zJou
d750: 72 6e 61 6c 2c 20 7a 46 75 6c 6c 50 61 74 68 6e  rnal, zFullPathn
d760: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ame);.  sqliteFr
d770: 65 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65  ee(zFullPathname
d780: 29 3b 0a 20 20 73 74 72 63 70 79 28 26 70 50 61  );.  strcpy(&pPa
d790: 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61  ger->zJournal[na
d7a0: 6d 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61  meLen], "-journa
d7b0: 6c 22 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66  l");.  pPager->f
d7c0: 64 20 3d 20 66 64 3b 0a 23 69 66 20 4f 53 5f 55  d = fd;.#if OS_U
d7d0: 4e 49 58 0a 20 20 70 50 61 67 65 72 2d 3e 66 64  NIX.  pPager->fd
d7e0: 2e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  .pPager = pPager
d7f0: 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
d800: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 3d  r->journalOpen =
d810: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 75 73   0;.  pPager->us
d820: 65 4a 6f 75 72 6e 61 6c 20 3d 20 75 73 65 4a 6f  eJournal = useJo
d830: 75 72 6e 61 6c 20 26 26 20 21 6d 65 6d 44 62 3b  urnal && !memDb;
d840: 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f  .  pPager->stmtO
d850: 70 65 6e 20 3d 20 30 3b 0a 20 20 70 50 61 67 65  pen = 0;.  pPage
d860: 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30  r->stmtInUse = 0
d870: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 66  ;.  pPager->nRef
d880: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
d890: 64 62 53 69 7a 65 20 3d 20 6d 65 6d 44 62 2d 31  dbSize = memDb-1
d8a0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65  ;.  pPager->page
d8b0: 53 69 7a 65 20 3d 20 53 51 4c 49 54 45 5f 44 45  Size = SQLITE_DE
d8c0: 46 41 55 4c 54 5f 50 41 47 45 5f 53 49 5a 45 3b  FAULT_PAGE_SIZE;
d8d0: 0a 20 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69  .  pPager->psAli
d8e0: 67 6e 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49  gned = FORCE_ALI
d8f0: 47 4e 4d 45 4e 54 28 70 50 61 67 65 72 2d 3e 70  GNMENT(pPager->p
d900: 61 67 65 53 69 7a 65 29 3b 0a 20 20 70 50 61 67  ageSize);.  pPag
d910: 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d 20 30  er->stmtSize = 0
d920: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
d930: 4a 53 69 7a 65 20 3d 20 30 3b 0a 20 20 70 50 61  JSize = 0;.  pPa
d940: 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 0a  ger->nPage = 0;.
d950: 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67 65    pPager->mxPage
d960: 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65 72   = 100;.  pPager
d970: 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
d980: 55 4e 4c 4f 43 4b 3b 0a 20 20 70 50 61 67 65 72  UNLOCK;.  pPager
d990: 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 0a 20  ->errMask = 0;. 
d9a0: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
d9b0: 65 20 3d 20 74 65 6d 70 46 69 6c 65 3b 0a 20 20  e = tempFile;.  
d9c0: 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 3d 20  pPager->memDb = 
d9d0: 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72 2d  memDb;.  pPager-
d9e0: 3e 72 65 61 64 4f 6e 6c 79 20 3d 20 72 65 61 64  >readOnly = read
d9f0: 4f 6e 6c 79 3b 0a 20 20 70 50 61 67 65 72 2d 3e  Only;.  pPager->
da00: 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
da10: 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d  pPager->noSync =
da20: 20 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c   pPager->tempFil
da30: 65 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c  e || !useJournal
da40: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  ;.  pPager->full
da50: 53 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e  Sync = (pPager->
da60: 6e 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 70  noSync?0:1);.  p
da70: 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20  Pager->pFirst = 
da80: 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 46 69  0;.  pPager->pFi
da90: 72 73 74 53 79 6e 63 65 64 20 3d 20 30 3b 0a 20  rstSynced = 0;. 
daa0: 20 70 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d   pPager->pLast =
dab0: 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 45   0;.  pPager->nE
dac0: 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c 49  xtra = FORCE_ALI
dad0: 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b 0a  GNMENT(nExtra);.
dae0: 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74 6f 72    pPager->sector
daf0: 53 69 7a 65 20 3d 20 50 41 47 45 52 5f 53 45 43  Size = PAGER_SEC
db00: 54 4f 52 5f 53 49 5a 45 3b 0a 20 20 70 50 61 67  TOR_SIZE;.  pPag
db10: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
db20: 20 3d 20 30 3b 0a 20 20 6d 65 6d 73 65 74 28 70   = 0;.  memset(p
db30: 50 61 67 65 72 2d 3e 61 48 61 73 68 2c 20 30 2c  Pager->aHash, 0,
db40: 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e   sizeof(pPager->
db50: 61 48 61 73 68 29 29 3b 0a 20 20 2a 70 70 50 61  aHash));.  *ppPa
db60: 67 65 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20  ger = pPager;.  
db70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
db80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
db90: 68 65 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20  he busy handler 
dba0: 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69  function..*/.voi
dbb0: 64 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73  d sqlite3pager_s
dbc0: 65 74 5f 62 75 73 79 68 61 6e 64 6c 65 72 28 50  et_busyhandler(P
dbd0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 42 75  ager *pPager, Bu
dbe0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
dbf0: 48 61 6e 64 6c 65 72 29 7b 0a 20 20 70 50 61 67  Handler){.  pPag
dc00: 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72  er->pBusyHandler
dc10: 20 3d 20 70 42 75 73 79 48 61 6e 64 6c 65 72 3b   = pBusyHandler;
dc20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
dc30: 65 20 64 65 73 74 72 75 63 74 6f 72 20 66 6f 72  e destructor for
dc40: 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 49 66   this pager.  If
dc50: 20 6e 6f 74 20 4e 55 4c 4c 2c 20 74 68 65 20 64   not NULL, the d
dc60: 65 73 74 72 75 63 74 6f 72 20 69 73 20 63 61 6c  estructor is cal
dc70: 6c 65 64 0a 2a 2a 20 77 68 65 6e 20 74 68 65 20  led.** when the 
dc80: 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
dc90: 6f 6e 20 65 61 63 68 20 70 61 67 65 20 72 65 61  on each page rea
dca0: 63 68 65 73 20 7a 65 72 6f 2e 20 20 54 68 65 20  ches zero.  The 
dcb0: 64 65 73 74 72 75 63 74 6f 72 20 63 61 6e 0a 2a  destructor can.*
dcc0: 2a 20 62 65 20 75 73 65 64 20 74 6f 20 63 6c 65  * be used to cle
dcd0: 61 6e 20 75 70 20 69 6e 66 6f 72 6d 61 74 69 6f  an up informatio
dce0: 6e 20 69 6e 20 74 68 65 20 65 78 74 72 61 20 73  n in the extra s
dcf0: 65 67 6d 65 6e 74 20 61 70 70 65 6e 64 65 64 20  egment appended 
dd00: 74 6f 20 65 61 63 68 20 70 61 67 65 2e 0a 2a 2a  to each page..**
dd10: 0a 2a 2a 20 54 68 65 20 64 65 73 74 72 75 63 74  .** The destruct
dd20: 6f 72 20 69 73 20 6e 6f 74 20 63 61 6c 6c 65 64  or is not called
dd30: 20 61 73 20 61 20 72 65 73 75 6c 74 20 73 71 6c   as a result sql
dd40: 69 74 65 33 70 61 67 65 72 5f 63 6c 6f 73 65 28  ite3pager_close(
dd50: 29 2e 20 20 0a 2a 2a 20 44 65 73 74 72 75 63 74  ).  .** Destruct
dd60: 6f 72 73 20 61 72 65 20 6f 6e 6c 79 20 63 61 6c  ors are only cal
dd70: 6c 65 64 20 62 79 20 73 71 6c 69 74 65 33 70 61  led by sqlite3pa
dd80: 67 65 72 5f 75 6e 72 65 66 28 29 2e 0a 2a 2f 0a  ger_unref()..*/.
dd90: 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67 65  void sqlite3page
dda0: 72 5f 73 65 74 5f 64 65 73 74 72 75 63 74 6f 72  r_set_destructor
ddb0: 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
ddc0: 76 6f 69 64 20 28 2a 78 44 65 73 63 29 28 76 6f  void (*xDesc)(vo
ddd0: 69 64 2a 2c 69 6e 74 29 29 7b 0a 20 20 70 50 61  id*,int)){.  pPa
dde0: 67 65 72 2d 3e 78 44 65 73 74 72 75 63 74 6f 72  ger->xDestructor
ddf0: 20 3d 20 78 44 65 73 63 3b 0a 7d 0a 0a 2f 2a 0a   = xDesc;.}../*.
de00: 2a 2a 20 53 65 74 20 74 68 65 20 72 65 69 6e 69  ** Set the reini
de10: 74 69 61 6c 69 7a 65 72 20 66 6f 72 20 74 68 69  tializer for thi
de20: 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
de30: 20 4e 55 4c 4c 2c 20 74 68 65 20 72 65 69 6e 69   NULL, the reini
de40: 74 69 61 6c 69 7a 65 72 0a 2a 2a 20 69 73 20 63  tializer.** is c
de50: 61 6c 6c 65 64 20 77 68 65 6e 20 74 68 65 20 63  alled when the c
de60: 6f 6e 74 65 6e 74 20 6f 66 20 61 20 70 61 67 65  ontent of a page
de70: 20 69 6e 20 63 61 63 68 65 20 69 73 20 72 65 73   in cache is res
de80: 74 6f 72 65 64 20 74 6f 20 69 74 73 20 6f 72 69  tored to its ori
de90: 67 69 6e 61 6c 0a 2a 2a 20 76 61 6c 75 65 20 61  ginal.** value a
dea0: 73 20 61 20 72 65 73 75 6c 74 20 6f 66 20 61 20  s a result of a 
deb0: 72 6f 6c 6c 62 61 63 6b 2e 20 20 54 68 65 20 63  rollback.  The c
dec0: 61 6c 6c 62 61 63 6b 20 67 69 76 65 73 20 68 69  allback gives hi
ded0: 67 68 65 72 2d 6c 65 76 65 6c 20 63 6f 64 65 0a  gher-level code.
dee0: 2a 2a 20 61 6e 20 6f 70 70 6f 72 74 75 6e 69 74  ** an opportunit
def0: 79 20 74 6f 20 72 65 73 74 6f 72 65 20 74 68 65  y to restore the
df00: 20 45 58 54 52 41 20 73 65 63 74 69 6f 6e 20 74   EXTRA section t
df10: 6f 20 61 67 72 65 65 20 77 69 74 68 20 74 68 65  o agree with the
df20: 20 72 65 73 74 6f 72 65 64 0a 2a 2a 20 70 61 67   restored.** pag
df30: 65 20 64 61 74 61 2e 0a 2a 2f 0a 76 6f 69 64 20  e data..*/.void 
df40: 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
df50: 5f 72 65 69 6e 69 74 65 72 28 50 61 67 65 72 20  _reiniter(Pager 
df60: 2a 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a  *pPager, void (*
df70: 78 52 65 69 6e 69 74 29 28 76 6f 69 64 2a 2c 69  xReinit)(void*,i
df80: 6e 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  nt)){.  pPager->
df90: 78 52 65 69 6e 69 74 65 72 20 3d 20 78 52 65 69  xReiniter = xRei
dfa0: 6e 69 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  nit;.}../*.** Se
dfb0: 74 20 74 68 65 20 70 61 67 65 20 73 69 7a 65 2e  t the page size.
dfc0: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 20  .**.** The page 
dfd0: 73 69 7a 65 20 6d 75 73 74 20 6f 6e 6c 79 20 62  size must only b
dfe0: 65 20 63 68 61 6e 67 65 64 20 77 68 65 6e 20 74  e changed when t
dff0: 68 65 20 63 61 63 68 65 20 69 73 20 65 6d 70 74  he cache is empt
e000: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
e010: 65 33 70 61 67 65 72 5f 73 65 74 5f 70 61 67 65  e3pager_set_page
e020: 73 69 7a 65 28 50 61 67 65 72 20 2a 70 50 61 67  size(Pager *pPag
e030: 65 72 2c 20 69 6e 74 20 70 61 67 65 53 69 7a 65  er, int pageSize
e040: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 61 67  ){.  assert( pag
e050: 65 53 69 7a 65 3e 3d 35 31 32 20 26 26 20 70 61  eSize>=512 && pa
e060: 67 65 53 69 7a 65 3c 3d 53 51 4c 49 54 45 5f 4d  geSize<=SQLITE_M
e070: 41 58 5f 50 41 47 45 5f 53 49 5a 45 20 29 3b 0a  AX_PAGE_SIZE );.
e080: 20 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69    pPager->pageSi
e090: 7a 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20  ze = pageSize;. 
e0a0: 20 70 50 61 67 65 72 2d 3e 70 73 41 6c 69 67 6e   pPager->psAlign
e0b0: 65 64 20 3d 20 46 4f 52 43 45 5f 41 4c 49 47 4e  ed = FORCE_ALIGN
e0c0: 4d 45 4e 54 28 70 61 67 65 53 69 7a 65 29 3b 0a  MENT(pageSize);.
e0d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  }../*.** Read th
e0e0: 65 20 66 69 72 73 74 20 4e 20 62 79 74 65 73 20  e first N bytes 
e0f0: 66 72 6f 6d 20 74 68 65 20 62 65 67 69 6e 6e 69  from the beginni
e100: 6e 67 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  ng of the file i
e110: 6e 74 6f 20 6d 65 6d 6f 72 79 0a 2a 2a 20 74 68  nto memory.** th
e120: 61 74 20 70 44 65 73 74 20 70 6f 69 6e 74 73 20  at pDest points 
e130: 74 6f 2e 20 20 4e 6f 20 65 72 72 6f 72 20 63 68  to.  No error ch
e140: 65 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 0a  ecking is done..
e150: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70  */.void sqlite3p
e160: 61 67 65 72 5f 72 65 61 64 5f 66 69 6c 65 68 65  ager_read_filehe
e170: 61 64 65 72 28 50 61 67 65 72 20 2a 70 50 61 67  ader(Pager *pPag
e180: 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e 73 69 67  er, int N, unsig
e190: 6e 65 64 20 63 68 61 72 20 2a 70 44 65 73 74 29  ned char *pDest)
e1a0: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 44 65 73 74  {.  memset(pDest
e1b0: 2c 20 30 2c 20 4e 29 3b 0a 20 20 69 66 28 20 4d  , 0, N);.  if( M
e1c0: 45 4d 44 42 3d 3d 30 20 29 7b 0a 20 20 20 20 73  EMDB==0 ){.    s
e1d0: 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50  qlite3OsSeek(&pP
e1e0: 61 67 65 72 2d 3e 66 64 2c 20 30 29 3b 0a 20 20  ager->fd, 0);.  
e1f0: 20 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28    sqlite3OsRead(
e200: 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 44 65  &pPager->fd, pDe
e210: 73 74 2c 20 4e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  st, N);.  }.}../
e220: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
e230: 74 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20  total number of 
e240: 70 61 67 65 73 20 69 6e 20 74 68 65 20 64 69 73  pages in the dis
e250: 6b 20 66 69 6c 65 20 61 73 73 6f 63 69 61 74 65  k file associate
e260: 64 20 77 69 74 68 0a 2a 2a 20 70 50 61 67 65 72  d with.** pPager
e270: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
e280: 70 61 67 65 72 5f 70 61 67 65 63 6f 75 6e 74 28  pager_pagecount(
e290: 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
e2a0: 20 20 69 36 34 20 6e 3b 0a 20 20 61 73 73 65 72    i64 n;.  asser
e2b0: 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a  t( pPager!=0 );.
e2c0: 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62    if( pPager->db
e2d0: 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20 72  Size>=0 ){.    r
e2e0: 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 64 62  eturn pPager->db
e2f0: 53 69 7a 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Size;.  }.  if( 
e300: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
e310: 65 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 26  e(&pPager->fd, &
e320: 6e 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  n)!=SQLITE_OK ){
e330: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 65 72 72  .    pPager->err
e340: 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52 5f 45 52  Mask |= PAGER_ER
e350: 52 5f 44 49 53 4b 3b 0a 20 20 20 20 72 65 74 75  R_DISK;.    retu
e360: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 6e 20 2f 3d  rn 0;.  }.  n /=
e370: 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
e380: 65 3b 0a 20 20 69 66 28 20 21 4d 45 4d 44 42 20  e;.  if( !MEMDB 
e390: 26 26 20 6e 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  && n==PENDING_BY
e3a0: 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
e3b0: 69 7a 65 20 29 7b 0a 20 20 20 20 6e 2b 2b 3b 0a  ize ){.    n++;.
e3c0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
e3d0: 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 55  ->state!=PAGER_U
e3e0: 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 70 50 61  NLOCK ){.    pPa
e3f0: 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 3b  ger->dbSize = n;
e400: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
e410: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 77 61 72  .}../*.** Forwar
e420: 64 20 64 65 63 6c 61 72 61 74 69 6f 6e 0a 2a 2f  d declaration.*/
e430: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 79 6e 63  .static int sync
e440: 4a 6f 75 72 6e 61 6c 28 50 61 67 65 72 2a 29 3b  Journal(Pager*);
e450: 0a 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20  .../*.** Unlink 
e460: 70 50 67 20 66 72 6f 6d 20 69 74 27 73 20 68 61  pPg from it's ha
e470: 73 68 20 63 68 61 69 6e 2e 20 41 6c 73 6f 20 73  sh chain. Also s
e480: 65 74 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  et the page numb
e490: 65 72 20 74 6f 20 30 20 74 6f 20 69 6e 64 69 63  er to 0 to indic
e4a0: 61 74 65 0a 2a 2a 20 74 68 61 74 20 74 68 65 20  ate.** that the 
e4b0: 70 61 67 65 20 69 73 20 6e 6f 74 20 70 61 72 74  page is not part
e4c0: 20 6f 66 20 61 6e 79 20 68 61 73 68 20 63 68 61   of any hash cha
e4d0: 69 6e 2e 20 54 68 69 73 20 69 73 20 72 65 71 75  in. This is requ
e4e0: 69 72 65 64 20 62 65 63 61 75 73 65 20 74 68 65  ired because the
e4f0: 0a 2a 2a 20 73 71 6c 69 74 65 33 70 61 67 65 72  .** sqlite3pager
e500: 5f 6d 6f 76 65 70 61 67 65 28 29 20 72 6f 75 74  _movepage() rout
e510: 69 6e 65 20 63 61 6e 20 6c 65 61 76 65 20 61 20  ine can leave a 
e520: 70 61 67 65 20 69 6e 20 74 68 65 20 0a 2a 2a 20  page in the .** 
e530: 70 4e 65 78 74 46 72 65 65 2f 70 50 72 65 76 46  pNextFree/pPrevF
e540: 72 65 65 20 6c 69 73 74 20 74 68 61 74 20 69 73  ree list that is
e550: 20 6e 6f 74 20 61 20 70 61 72 74 20 6f 66 20 61   not a part of a
e560: 6e 79 20 68 61 73 68 2d 63 68 61 69 6e 2e 0a 2a  ny hash-chain..*
e570: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 75 6e  /.static void un
e580: 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 50 61  linkHashChain(Pa
e590: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 48  ger *pPager, PgH
e5a0: 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66 28 20  dr *pPg){.  if( 
e5b0: 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b 0a  pPg->pgno==0 ){.
e5c0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61      /* If the pa
e5d0: 67 65 20 6e 75 6d 62 65 72 20 69 73 20 7a 65 72  ge number is zer
e5e0: 6f 2c 20 74 68 65 6e 20 74 68 69 73 20 70 61 67  o, then this pag
e5f0: 65 20 69 73 20 6e 6f 74 20 69 6e 20 61 6e 79 20  e is not in any 
e600: 68 61 73 68 20 63 68 61 69 6e 2e 20 2a 2f 0a 20  hash chain. */. 
e610: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
e620: 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
e630: 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
e640: 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
e650: 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
e660: 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
e670: 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
e680: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
e690: 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 61 67  Pager->aHash[pag
e6a0: 65 72 5f 68 61 73 68 28 70 50 67 2d 3e 70 67 6e  er_hash(pPg->pgn
e6b0: 6f 29 5d 21 3d 70 50 67 20 29 3b 0a 20 20 20 20  o)]!=pPg );.    
e6c0: 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 2d 3e  pPg->pPrevHash->
e6d0: 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67 2d  pNextHash = pPg-
e6e0: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 65  >pNextHash;.  }e
e6f0: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 68 20 3d  lse{.    int h =
e700: 20 70 61 67 65 72 5f 68 61 73 68 28 70 50 67 2d   pager_hash(pPg-
e710: 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
e720: 72 74 28 20 70 50 61 67 65 72 2d 3e 61 48 61 73  rt( pPager->aHas
e730: 68 5b 68 5d 3d 3d 70 50 67 20 29 3b 0a 20 20 20  h[h]==pPg );.   
e740: 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
e750: 5d 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  ] = pPg->pNextHa
e760: 73 68 3b 0a 20 20 7d 0a 0a 20 20 70 50 67 2d 3e  sh;.  }..  pPg->
e770: 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 70 50 67 2d  pgno = 0;.  pPg-
e780: 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50 67  >pNextHash = pPg
e790: 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b  ->pPrevHash = 0;
e7a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b  .}../*.** Unlink
e7b0: 20 61 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65   a page from the
e7c0: 20 66 72 65 65 20 6c 69 73 74 20 28 74 68 65 20   free list (the 
e7d0: 6c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67 65  list of all page
e7e0: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 29  s where nRef==0)
e7f0: 0a 2a 2a 20 61 6e 64 20 66 72 6f 6d 20 69 74 73  .** and from its
e800: 20 68 61 73 68 20 63 6f 6c 6c 69 73 69 6f 6e 20   hash collision 
e810: 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  chain..*/.static
e820: 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 50 61 67 65   void unlinkPage
e830: 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20  (PgHdr *pPg){.  
e840: 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20  Pager *pPager = 
e850: 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 0a 20 20  pPg->pPager;..  
e860: 2f 2a 20 4b 65 65 70 20 74 68 65 20 70 46 69 72  /* Keep the pFir
e870: 73 74 53 79 6e 63 65 64 20 70 6f 69 6e 74 65 72  stSynced pointer
e880: 20 70 6f 69 6e 74 69 6e 67 20 61 74 20 74 68 65   pointing at the
e890: 20 66 69 72 73 74 20 73 79 6e 63 68 72 6f 6e 69   first synchroni
e8a0: 7a 65 64 20 70 61 67 65 20 2a 2f 0a 20 20 69 66  zed page */.  if
e8b0: 28 20 70 50 67 3d 3d 70 50 61 67 65 72 2d 3e 70  ( pPg==pPager->p
e8c0: 46 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20  FirstSynced ){. 
e8d0: 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70 50     PgHdr *p = pP
e8e0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
e8f0: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
e900: 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d  >needSync ){ p =
e910: 20 70 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d   p->pNextFree; }
e920: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69  .    pPager->pFi
e930: 72 73 74 53 79 6e 63 65 64 20 3d 20 70 3b 0a 20  rstSynced = p;. 
e940: 20 7d 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20   }..  /* Unlink 
e950: 66 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73  from the freelis
e960: 74 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d 3e  t */.  if( pPg->
e970: 70 50 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20  pPrevFree ){.   
e980: 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
e990: 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
e9a0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 7d  ->pNextFree;.  }
e9b0: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
e9c0: 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ( pPager->pFirst
e9d0: 3d 3d 70 50 67 20 29 3b 0a 20 20 20 20 70 50 61  ==pPg );.    pPa
e9e0: 67 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50  ger->pFirst = pP
e9f0: 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20  g->pNextFree;.  
ea00: 7d 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 4e 65  }.  if( pPg->pNe
ea10: 78 74 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50  xtFree ){.    pP
ea20: 67 2d 3e 70 4e 65 78 74 46 72 65 65 2d 3e 70 50  g->pNextFree->pP
ea30: 72 65 76 46 72 65 65 20 3d 20 70 50 67 2d 3e 70  revFree = pPg->p
ea40: 50 72 65 76 46 72 65 65 3b 0a 20 20 7d 65 6c 73  PrevFree;.  }els
ea50: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
ea60: 50 61 67 65 72 2d 3e 70 4c 61 73 74 3d 3d 70 50  Pager->pLast==pP
ea70: 67 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  g );.    pPager-
ea80: 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70 50  >pLast = pPg->pP
ea90: 72 65 76 46 72 65 65 3b 0a 20 20 7d 0a 20 20 70  revFree;.  }.  p
eaa0: 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20  Pg->pNextFree = 
eab0: 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 20 3d  pPg->pPrevFree =
eac0: 20 30 3b 0a 0a 20 20 2f 2a 20 55 6e 6c 69 6e 6b   0;..  /* Unlink
ead0: 20 66 72 6f 6d 20 74 68 65 20 70 67 6e 6f 20 68   from the pgno h
eae0: 61 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 75  ash table */.  u
eaf0: 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28 70  nlinkHashChain(p
eb00: 50 61 67 65 72 2c 20 70 50 67 29 3b 0a 7d 0a 0a  Pager, pPg);.}..
eb10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
eb20: 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a  MIT_MEMORYDB./*.
eb30: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
eb40: 69 73 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63  is used to trunc
eb50: 61 74 65 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  ate an in-memory
eb60: 20 64 61 74 61 62 61 73 65 2e 20 20 44 65 6c 65   database.  Dele
eb70: 74 65 0a 2a 2a 20 61 6c 6c 20 70 61 67 65 73 20  te.** all pages 
eb80: 77 68 6f 73 65 20 70 67 6e 6f 20 69 73 20 6c 61  whose pgno is la
eb90: 72 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72  rger than pPager
eba0: 2d 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20  ->dbSize and is 
ebb0: 75 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a  unreferenced..**
ebc0: 20 52 65 66 65 72 65 6e 63 65 64 20 70 61 67 65   Referenced page
ebd0: 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20 70 50  s larger than pP
ebe0: 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61 72 65  ager->dbSize are
ebf0: 20 7a 65 72 6f 65 64 2e 0a 2a 2f 0a 73 74 61 74   zeroed..*/.stat
ec00: 69 63 20 76 6f 69 64 20 6d 65 6d 6f 72 79 54 72  ic void memoryTr
ec10: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
ec20: 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a  ager){.  PgHdr *
ec30: 70 50 67 3b 0a 20 20 50 67 48 64 72 20 2a 2a 70  pPg;.  PgHdr **p
ec40: 70 50 67 3b 0a 20 20 69 6e 74 20 64 62 53 69 7a  pPg;.  int dbSiz
ec50: 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
ec60: 7a 65 3b 0a 0a 20 20 70 70 50 67 20 3d 20 26 70  ze;..  ppPg = &p
ec70: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a 20 20 77  Pager->pAll;.  w
ec80: 68 69 6c 65 28 20 28 70 50 67 20 3d 20 2a 70 70  hile( (pPg = *pp
ec90: 50 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  Pg)!=0 ){.    if
eca0: 28 20 70 50 67 2d 3e 70 67 6e 6f 3c 3d 64 62 53  ( pPg->pgno<=dbS
ecb0: 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 70 50  ize ){.      ppP
ecc0: 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74 41  g = &pPg->pNextA
ecd0: 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
ece0: 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20 29 7b  ( pPg->nRef>0 ){
ecf0: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50 47  .      memset(PG
ed00: 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
ed10: 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70 61 67  , 0, pPager->pag
ed20: 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 70 70  eSize);.      pp
ed30: 50 67 20 3d 20 26 70 50 67 2d 3e 70 4e 65 78 74  Pg = &pPg->pNext
ed40: 41 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  All;.    }else{.
ed50: 20 20 20 20 20 20 2a 70 70 50 67 20 3d 20 70 50        *ppPg = pP
ed60: 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20 20 20  g->pNextAll;.   
ed70: 20 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50     unlinkPage(pP
ed80: 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
ed90: 46 72 65 65 28 70 50 67 29 3b 0a 20 20 20 20 20  Free(pPg);.     
eda0: 20 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2d 2d   pPager->nPage--
edb0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 23 65  ;.    }.  }.}.#e
edc0: 6c 73 65 0a 23 64 65 66 69 6e 65 20 6d 65 6d 6f  lse.#define memo
edd0: 72 79 54 72 75 6e 63 61 74 65 28 70 29 0a 23 65  ryTruncate(p).#e
ede0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 6e  ndif../*.** Trun
edf0: 63 61 74 65 20 74 68 65 20 66 69 6c 65 20 74 6f  cate the file to
ee00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
ee10: 61 67 65 73 20 73 70 65 63 69 66 69 65 64 2e 0a  ages specified..
ee20: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
ee30: 67 65 72 5f 74 72 75 6e 63 61 74 65 28 50 61 67  ger_truncate(Pag
ee40: 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f  er *pPager, Pgno
ee50: 20 6e 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72   nPage){.  int r
ee60: 63 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  c;.  sqlite3page
ee70: 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
ee80: 65 72 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  er);.  if( pPage
ee90: 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
eea0: 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
eeb0: 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
eec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
eed0: 20 20 7d 0a 20 20 69 66 28 20 6e 50 61 67 65 3e    }.  if( nPage>
eee0: 3d 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  =(unsigned)pPage
eef0: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
ef00: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
ef10: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d  K;.  }.  if( MEM
ef20: 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72  DB ){.    pPager
ef30: 2d 3e 64 62 53 69 7a 65 20 3d 20 6e 50 61 67 65  ->dbSize = nPage
ef40: 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e  ;.    memoryTrun
ef50: 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a 20 20  cate(pPager);.  
ef60: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
ef70: 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73  OK;.  }.  rc = s
ef80: 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  yncJournal(pPage
ef90: 72 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  r);.  if( rc!=SQ
efa0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
efb0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
efc0: 72 63 20 3d 20 70 61 67 65 72 5f 74 72 75 6e 63  rc = pager_trunc
efd0: 61 74 65 28 70 50 61 67 65 72 2c 20 6e 50 61 67  ate(pPager, nPag
efe0: 65 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  e);.  if( rc==SQ
eff0: 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70  LITE_OK ){.    p
f000: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
f010: 6e 50 61 67 65 3b 0a 20 20 7d 0a 20 20 72 65 74  nPage;.  }.  ret
f020: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
f030: 20 53 68 75 74 64 6f 77 6e 20 74 68 65 20 70 61   Shutdown the pa
f040: 67 65 20 63 61 63 68 65 2e 20 20 46 72 65 65 20  ge cache.  Free 
f050: 61 6c 6c 20 6d 65 6d 6f 72 79 20 61 6e 64 20 63  all memory and c
f060: 6c 6f 73 65 20 61 6c 6c 20 66 69 6c 65 73 2e 0a  lose all files..
f070: 2a 2a 0a 2a 2a 20 49 66 20 61 20 74 72 61 6e 73  **.** If a trans
f080: 61 63 74 69 6f 6e 20 77 61 73 20 69 6e 20 70 72  action was in pr
f090: 6f 67 72 65 73 73 20 77 68 65 6e 20 74 68 69 73  ogress when this
f0a0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
f0b0: 65 64 2c 20 74 68 61 74 0a 2a 2a 20 74 72 61 6e  ed, that.** tran
f0c0: 73 61 63 74 69 6f 6e 20 69 73 20 72 6f 6c 6c 65  saction is rolle
f0d0: 64 20 62 61 63 6b 2e 20 20 41 6c 6c 20 6f 75 74  d back.  All out
f0e0: 73 74 61 6e 64 69 6e 67 20 70 61 67 65 73 20 61  standing pages a
f0f0: 72 65 20 69 6e 76 61 6c 69 64 61 74 65 64 0a 2a  re invalidated.*
f100: 2a 20 61 6e 64 20 74 68 65 69 72 20 6d 65 6d 6f  * and their memo
f110: 72 79 20 69 73 20 66 72 65 65 64 2e 20 20 41 6e  ry is freed.  An
f120: 79 20 61 74 74 65 6d 70 74 20 74 6f 20 75 73 65  y attempt to use
f130: 20 61 20 70 61 67 65 20 61 73 73 6f 63 69 61 74   a page associat
f140: 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 69 73 20  ed.** with this 
f150: 70 61 67 65 20 63 61 63 68 65 20 61 66 74 65 72  page cache after
f160: 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 72   this function r
f170: 65 74 75 72 6e 73 20 77 69 6c 6c 20 6c 69 6b 65  eturns will like
f180: 6c 79 0a 2a 2a 20 72 65 73 75 6c 74 20 69 6e 20  ly.** result in 
f190: 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a 69  a coredump..*/.i
f1a0: 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
f1b0: 63 6c 6f 73 65 28 50 61 67 65 72 20 2a 70 50 61  close(Pager *pPa
f1c0: 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  ger){.  PgHdr *p
f1d0: 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20 73 77  Pg, *pNext;.  sw
f1e0: 69 74 63 68 28 20 70 50 61 67 65 72 2d 3e 73 74  itch( pPager->st
f1f0: 61 74 65 20 29 7b 0a 20 20 20 20 63 61 73 65 20  ate ){.    case 
f200: 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3a 0a  PAGER_RESERVED:.
f210: 20 20 20 20 63 61 73 65 20 50 41 47 45 52 5f 53      case PAGER_S
f220: 59 4e 43 45 44 3a 20 0a 20 20 20 20 63 61 73 65  YNCED: .    case
f230: 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
f240: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 57 65 20  : {.      /* We 
f250: 69 67 6e 6f 72 65 20 61 6e 79 20 49 4f 20 65 72  ignore any IO er
f260: 72 6f 72 73 20 74 68 61 74 20 6f 63 63 75 72 20  rors that occur 
f270: 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c 6c 62  during the rollb
f280: 61 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6f 70 65  ack.      ** ope
f290: 72 61 74 69 6f 6e 2e 20 53 6f 20 64 69 73 61 62  ration. So disab
f2a0: 6c 65 20 49 4f 20 65 72 72 6f 72 20 73 69 6d 75  le IO error simu
f2b0: 6c 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  lation so that t
f2c0: 65 73 74 69 6e 67 0a 20 20 20 20 20 20 2a 2a 20  esting.      ** 
f2d0: 77 6f 72 6b 73 20 6d 6f 72 65 20 65 61 73 69 6c  works more easil
f2e0: 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 23 69 66 20  y..      */.#if 
f2f0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54  defined(SQLITE_T
f300: 45 53 54 29 20 26 26 20 28 64 65 66 69 6e 65 64  EST) && (defined
f310: 28 4f 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65 66  (OS_UNIX) || def
f320: 69 6e 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20 20  ined(OS_WIN)).  
f330: 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
f340: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f350: 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20 20 69  pending;.      i
f360: 6e 74 20 69 6f 65 72 72 5f 63 6e 74 20 3d 20 73  nt ioerr_cnt = s
f370: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f380: 70 65 6e 64 69 6e 67 3b 0a 20 20 20 20 20 20 73  pending;.      s
f390: 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
f3a0: 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 23 65  pending = -1;.#e
f3b0: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
f3c0: 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b  e3pager_rollback
f3d0: 28 70 50 61 67 65 72 29 3b 0a 23 69 66 20 64 65  (pPager);.#if de
f3e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53  fined(SQLITE_TES
f3f0: 54 29 20 26 26 20 28 64 65 66 69 6e 65 64 28 4f  T) && (defined(O
f400: 53 5f 55 4e 49 58 29 20 7c 7c 20 64 65 66 69 6e  S_UNIX) || defin
f410: 65 64 28 4f 53 5f 57 49 4e 29 29 0a 20 20 20 20  ed(OS_WIN)).    
f420: 20 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72    sqlite3_io_err
f430: 6f 72 5f 70 65 6e 64 69 6e 67 20 3d 20 69 6f 65  or_pending = ioe
f440: 72 72 5f 63 6e 74 3b 0a 23 65 6e 64 69 66 0a 20  rr_cnt;.#endif. 
f450: 20 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20       if( !MEMDB 
f460: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
f470: 65 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67  e3OsUnlock(&pPag
f480: 65 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29  er->fd, NO_LOCK)
f490: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
f4a0: 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
f4b0: 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29  journalOpen==0 )
f4c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f4d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 50 41     }.    case PA
f4e0: 47 45 52 5f 53 48 41 52 45 44 3a 20 7b 0a 20 20  GER_SHARED: {.  
f4f0: 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29      if( !MEMDB )
f500: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
f510: 33 4f 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65  3OsUnlock(&pPage
f520: 72 2d 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b  r->fd, NO_LOCK);
f530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
f540: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f550: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
f560: 20 2f 2a 20 44 6f 20 6e 6f 74 68 69 6e 67 20 2a   /* Do nothing *
f570: 2f 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  /.      break;. 
f580: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28 70     }.  }.  for(p
f590: 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  Pg=pPager->pAll;
f5a0: 20 70 50 67 3b 20 70 50 67 3d 70 4e 65 78 74 29   pPg; pPg=pNext)
f5b0: 7b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  {.#ifndef NDEBUG
f5c0: 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
f5d0: 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
f5e0: 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
f5f0: 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
f600: 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
f610: 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
f620: 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
f630: 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
f640: 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
f650: 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
f660: 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
f670: 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 4e 65 78  .#endif.    pNex
f680: 74 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c  t = pPg->pNextAl
f690: 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  l;.    sqliteFre
f6a0: 65 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 54 52  e(pPg);.  }.  TR
f6b0: 41 43 45 32 28 22 43 4c 4f 53 45 20 25 64 5c 6e  ACE2("CLOSE %d\n
f6c0: 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
f6d0: 72 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73  r));.  sqlite3Os
f6e0: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 66  Close(&pPager->f
f6f0: 64 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50  d);.  assert( pP
f700: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
f710: 6e 3d 3d 30 20 29 3b 0a 20 20 2f 2a 20 54 65 6d  n==0 );.  /* Tem
f720: 70 20 66 69 6c 65 73 20 61 72 65 20 61 75 74 6f  p files are auto
f730: 6d 61 74 69 63 61 6c 6c 79 20 64 65 6c 65 74 65  matically delete
f740: 64 20 62 79 20 74 68 65 20 4f 53 0a 20 20 2a 2a  d by the OS.  **
f750: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 74 65 6d   if( pPager->tem
f760: 70 46 69 6c 65 20 29 7b 0a 20 20 2a 2a 20 20 20  pFile ){.  **   
f770: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
f780: 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
f790: 65 29 3b 0a 20 20 2a 2a 20 7d 0a 20 20 2a 2f 0a  e);.  ** }.  */.
f7a0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50  .  sqliteFree(pP
f7b0: 61 67 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20  ager);.  return 
f7c0: 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a  SQLITE_OK;.}../*
f7d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 70  .** Return the p
f7e0: 61 67 65 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  age number for t
f7f0: 68 65 20 67 69 76 65 6e 20 70 61 67 65 20 64 61  he given page da
f800: 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20 73 71 6c 69  ta..*/.Pgno sqli
f810: 74 65 33 70 61 67 65 72 5f 70 61 67 65 6e 75 6d  te3pager_pagenum
f820: 62 65 72 28 76 6f 69 64 20 2a 70 44 61 74 61 29  ber(void *pData)
f830: 7b 0a 20 20 50 67 48 64 72 20 2a 70 20 3d 20 44  {.  PgHdr *p = D
f840: 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61  ATA_TO_PGHDR(pDa
f850: 74 61 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  ta);.  return p-
f860: 3e 70 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  >pgno;.}../*.** 
f870: 54 68 65 20 70 61 67 65 5f 72 65 66 28 29 20 66  The page_ref() f
f880: 75 6e 63 74 69 6f 6e 20 69 6e 63 72 65 6d 65 6e  unction incremen
f890: 74 73 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  ts the reference
f8a0: 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
f8b0: 65 2e 0a 2a 2a 20 49 66 20 74 68 65 20 70 61 67  e..** If the pag
f8c0: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
f8d0: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 28  n the freelist (
f8e0: 74 68 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f  the reference co
f8f0: 75 6e 74 20 69 73 20 7a 65 72 6f 29 20 74 68 65  unt is zero) the
f900: 6e 0a 2a 2a 20 72 65 6d 6f 76 65 20 69 74 20 66  n.** remove it f
f910: 72 6f 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74  rom the freelist
f920: 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 6e 6f 6e 2d  ..**.** For non-
f930: 74 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61  test systems, pa
f940: 67 65 5f 72 65 66 28 29 20 69 73 20 61 20 6d 61  ge_ref() is a ma
f950: 63 72 6f 20 74 68 61 74 20 63 61 6c 6c 73 20 5f  cro that calls _
f960: 70 61 67 65 5f 72 65 66 28 29 0a 2a 2a 20 6f 6e  page_ref().** on
f970: 6c 69 6e 65 20 6f 66 20 74 68 65 20 72 65 66 65  line of the refe
f980: 72 65 6e 63 65 20 63 6f 75 6e 74 20 69 73 20 7a  rence count is z
f990: 65 72 6f 2e 20 20 46 6f 72 20 74 65 73 74 20 73  ero.  For test s
f9a0: 79 73 74 65 6d 73 2c 20 70 61 67 65 5f 72 65 66  ystems, page_ref
f9b0: 28 29 0a 2a 2a 20 69 73 20 61 20 72 65 61 6c 20  ().** is a real 
f9c0: 66 75 6e 63 74 69 6f 6e 20 73 6f 20 74 68 61 74  function so that
f9d0: 20 77 65 20 63 61 6e 20 73 65 74 20 62 72 65 61   we can set brea
f9e0: 6b 70 6f 69 6e 74 73 20 61 6e 64 20 74 72 61 63  kpoints and trac
f9f0: 65 20 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  e it..*/.static 
fa00: 76 6f 69 64 20 5f 70 61 67 65 5f 72 65 66 28 50  void _page_ref(P
fa10: 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 69 66  gHdr *pPg){.  if
fa20: 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29  ( pPg->nRef==0 )
fa30: 7b 0a 20 20 20 20 2f 2a 20 54 68 65 20 70 61 67  {.    /* The pag
fa40: 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6f  e is currently o
fa50: 6e 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e 20  n the freelist. 
fa60: 20 52 65 6d 6f 76 65 20 69 74 2e 20 2a 2f 0a 20   Remove it. */. 
fa70: 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50 67 2d     if( pPg==pPg-
fa80: 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53  >pPager->pFirstS
fa90: 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 20 20 50  ynced ){.      P
faa0: 67 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70  gHdr *p = pPg->p
fab0: 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 20 20  NextFree;.      
fac0: 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e  while( p && p->n
fad0: 65 65 64 53 79 6e 63 20 29 7b 20 70 20 3d 20 70  eedSync ){ p = p
fae0: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20  ->pNextFree; }. 
faf0: 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
fb00: 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d  ->pFirstSynced =
fb10: 20 70 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   p;.    }.    if
fb20: 28 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65  ( pPg->pPrevFree
fb30: 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
fb40: 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78 74 46  PrevFree->pNextF
fb50: 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74  ree = pPg->pNext
fb60: 46 72 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Free;.    }else{
fb70: 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67  .      pPg->pPag
fb80: 65 72 2d 3e 70 46 69 72 73 74 20 3d 20 70 50 67  er->pFirst = pPg
fb90: 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20  ->pNextFree;.   
fba0: 20 7d 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e   }.    if( pPg->
fbb0: 70 4e 65 78 74 46 72 65 65 20 29 7b 0a 20 20 20  pNextFree ){.   
fbc0: 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65     pPg->pNextFre
fbd0: 65 2d 3e 70 50 72 65 76 46 72 65 65 20 3d 20 70  e->pPrevFree = p
fbe0: 50 67 2d 3e 70 50 72 65 76 46 72 65 65 3b 0a 20  Pg->pPrevFree;. 
fbf0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fc00: 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 4c 61  pPg->pPager->pLa
fc10: 73 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  st = pPg->pPrevF
fc20: 72 65 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ree;.    }.    p
fc30: 50 67 2d 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66  Pg->pPager->nRef
fc40: 2b 2b 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 6e  ++;.  }.  pPg->n
fc50: 52 65 66 2b 2b 3b 0a 20 20 52 45 46 49 4e 46 4f  Ref++;.  REFINFO
fc60: 28 70 50 67 29 3b 0a 7d 0a 23 69 66 64 65 66 20  (pPg);.}.#ifdef 
fc70: 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 73  SQLITE_DEBUG.  s
fc80: 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 5f  tatic void page_
fc90: 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
fca0: 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 52  .    if( pPg->nR
fcb0: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 5f  ef==0 ){.      _
fcc0: 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a 20  page_ref(pPg);. 
fcd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
fce0: 70 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20  pPg->nRef++;.   
fcf0: 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29 3b     REFINFO(pPg);
fd00: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6c 73 65  .    }.  }.#else
fd10: 0a 23 20 64 65 66 69 6e 65 20 70 61 67 65 5f 72  .# define page_r
fd20: 65 66 28 50 29 20 20 20 28 28 50 29 2d 3e 6e 52  ef(P)   ((P)->nR
fd30: 65 66 3d 3d 30 3f 5f 70 61 67 65 5f 72 65 66 28  ef==0?_page_ref(
fd40: 50 29 3a 28 76 6f 69 64 29 28 50 29 2d 3e 6e 52  P):(void)(P)->nR
fd50: 65 66 2b 2b 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ef++).#endif../*
fd60: 0a 2a 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68  .** Increment th
fd70: 65 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e  e reference coun
fd80: 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20 20 54  t for a page.  T
fd90: 68 65 20 69 6e 70 75 74 20 70 6f 69 6e 74 65 72  he input pointer
fda0: 20 69 73 0a 2a 2a 20 61 20 72 65 66 65 72 65 6e   is.** a referen
fdb0: 63 65 20 74 6f 20 74 68 65 20 70 61 67 65 20 64  ce to the page d
fdc0: 61 74 61 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ata..*/.int sqli
fdd0: 74 65 33 70 61 67 65 72 5f 72 65 66 28 76 6f 69  te3pager_ref(voi
fde0: 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67 48  d *pData){.  PgH
fdf0: 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f 54  dr *pPg = DATA_T
fe00: 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b 0a  O_PGHDR(pData);.
fe10: 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
fe20: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
fe30: 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79  _OK;.}../*.** Sy
fe40: 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20  nc the journal. 
fe50: 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
fe60: 20 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74   make sure all t
fe70: 68 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61  he pages that ha
fe80: 76 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74  ve.** been writt
fe90: 65 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61  en to the journa
fea0: 6c 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20  l have actually 
feb0: 72 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66  reached the surf
fec0: 61 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69  ace of the.** di
fed0: 73 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73  sk.  It is not s
fee0: 61 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68  afe to modify th
fef0: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
ff00: 61 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61  ase file until a
ff10: 66 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72  fter.** the jour
ff20: 6e 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e  nal has been syn
ff30: 63 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69  ced.  If the ori
ff40: 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69  ginal database i
ff50: 73 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72  s modified befor
ff60: 65 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e.** the journal
ff70: 20 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61   is synced and a
ff80: 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f   power failure o
ff90: 63 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e  ccurs, the unsyn
ffa0: 63 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64  ced journal.** d
ffb0: 61 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73  ata would be los
ffc0: 74 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62  t and we would b
ffd0: 65 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70  e unable to comp
ffe0: 6c 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20  letely rollback 
fff0: 74 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20  the.** database 
10000 63 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61  changes.  Databa
10010 73 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f  se corruption wo
10020 75 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a  uld occur..** .*
10030 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
10040 6c 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20  lso updates the 
10050 6e 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68  nRec field in th
10060 65 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20  e header of the 
10070 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65  journal..** (See
10080 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65   comments on the
10090 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28   pager_playback(
100a0 29 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64  ) routine for ad
100b0 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61  ditional informa
100c0 74 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65  tion.).** If the
100d0 20 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55   sync mode is FU
100e0 4c 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69  LL, two syncs wi
100f0 6c 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74  ll occur.  First
10100 20 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e   the whole journ
10110 61 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c  al.** is synced,
10120 20 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66   then the nRec f
10130 69 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c  ield is updated,
10140 20 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73   then a second s
10150 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a  ync occurs..**.*
10160 2a 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20  * For temporary 
10170 64 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f  databases, we do
10180 20 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20   not care if we 
10190 61 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c  are able to roll
101a0 62 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20  back.** after a 
101b0 70 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73  power failure, s
101c0 6f 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a  o sync occurs..*
101d0 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
101e0 65 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65  e clears the nee
101f0 64 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65  dSync field of e
10200 76 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e  very page curren
10210 74 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d  t held in.** mem
10220 6f 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ory..*/.static i
10230 6e 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50  nt syncJournal(P
10240 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
10250 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69   PgHdr *pPg;.  i
10260 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
10270 4b 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68  K;..  /* Sync th
10280 65 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65  e journal before
10290 20 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d   modifying the m
102a0 61 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a  ain database.  *
102b0 2a 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72  * (assuming ther
102c0 65 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61  e is a journal a
102d0 6e 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62  nd it needs to b
102e0 65 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a  e synced.).  */.
102f0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65    if( pPager->ne
10300 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66  edSync ){.    if
10310 28 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46  ( !pPager->tempF
10320 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73  ile ){.      ass
10330 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
10340 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
10350 20 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50    /* assert( !pP
10360 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20  ager->noSync ); 
10370 2f 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20  // noSync might 
10380 62 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72  be set if synchr
10390 6f 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77  onous.      ** w
103a0 61 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66  as turned off af
103b0 74 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74  ter the transact
103c0 69 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e  ion was started.
103d0 20 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f    Ticket #615 */
103e0 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a  .#ifndef NDEBUG.
103f0 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
10400 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  /* Make sure the
10410 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f   pPager->nRec co
10420 75 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65  unter we are kee
10430 70 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20  ping agrees.    
10440 20 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20      ** with the 
10450 6e 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72  nRec computed fr
10460 6f 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  om the size of t
10470 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
10480 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
10490 20 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20      i64 jSz;.   
104a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
104b0 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50 61  3OsFileSize(&pPa
104c0 67 65 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b  ger->jfd, &jSz);
104d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 21  .        if( rc!
104e0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
104f0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
10500 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
10510 66 66 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20  ff==jSz );.     
10520 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
10530 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69  {.        /* Wri
10540 74 65 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75  te the nRec valu
10550 65 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  e into the journ
10560 61 6c 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20  al file header. 
10570 49 66 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  If in.        **
10580 20 66 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75   full-synchronou
10590 73 20 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65  s mode, sync the
105a0 20 6a 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20   journal first. 
105b0 54 68 69 73 20 65 6e 73 75 72 65 73 20 74 68 61  This ensures tha
105c0 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c  t.        ** all
105d0 20 64 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79   data has really
105e0 20 68 69 74 20 74 68 65 20 64 69 73 6b 20 62 65   hit the disk be
105f0 66 6f 72 65 20 6e 52 65 63 20 69 73 20 75 70 64  fore nRec is upd
10600 61 74 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20  ated to mark.   
10610 20 20 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20       ** it as a 
10620 63 61 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f  candidate for ro
10630 6c 6c 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20  llback. .       
10640 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
10650 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
10660 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 54 52   ){.          TR
10670 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72 6e  ACE2("SYNC journ
10680 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41 47  al of %d\n", PAG
10690 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
106a0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
106b0 6c 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61  lite3OsSync(&pPa
106c0 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20  ger->jfd);.     
106d0 20 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29       if( rc!=0 )
106e0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
106f0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
10700 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
10710 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72  ger->jfd, pPager
10720 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73  ->journalHdr + s
10730 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61  izeof(aJournalMa
10740 67 69 63 29 29 3b 0a 20 20 20 20 20 20 20 20 72  gic));.        r
10750 63 20 3d 20 77 72 69 74 65 33 32 62 69 74 73 28  c = write32bits(
10760 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
10770 61 67 65 72 2d 3e 6e 52 65 63 29 3b 0a 20 20 20  ager->nRec);.   
10780 20 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65       if( rc ) re
10790 74 75 72 6e 20 72 63 3b 0a 0a 20 20 20 20 20 20  turn rc;..      
107a0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28    sqlite3OsSeek(
107b0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50  &pPager->jfd, pP
107c0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
107d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
107e0 20 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f   TRACE2("SYNC jo
107f0 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
10800 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
10810 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
10820 69 74 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67  ite3OsSync(&pPag
10830 65 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20  er->jfd);.      
10840 69 66 28 20 72 63 21 3d 30 20 29 20 72 65 74 75  if( rc!=0 ) retu
10850 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 70 50 61  rn rc;.      pPa
10860 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72  ger->journalStar
10870 74 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20  ted = 1;.    }. 
10880 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53     pPager->needS
10890 79 6e 63 20 3d 20 30 3b 0a 0a 20 20 20 20 2f 2a  ync = 0;..    /*
108a0 20 45 72 61 73 65 20 74 68 65 20 6e 65 65 64 53   Erase the needS
108b0 79 6e 63 20 66 6c 61 67 20 66 72 6f 6d 20 65 76  ync flag from ev
108c0 65 72 79 20 70 61 67 65 2e 0a 20 20 20 20 2a 2f  ery page..    */
108d0 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61  .    for(pPg=pPa
108e0 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20  ger->pAll; pPg; 
108f0 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c  pPg=pPg->pNextAl
10900 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  l){.      pPg->n
10910 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
10920 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
10930 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 70 50  FirstSynced = pP
10940 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
10950 7d 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  }..#ifndef NDEBU
10960 47 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 50 61  G.  /* If the Pa
10970 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
10980 67 20 69 73 20 63 6c 65 61 72 20 74 68 65 6e 20  g is clear then 
10990 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
109a0 6e 63 0a 20 20 2a 2a 20 66 6c 61 67 20 6d 75 73  nc.  ** flag mus
109b0 74 20 61 6c 73 6f 20 62 65 20 63 6c 65 61 72 20  t also be clear 
109c0 66 6f 72 20 61 6c 6c 20 70 61 67 65 73 2e 20 20  for all pages.  
109d0 56 65 72 69 66 79 20 74 68 61 74 20 74 68 69 73  Verify that this
109e0 0a 20 20 2a 2a 20 69 6e 76 61 72 69 61 6e 74 20  .  ** invariant 
109f0 69 73 20 74 72 75 65 2e 0a 20 20 2a 2f 0a 20 20  is true..  */.  
10a00 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 70 50  else{.    for(pP
10a10 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20  g=pPager->pAll; 
10a20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e  pPg; pPg=pPg->pN
10a30 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20 20 61  extAll){.      a
10a40 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64  ssert( pPg->need
10a50 53 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 7d  Sync==0 );.    }
10a60 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
10a70 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10a80 64 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73  d==pPager->pFirs
10a90 74 20 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  t );.  }.#endif.
10aa0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
10ab0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 62  ./*.** Try to ob
10ac0 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f 6e 20 61  tain a lock on a
10ad0 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b 65 20 74   file.  Invoke t
10ae0 68 65 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b  he busy callback
10af0 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a 2a 2a 20   if the lock.** 
10b00 69 73 20 63 75 72 72 65 6e 74 6c 79 20 6e 6f 74  is currently not
10b10 20 61 76 61 69 6c 61 62 6c 65 2e 20 20 52 65 70   available.  Rep
10b20 65 61 74 65 20 75 6e 74 69 6c 20 74 68 65 20 62  eate until the b
10b30 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72 65 74  usy callback ret
10b40 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20 6f 72  urns.** false or
10b50 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63 6b 20   until the lock 
10b60 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a 2a 20  succeeds..**.** 
10b70 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  Return SQLITE_OK
10b80 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e 64 20   on success and 
10b90 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20 69 66  an error code if
10ba0 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74 61 69   we cannot obtai
10bb0 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e 0a 2a  n.** the lock..*
10bc0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61 67  /.static int pag
10bd0 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28  er_wait_on_lock(
10be0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
10bf0 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a 20 20  nt locktype){.  
10c00 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
10c10 28 20 50 41 47 45 52 5f 53 48 41 52 45 44 3d 3d  ( PAGER_SHARED==
10c20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20  SHARED_LOCK );. 
10c30 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f 52   assert( PAGER_R
10c40 45 53 45 52 56 45 44 3d 3d 52 45 53 45 52 56 45  ESERVED==RESERVE
10c50 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65  D_LOCK );.  asse
10c60 72 74 28 20 50 41 47 45 52 5f 45 58 43 4c 55 53  rt( PAGER_EXCLUS
10c70 49 56 45 3d 3d 45 58 43 4c 55 53 49 56 45 5f 4c  IVE==EXCLUSIVE_L
10c80 4f 43 4b 20 29 3b 0a 20 20 69 66 28 20 70 50 61  OCK );.  if( pPa
10c90 67 65 72 2d 3e 73 74 61 74 65 3e 3d 6c 6f 63 6b  ger->state>=lock
10ca0 74 79 70 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  type ){.    rc =
10cb0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65   SQLITE_OK;.  }e
10cc0 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 62 75 73  lse{.    int bus
10cd0 79 20 3d 20 31 3b 0a 20 20 20 20 64 6f 20 7b 0a  y = 1;.    do {.
10ce0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
10cf0 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61 67 65 72  e3OsLock(&pPager
10d00 2d 3e 66 64 2c 20 6c 6f 63 6b 74 79 70 65 29 3b  ->fd, locktype);
10d10 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 72 63 3d  .    }while( rc=
10d20 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 26 26 20  =SQLITE_BUSY && 
10d30 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
10d40 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 26 26  >pBusyHandler &&
10d50 20 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72   .        pPager
10d60 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 2d 3e  ->pBusyHandler->
10d70 78 46 75 6e 63 20 26 26 20 0a 20 20 20 20 20 20  xFunc && .      
10d80 20 20 70 50 61 67 65 72 2d 3e 70 42 75 73 79 48    pPager->pBusyH
10d90 61 6e 64 6c 65 72 2d 3e 78 46 75 6e 63 28 70 50  andler->xFunc(pP
10da0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
10db0 65 72 2d 3e 70 41 72 67 2c 20 62 75 73 79 2b 2b  er->pArg, busy++
10dc0 29 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  ).    );.    if(
10dd0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
10de0 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  {.      pPager->
10df0 73 74 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65  state = locktype
10e00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
10e10 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10e20 2a 20 47 69 76 65 6e 20 61 20 6c 69 73 74 20 6f  * Given a list o
10e30 66 20 70 61 67 65 73 20 28 63 6f 6e 6e 65 63 74  f pages (connect
10e40 65 64 20 62 79 20 74 68 65 20 50 67 48 64 72 2e  ed by the PgHdr.
10e50 70 44 69 72 74 79 20 70 6f 69 6e 74 65 72 29 20  pDirty pointer) 
10e60 77 72 69 74 65 0a 2a 2a 20 65 76 65 72 79 20 6f  write.** every o
10e70 6e 65 20 6f 66 20 74 68 6f 73 65 20 70 61 67 65  ne of those page
10e80 73 20 6f 75 74 20 74 6f 20 74 68 65 20 64 61 74  s out to the dat
10e90 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 6d  abase file and m
10ea0 61 72 6b 20 74 68 65 6d 20 61 6c 6c 0a 2a 2a 20  ark them all.** 
10eb0 61 73 20 63 6c 65 61 6e 2e 0a 2a 2f 0a 73 74 61  as clean..*/.sta
10ec0 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 77 72  tic int pager_wr
10ed0 69 74 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  ite_pagelist(PgH
10ee0 64 72 20 2a 70 4c 69 73 74 29 7b 0a 20 20 50 61  dr *pList){.  Pa
10ef0 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20 20 69  ger *pPager;.  i
10f00 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28 20 70 4c  nt rc;..  if( pL
10f10 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
10f20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70 50 61  SQLITE_OK;.  pPa
10f30 67 65 72 20 3d 20 70 4c 69 73 74 2d 3e 70 50 61  ger = pList->pPa
10f40 67 65 72 3b 0a 0a 20 20 2f 2a 20 41 74 20 74 68  ger;..  /* At th
10f50 69 73 20 70 6f 69 6e 74 20 74 68 65 72 65 20 6d  is point there m
10f60 61 79 20 62 65 20 65 69 74 68 65 72 20 61 20 52  ay be either a R
10f70 45 53 45 52 56 45 44 20 6f 72 20 45 58 43 4c 55  ESERVED or EXCLU
10f80 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
10f90 0a 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 66  .  ** database f
10fa0 69 6c 65 2e 20 49 66 20 74 68 65 72 65 20 69 73  ile. If there is
10fb0 20 61 6c 72 65 61 64 79 20 61 6e 20 45 58 43 4c   already an EXCL
10fc0 55 53 49 56 45 20 6c 6f 63 6b 2c 20 74 68 65 20  USIVE lock, the 
10fd0 66 6f 6c 6c 6f 77 69 6e 67 0a 20 20 2a 2a 20 63  following.  ** c
10fe0 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 4f  alls to sqlite3O
10ff0 73 4c 6f 63 6b 28 29 20 61 72 65 20 6e 6f 2d 6f  sLock() are no-o
11000 70 73 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 4d 6f  ps..  **.  ** Mo
11010 76 69 6e 67 20 74 68 65 20 6c 6f 63 6b 20 66 72  ving the lock fr
11020 6f 6d 20 52 45 53 45 52 56 45 44 20 74 6f 20 45  om RESERVED to E
11030 58 43 4c 55 53 49 56 45 20 61 63 74 75 61 6c 6c  XCLUSIVE actuall
11040 79 20 69 6e 76 6f 6c 76 65 73 20 67 6f 69 6e 67  y involves going
11050 0a 20 20 2a 2a 20 74 68 72 6f 75 67 68 20 61 6e  .  ** through an
11060 20 69 6e 74 65 72 6d 65 64 69 61 74 65 20 73 74   intermediate st
11070 61 74 65 20 50 45 4e 44 49 4e 47 2e 20 20 20 41  ate PENDING.   A
11080 20 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 70 72   PENDING lock pr
11090 65 76 65 6e 74 73 20 6e 65 77 0a 20 20 2a 2a 20  events new.  ** 
110a0 72 65 61 64 65 72 73 20 66 72 6f 6d 20 61 74 74  readers from att
110b0 61 63 68 69 6e 67 20 74 6f 20 74 68 65 20 64 61  aching to the da
110c0 74 61 62 61 73 65 20 62 75 74 20 69 73 20 75 6e  tabase but is un
110d0 73 75 66 66 69 63 69 65 6e 74 20 66 6f 72 20 75  sufficient for u
110e0 73 20 74 6f 0a 20 20 2a 2a 20 77 72 69 74 65 2e  s to.  ** write.
110f0 20 20 54 68 65 20 69 64 65 61 20 6f 66 20 61 20    The idea of a 
11100 50 45 4e 44 49 4e 47 20 6c 6f 63 6b 20 69 73 20  PENDING lock is 
11110 74 6f 20 70 72 65 76 65 6e 74 20 6e 65 77 20 72  to prevent new r
11120 65 61 64 65 72 73 20 66 72 6f 6d 0a 20 20 2a 2a  eaders from.  **
11130 20 63 6f 6d 69 6e 67 20 69 6e 20 77 68 69 6c 65   coming in while
11140 20 77 65 20 77 61 69 74 20 66 6f 72 20 65 78 69   we wait for exi
11150 73 74 69 6e 67 20 72 65 61 64 65 72 73 20 74 6f  sting readers to
11160 20 63 6c 65 61 72 2e 0a 20 20 2a 2a 0a 20 20 2a   clear..  **.  *
11170 2a 20 57 68 69 6c 65 20 74 68 65 20 70 61 67 65  * While the page
11180 72 20 69 73 20 69 6e 20 74 68 65 20 52 45 53 45  r is in the RESE
11190 52 56 45 44 20 73 74 61 74 65 2c 20 74 68 65 20  RVED state, the 
111a0 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73  original databas
111b0 65 20 66 69 6c 65 0a 20 20 2a 2a 20 69 73 20 75  e file.  ** is u
111c0 6e 63 68 61 6e 67 65 64 20 61 6e 64 20 77 65 20  nchanged and we 
111d0 63 61 6e 20 72 6f 6c 6c 62 61 63 6b 20 77 69 74  can rollback wit
111e0 68 6f 75 74 20 68 61 76 69 6e 67 20 74 6f 20 70  hout having to p
111f0 6c 61 79 62 61 63 6b 20 74 68 65 0a 20 20 2a 2a  layback the.  **
11200 20 6a 6f 75 72 6e 61 6c 20 69 6e 74 6f 20 74 68   journal into th
11210 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
11220 61 73 65 20 66 69 6c 65 2e 20 20 4f 6e 63 65 20  ase file.  Once 
11230 77 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f  we transition to
11240 0a 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45 2c  .  ** EXCLUSIVE,
11250 20 69 74 20 6d 65 61 6e 73 20 74 68 65 20 64 61   it means the da
11260 74 61 62 61 73 65 20 66 69 6c 65 20 68 61 73 20  tabase file has 
11270 62 65 65 6e 20 63 68 61 6e 67 65 64 20 61 6e 64  been changed and
11280 20 61 6e 79 20 72 6f 6c 6c 62 61 63 6b 0a 20 20   any rollback.  
11290 2a 2a 20 77 69 6c 6c 20 72 65 71 75 69 72 65 20  ** will require 
112a0 61 20 6a 6f 75 72 6e 61 6c 20 70 6c 61 79 62 61  a journal playba
112b0 63 6b 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  ck..  */.  rc = 
112c0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
112d0 63 6b 28 70 50 61 67 65 72 2c 20 45 58 43 4c 55  ck(pPager, EXCLU
112e0 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 69 66  SIVE_LOCK);.  if
112f0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
11300 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  ){.    return rc
11310 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28 20  ;.  }..  while( 
11320 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 61 73 73  pList ){.    ass
11330 65 72 74 28 20 70 4c 69 73 74 2d 3e 64 69 72 74  ert( pList->dirt
11340 79 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  y );.    sqlite3
11350 4f 73 53 65 65 6b 28 26 70 50 61 67 65 72 2d 3e  OsSeek(&pPager->
11360 66 64 2c 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f  fd, (pList->pgno
11370 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d  -1)*(i64)pPager-
11380 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
11390 2f 2a 20 49 66 20 74 68 65 72 65 20 61 72 65 20  /* If there are 
113a0 64 69 72 74 79 20 70 61 67 65 73 20 69 6e 20 74  dirty pages in t
113b0 68 65 20 70 61 67 65 20 63 61 63 68 65 20 77 69  he page cache wi
113c0 74 68 20 70 61 67 65 20 6e 75 6d 62 65 72 73 20  th page numbers 
113d0 67 72 65 61 74 65 72 0a 20 20 20 20 2a 2a 20 74  greater.    ** t
113e0 68 61 6e 20 50 61 67 65 72 2e 64 62 53 69 7a 65  han Pager.dbSize
113f0 2c 20 74 68 69 73 20 6d 65 61 6e 73 20 73 71 6c  , this means sql
11400 69 74 65 33 70 61 67 65 72 5f 74 72 75 6e 63 61  ite3pager_trunca
11410 74 65 28 29 20 77 61 73 20 63 61 6c 6c 65 64 20  te() was called 
11420 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 74  to.    ** make t
11430 68 65 20 66 69 6c 65 20 73 6d 61 6c 6c 65 72 20  he file smaller 
11440 28 70 72 65 73 75 6d 61 62 6c 79 20 62 79 20 61  (presumably by a
11450 75 74 6f 2d 76 61 63 75 75 6d 20 63 6f 64 65 29  uto-vacuum code)
11460 2e 20 44 6f 20 6e 6f 74 20 77 72 69 74 65 0a 20  . Do not write. 
11470 20 20 20 2a 2a 20 61 6e 79 20 73 75 63 68 20 70     ** any such p
11480 61 67 65 73 20 74 6f 20 74 68 65 20 66 69 6c 65  ages to the file
11490 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
114a0 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 3c 3d 70 50   pList->pgno<=pP
114b0 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a  ager->dbSize ){.
114c0 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61 67        CODEC(pPag
114d0 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  er, PGHDR_TO_DAT
114e0 41 28 70 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d  A(pList), pList-
114f0 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20 20 20 20  >pgno, 6);.     
11500 20 54 52 41 43 45 33 28 22 53 54 4f 52 45 20 25   TRACE3("STORE %
11510 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41  d page %d\n", PA
11520 47 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70  GERID(pPager), p
11530 4c 69 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20  List->pgno);.   
11540 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
11550 73 57 72 69 74 65 28 26 70 50 61 67 65 72 2d 3e  sWrite(&pPager->
11560 66 64 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54  fd, PGHDR_TO_DAT
11570 41 28 70 4c 69 73 74 29 2c 20 70 50 61 67 65 72  A(pList), pPager
11580 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
11590 20 20 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c     CODEC(pPager,
115a0 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70   PGHDR_TO_DATA(p
115b0 4c 69 73 74 29 2c 20 70 4c 69 73 74 2d 3e 70 67  List), pList->pg
115c0 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 50  no, 0);.      pP
115d0 61 67 65 72 2d 3e 6e 57 72 69 74 65 2b 2b 3b 0a  ager->nWrite++;.
115e0 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 4e 44      }.#ifndef ND
115f0 45 42 55 47 0a 20 20 20 20 65 6c 73 65 7b 0a 20  EBUG.    else{. 
11600 20 20 20 20 20 54 52 41 43 45 33 28 22 4e 4f 53       TRACE3("NOS
11610 54 4f 52 45 20 25 64 20 70 61 67 65 20 25 64 5c  TORE %d page %d\
11620 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
11630 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
11640 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  );.    }.#endif.
11650 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
11660 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 4c 69 73  urn rc;.    pLis
11670 74 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20  t->dirty = 0;.  
11680 20 20 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 2d    pList = pList-
11690 3e 70 44 69 72 74 79 3b 0a 20 20 7d 0a 20 20 72  >pDirty;.  }.  r
116a0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
116b0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6c 6c 65 63  .}../*.** Collec
116c0 74 20 65 76 65 72 79 20 64 69 72 74 79 20 70 61  t every dirty pa
116d0 67 65 20 69 6e 74 6f 20 61 20 64 69 72 74 79 20  ge into a dirty 
116e0 6c 69 73 74 20 61 6e 64 0a 2a 2a 20 72 65 74 75  list and.** retu
116f0 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
11700 74 68 65 20 68 65 61 64 20 6f 66 20 74 68 61 74  the head of that
11710 20 6c 69 73 74 2e 20 20 41 6c 6c 20 70 61 67 65   list.  All page
11720 73 20 61 72 65 0a 2a 2a 20 63 6f 6c 6c 65 63 74  s are.** collect
11730 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 79 20  ed even if they 
11740 61 72 65 20 73 74 69 6c 6c 20 69 6e 20 75 73 65  are still in use
11750 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64  ..*/.static PgHd
11760 72 20 2a 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c  r *pager_get_all
11770 5f 64 69 72 74 79 5f 70 61 67 65 73 28 50 61 67  _dirty_pages(Pag
11780 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 50  er *pPager){.  P
11790 67 48 64 72 20 2a 70 2c 20 2a 70 4c 69 73 74 3b  gHdr *p, *pList;
117a0 0a 20 20 70 4c 69 73 74 20 3d 20 30 3b 0a 20 20  .  pList = 0;.  
117b0 66 6f 72 28 70 3d 70 50 61 67 65 72 2d 3e 70 41  for(p=pPager->pA
117c0 6c 6c 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78  ll; p; p=p->pNex
117d0 74 41 6c 6c 29 7b 0a 20 20 20 20 69 66 28 20 70  tAll){.    if( p
117e0 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20 20 20  ->dirty ){.     
117f0 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 70 4c 69   p->pDirty = pLi
11800 73 74 3b 0a 20 20 20 20 20 20 70 4c 69 73 74 20  st;.      pList 
11810 3d 20 70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  = p;.    }.  }. 
11820 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
11830 0a 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20  ../*.** Acquire 
11840 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 41 20  a page..**.** A 
11850 72 65 61 64 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  read lock on the
11860 20 64 69 73 6b 20 66 69 6c 65 20 69 73 20 6f 62   disk file is ob
11870 74 61 69 6e 65 64 20 77 68 65 6e 20 74 68 65 20  tained when the 
11880 66 69 72 73 74 20 70 61 67 65 20 69 73 20 61 63  first page is ac
11890 71 75 69 72 65 64 2e 20 0a 2a 2a 20 54 68 69 73  quired. .** This
118a0 20 72 65 61 64 20 6c 6f 63 6b 20 69 73 20 64 72   read lock is dr
118b0 6f 70 70 65 64 20 77 68 65 6e 20 74 68 65 20 6c  opped when the l
118c0 61 73 74 20 70 61 67 65 20 69 73 20 72 65 6c 65  ast page is rele
118d0 61 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 41 20 5f 67  ased..**.** A _g
118e0 65 74 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  et works for any
118f0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
11900 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
11910 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
11920 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
11930 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
11940 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
11950 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
11960 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
11970 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
11980 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
11990 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
119a0 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
119b0 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
119c0 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
119d0 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
119e0 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
119f0 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
11a00 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
11a10 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
11a20 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
11a30 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
11a40 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
11a50 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
11a60 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
11a70 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
11a80 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
11a90 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
11aa0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
11ab0 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
11ac0 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 29 2e 20  pager_lookup(). 
11ad0 20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69   Both this routi
11ae0 6e 65 20 61 6e 64 20 5f 6c 6f 6f 6b 75 70 28 29  ne and _lookup()
11af0 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66   attempt.** to f
11b00 69 6e 64 20 61 20 70 61 67 65 20 69 6e 20 74 68  ind a page in th
11b10 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68  e in-memory cach
11b20 65 20 66 69 72 73 74 2e 20 20 49 66 20 74 68 65  e first.  If the
11b30 20 70 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72   page is not alr
11b40 65 61 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72  eady.** in memor
11b50 79 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  y, this routine 
11b60 67 6f 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20  goes to disk to 
11b70 72 65 61 64 20 69 74 20 69 6e 20 77 68 65 72 65  read it in where
11b80 61 73 20 5f 6c 6f 6f 6b 75 70 28 29 0a 2a 2a 20  as _lookup().** 
11b90 6a 75 73 74 20 72 65 74 75 72 6e 73 20 30 2e 20  just returns 0. 
11ba0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63   This routine ac
11bb0 71 75 69 72 65 73 20 61 20 72 65 61 64 2d 6c 6f  quires a read-lo
11bc0 63 6b 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  ck the first tim
11bd0 65 20 69 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67  e it.** has to g
11be0 6f 20 74 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63  o to disk, and c
11bf0 6f 75 6c 64 20 61 6c 73 6f 20 70 6c 61 79 62 61  ould also playba
11c00 63 6b 20 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61  ck an old journa
11c10 6c 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e 0a  l if necessary..
11c20 2a 2a 20 53 69 6e 63 65 20 5f 6c 6f 6f 6b 75 70  ** Since _lookup
11c30 28 29 20 6e 65 76 65 72 20 67 6f 65 73 20 74 6f  () never goes to
11c40 20 64 69 73 6b 2c 20 69 74 20 6e 65 76 65 72 20   disk, it never 
11c50 68 61 73 20 74 6f 20 64 65 61 6c 20 77 69 74 68  has to deal with
11c60 20 6c 6f 63 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75   locks.** or jou
11c70 72 6e 61 6c 20 66 69 6c 65 73 2e 0a 2a 2f 0a 69  rnal files..*/.i
11c80 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
11c90 67 65 74 28 50 61 67 65 72 20 2a 70 50 61 67 65  get(Pager *pPage
11ca0 72 2c 20 50 67 6e 6f 20 70 67 6e 6f 2c 20 76 6f  r, Pgno pgno, vo
11cb0 69 64 20 2a 2a 70 70 50 61 67 65 29 7b 0a 20 20  id **ppPage){.  
11cc0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
11cd0 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  t rc;..  /* The 
11ce0 6d 61 78 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d  maximum page num
11cf0 62 65 72 20 69 73 20 32 5e 33 31 2e 20 52 65 74  ber is 2^31. Ret
11d00 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f 52 52 55  urn SQLITE_CORRU
11d10 50 54 20 69 66 20 61 20 70 61 67 65 0a 20 20 2a  PT if a page.  *
11d20 2a 20 6e 75 6d 62 65 72 20 67 72 65 61 74 65 72  * number greater
11d30 20 74 68 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a   than this, or z
11d40 65 72 6f 2c 20 69 73 20 72 65 71 75 65 73 74 65  ero, is requeste
11d50 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 67  d..  */.  if( pg
11d60 6e 6f 3e 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e  no>PAGER_MAX_PGN
11d70 4f 20 7c 7c 20 70 67 6e 6f 3d 3d 30 20 29 7b 0a  O || pgno==0 ){.
11d80 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
11d90 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 7d 0a 0a  E_CORRUPT;.  }..
11da0 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20 77    /* Make sure w
11db0 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20 61  e have not hit a
11dc0 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72 6f  ny critical erro
11dd0 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73 65  rs..  */ .  asse
11de0 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b  rt( pPager!=0 );
11df0 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b 0a  .  *ppPage = 0;.
11e00 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
11e10 72 4d 61 73 6b 20 26 20 7e 28 50 41 47 45 52 5f  rMask & ~(PAGER_
11e20 45 52 52 5f 46 55 4c 4c 29 20 29 7b 0a 20 20 20  ERR_FULL) ){.   
11e30 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72   return pager_er
11e40 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20  rcode(pPager);. 
11e50 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73   }..  /* If this
11e60 20 69 73 20 74 68 65 20 66 69 72 73 74 20 70 61   is the first pa
11e70 67 65 20 61 63 63 65 73 73 65 64 2c 20 74 68 65  ge accessed, the
11e80 6e 20 67 65 74 20 61 20 53 48 41 52 45 44 20 6c  n get a SHARED l
11e90 6f 63 6b 0a 20 20 2a 2a 20 6f 6e 20 74 68 65 20  ock.  ** on the 
11ea0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20  database file.. 
11eb0 20 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72   */.  if( pPager
11ec0 2d 3e 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45  ->nRef==0 && !ME
11ed0 4d 44 42 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  MDB ){.    rc = 
11ee0 70 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f  pager_wait_on_lo
11ef0 63 6b 28 70 50 61 67 65 72 2c 20 53 48 41 52 45  ck(pPager, SHARE
11f00 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 69 66 28  D_LOCK);.    if(
11f10 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
11f20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 72  {.      return r
11f30 63 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  c;.    }..    /*
11f40 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66 69   If a journal fi
11f50 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20 74  le exists, and t
11f60 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45 52  here is no RESER
11f70 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a  VED lock on the.
11f80 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20      ** database 
11f90 66 69 6c 65 2c 20 74 68 65 6e 20 69 74 20 65 69  file, then it ei
11fa0 74 68 65 72 20 6e 65 65 64 73 20 74 6f 20 62 65  ther needs to be
11fb0 20 70 6c 61 79 65 64 20 62 61 63 6b 20 6f 72 20   played back or 
11fc0 64 65 6c 65 74 65 64 2e 0a 20 20 20 20 2a 2f 0a  deleted..    */.
11fd0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
11fe0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 0a 20  useJournal && . 
11ff0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
12000 46 69 6c 65 45 78 69 73 74 73 28 70 50 61 67 65  FileExists(pPage
12010 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 20 26 26 0a  r->zJournal) &&.
12020 20 20 20 20 20 20 20 20 21 73 71 6c 69 74 65 33          !sqlite3
12030 4f 73 43 68 65 63 6b 52 65 73 65 72 76 65 64 4c  OsCheckReservedL
12040 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 29  ock(&pPager->fd)
12050 20 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20   .    ){.       
12060 69 6e 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 20  int rc;..       
12070 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
12080 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
12090 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
120a0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
120b0 69 73 0a 20 20 20 20 20 20 20 2a 2a 20 69 6d 70  is.       ** imp
120c0 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52 45  ortant that a RE
120d0 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e  SERVED lock is n
120e0 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20 74  ot obtained on t
120f0 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20 20  he way to the.  
12100 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56       ** EXCLUSIV
12110 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20 77 65  E lock. If it we
12120 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72 6f 63  re, another proc
12130 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e 20 74  ess might open t
12140 68 65 0a 20 20 20 20 20 20 20 2a 2a 20 64 61 74  he.       ** dat
12150 61 62 61 73 65 20 66 69 6c 65 2c 20 64 65 74 65  abase file, dete
12160 63 74 20 74 68 65 20 52 45 53 45 52 56 45 44 20  ct the RESERVED 
12170 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e 63 6c 75  lock, and conclu
12180 64 65 20 74 68 61 74 20 74 68 65 0a 20 20 20 20  de that the.    
12190 20 20 20 2a 2a 20 64 61 74 61 62 61 73 65 20 69     ** database i
121a0 73 20 73 61 66 65 20 74 6f 20 72 65 61 64 20 77  s safe to read w
121b0 68 69 6c 65 20 74 68 69 73 20 70 72 6f 63 65 73  hile this proces
121c0 73 20 69 73 20 73 74 69 6c 6c 20 72 6f 6c 6c 69  s is still rolli
121d0 6e 67 20 69 74 20 0a 20 20 20 20 20 20 20 2a 2a  ng it .       **
121e0 20 62 61 63 6b 2e 0a 20 20 20 20 20 20 20 2a 2a   back..       **
121f0 20 0a 20 20 20 20 20 20 20 2a 2a 20 42 65 63 61   .       ** Beca
12200 75 73 65 20 74 68 65 20 69 6e 74 65 72 6d 65 64  use the intermed
12210 69 61 74 65 20 52 45 53 45 52 56 45 44 20 6c 6f  iate RESERVED lo
12220 63 6b 20 69 73 20 6e 6f 74 20 72 65 71 75 65 73  ck is not reques
12230 74 65 64 2c 20 74 68 65 0a 20 20 20 20 20 20 20  ted, the.       
12240 2a 2a 20 73 65 63 6f 6e 64 20 70 72 6f 63 65 73  ** second proces
12250 73 20 77 69 6c 6c 20 67 65 74 20 74 6f 20 74 68  s will get to th
12260 69 73 20 70 6f 69 6e 74 20 69 6e 20 74 68 65 20  is point in the 
12270 63 6f 64 65 20 61 6e 64 20 66 61 69 6c 20 74 6f  code and fail to
12280 0a 20 20 20 20 20 20 20 2a 2a 20 6f 62 74 61 69  .       ** obtai
12290 6e 20 69 74 27 73 20 6f 77 6e 20 45 58 43 4c 55  n it's own EXCLU
122a0 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  SIVE lock on the
122b0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
122c0 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
122d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c   rc = sqlite3OsL
122e0 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64 2c  ock(&pPager->fd,
122f0 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29   EXCLUSIVE_LOCK)
12300 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63 21  ;.       if( rc!
12310 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12320 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 73         sqlite3Os
12330 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e  Unlock(&pPager->
12340 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20  fd, NO_LOCK);.  
12350 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73         pPager->s
12360 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c  tate = PAGER_UNL
12370 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72 65  OCK;.         re
12380 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
12390 7d 0a 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  }.       pPager-
123a0 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 45  >state = PAGER_E
123b0 58 43 4c 55 53 49 56 45 3b 0a 0a 20 20 20 20 20  XCLUSIVE;..     
123c0 20 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f    /* Open the jo
123d0 75 72 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e  urnal for readin
123e0 67 20 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20  g only.  Return 
123f0 53 51 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20  SQLITE_BUSY if. 
12400 20 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20        ** we are 
12410 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74  unable to open t
12420 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e  he journal file.
12430 20 0a 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20   .       **.    
12440 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61     ** The journa
12450 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20  l file does not 
12460 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b 65  need to be locke
12470 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a 20  d itself.  The. 
12480 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
12490 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72 20 6f   file is never o
124a0 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65 20 6d  pen unless the m
124b0 61 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c  ain database fil
124c0 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20 20 2a  e holds.       *
124d0 2a 20 61 20 77 72 69 74 65 20 6c 6f 63 6b 2c 20  * a write lock, 
124e0 73 6f 20 74 68 65 72 65 20 69 73 20 6e 65 76 65  so there is neve
124f0 72 20 61 6e 79 20 63 68 61 6e 63 65 20 6f 66 20  r any chance of 
12500 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20 20 20 20  two or more.    
12510 20 20 20 2a 2a 20 70 72 6f 63 65 73 73 65 73 20     ** processes 
12520 6f 70 65 6e 69 6e 67 20 74 68 65 20 6a 6f 75 72  opening the jour
12530 6e 61 6c 20 61 74 20 74 68 65 20 73 61 6d 65 20  nal at the same 
12540 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 2a 2f 0a  time..       */.
12550 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
12560 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f 6e 6c  te3OsOpenReadOnl
12570 79 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  y(pPager->zJourn
12580 61 6c 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  al, &pPager->jfd
12590 29 3b 0a 20 20 20 20 20 20 20 69 66 28 20 72 63  );.       if( rc
125a0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
125b0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f          sqlite3O
125c0 73 55 6e 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d  sUnlock(&pPager-
125d0 3e 66 64 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20  >fd, NO_LOCK);. 
125e0 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
125f0 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f 55 4e  state = PAGER_UN
12600 4c 4f 43 4b 3b 0a 20 20 20 20 20 20 20 20 20 72  LOCK;.         r
12610 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 42 55 53  eturn SQLITE_BUS
12620 59 3b 0a 20 20 20 20 20 20 20 7d 0a 20 20 20 20  Y;.       }.    
12630 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
12640 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20  alOpen = 1;.    
12650 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
12660 61 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20  alStarted = 0;. 
12670 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
12680 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
12690 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 74       pPager->set
126a0 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20  Master = 0;.    
126b0 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e     pPager->journ
126c0 61 6c 48 64 72 20 3d 20 30 3b 0a 0a 20 20 20 20  alHdr = 0;..    
126d0 20 20 20 2f 2a 20 50 6c 61 79 62 61 63 6b 20 61     /* Playback a
126e0 6e 64 20 64 65 6c 65 74 65 20 74 68 65 20 6a 6f  nd delete the jo
126f0 75 72 6e 61 6c 2e 20 20 44 72 6f 70 20 74 68 65  urnal.  Drop the
12700 20 64 61 74 61 62 61 73 65 20 77 72 69 74 65 0a   database write.
12710 20 20 20 20 20 20 20 2a 2a 20 6c 6f 63 6b 20 61         ** lock a
12720 6e 64 20 72 65 61 63 71 75 69 72 65 20 74 68 65  nd reacquire the
12730 20 72 65 61 64 20 6c 6f 63 6b 2e 0a 20 20 20 20   read lock..    
12740 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 72 63 20     */.       rc 
12750 3d 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b  = pager_playback
12760 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20  (pPager);.      
12770 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
12780 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 72  OK ){.         r
12790 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
127a0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67   }.    }.    pPg
127b0 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 0;.  }else{. 
127c0 20 20 20 2f 2a 20 53 65 61 72 63 68 20 66 6f 72     /* Search for
127d0 20 70 61 67 65 20 69 6e 20 63 61 63 68 65 20 2a   page in cache *
127e0 2f 0a 20 20 20 20 70 50 67 20 3d 20 70 61 67 65  /.    pPg = page
127f0 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c  r_lookup(pPager,
12800 20 70 67 6e 6f 29 3b 0a 20 20 20 20 69 66 28 20   pgno);.    if( 
12810 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72 2d  MEMDB && pPager-
12820 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e  >state==PAGER_UN
12830 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20 70 50  LOCK ){.      pP
12840 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
12850 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
12860 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  }.  }.  if( pPg=
12870 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68 65  =0 ){.    /* The
12880 20 72 65 71 75 65 73 74 65 64 20 70 61 67 65 20   requested page 
12890 69 73 20 6e 6f 74 20 69 6e 20 74 68 65 20 70 61  is not in the pa
128a0 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20 20 20  ge cache. */.   
128b0 20 69 6e 74 20 68 3b 0a 20 20 20 20 70 50 61 67   int h;.    pPag
128c0 65 72 2d 3e 6e 4d 69 73 73 2b 2b 3b 0a 20 20 20  er->nMiss++;.   
128d0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 50 61   if( pPager->nPa
128e0 67 65 3c 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  ge<pPager->mxPag
128f0 65 20 7c 7c 20 70 50 61 67 65 72 2d 3e 70 46 69  e || pPager->pFi
12900 72 73 74 3d 3d 30 20 7c 7c 20 4d 45 4d 44 42 20  rst==0 || MEMDB 
12910 29 7b 0a 20 20 20 20 20 20 2f 2a 20 43 72 65 61  ){.      /* Crea
12920 74 65 20 61 20 6e 65 77 20 70 61 67 65 20 2a 2f  te a new page */
12930 0a 20 20 20 20 20 20 70 50 67 20 3d 20 73 71 6c  .      pPg = sql
12940 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
12950 7a 65 6f 66 28 2a 70 50 67 29 20 2b 20 70 50 61  zeof(*pPg) + pPa
12960 67 65 72 2d 3e 70 73 41 6c 69 67 6e 65 64 0a 20  ger->psAligned. 
12970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20 73               + s
12990 69 7a 65 6f 66 28 75 33 32 29 20 2b 20 70 50 61  izeof(u32) + pPa
129a0 67 65 72 2d 3e 6e 45 78 74 72 61 0a 20 20 20 20  ger->nExtra.    
129b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129c0 20 20 20 20 20 20 20 20 20 20 2b 20 4d 45 4d 44            + MEMD
129d0 42 2a 73 69 7a 65 6f 66 28 50 67 48 69 73 74 6f  B*sizeof(PgHisto
129e0 72 79 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ry) );.      if(
129f0 20 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20   pPg==0 ){.     
12a00 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20 29 7b     if( !MEMDB ){
12a10 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
12a20 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
12a30 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ger);.        }.
12a40 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
12a50 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45 52  errMask |= PAGER
12a60 5f 45 52 52 5f 4d 45 4d 3b 0a 20 20 20 20 20 20  _ERR_MEM;.      
12a70 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
12a80 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 7d 0a 20  NOMEM;.      }. 
12a90 20 20 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c       memset(pPg,
12aa0 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29   0, sizeof(*pPg)
12ab0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d  );.      if( MEM
12ac0 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 65  DB ){.        me
12ad0 6d 73 65 74 28 50 47 48 44 52 5f 54 4f 5f 48 49  mset(PGHDR_TO_HI
12ae0 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2c  ST(pPg, pPager),
12af0 20 30 2c 20 73 69 7a 65 6f 66 28 50 67 48 69 73   0, sizeof(PgHis
12b00 74 6f 72 79 29 29 3b 0a 20 20 20 20 20 20 7d 0a  tory));.      }.
12b10 20 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65        pPg->pPage
12b20 72 20 3d 20 70 50 61 67 65 72 3b 0a 20 20 20 20  r = pPager;.    
12b30 20 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 20    pPg->pNextAll 
12b40 3d 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 0a  = pPager->pAll;.
12b50 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 41        pPager->pA
12b60 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20 20 20  ll = pPg;.      
12b70 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
12b80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12b90 20 20 2f 2a 20 46 69 6e 64 20 61 20 70 61 67 65    /* Find a page
12ba0 20 74 6f 20 72 65 63 79 63 6c 65 2e 20 20 54 72   to recycle.  Tr
12bb0 79 20 74 6f 20 6c 6f 63 61 74 65 20 61 20 70 61  y to locate a pa
12bc0 67 65 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74  ge that does not
12bd0 0a 20 20 20 20 20 20 2a 2a 20 72 65 71 75 69 72  .      ** requir
12be0 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66 73  e us to do an fs
12bf0 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f 75  ync() on the jou
12c00 72 6e 61 6c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  rnal..      */. 
12c10 20 20 20 20 20 70 50 67 20 3d 20 70 50 61 67 65       pPg = pPage
12c20 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3b  r->pFirstSynced;
12c30 0a 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65  ..      /* If we
12c40 20 63 6f 75 6c 64 20 6e 6f 74 20 66 69 6e 64 20   could not find 
12c50 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65 73  a page that does
12c60 20 6e 6f 74 20 72 65 71 75 69 72 65 20 61 6e 20   not require an 
12c70 66 73 79 6e 63 28 29 0a 20 20 20 20 20 20 2a 2a  fsync().      **
12c80 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   on the journal 
12c90 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63 20  file then fsync 
12ca0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
12cb0 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20 20  .  This is a.   
12cc0 20 20 20 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20     ** very slow 
12cd0 6f 70 65 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65  operation, so we
12ce0 20 77 6f 72 6b 20 68 61 72 64 20 74 6f 20 61 76   work hard to av
12cf0 6f 69 64 20 69 74 2e 20 20 42 75 74 20 73 6f 6d  oid it.  But som
12d00 65 74 69 6d 65 73 0a 20 20 20 20 20 20 2a 2a 20  etimes.      ** 
12d10 69 74 20 63 61 6e 27 74 20 62 65 20 68 65 6c 70  it can't be help
12d20 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
12d30 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
12d40 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
12d50 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
12d60 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 69  ager);.        i
12d70 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20  f( rc!=0 ){.    
12d80 20 20 20 20 20 20 73 71 6c 69 74 65 33 70 61 67        sqlite3pag
12d90 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 70 50 61 67  er_rollback(pPag
12da0 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  er);.          r
12db0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
12dc0 52 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  RR;.        }.  
12dd0 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72        if( pPager
12de0 2d 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20  ->fullSync ){.  
12df0 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 69 6e          /* If in
12e00 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
12e10 20 77 72 69 74 65 20 61 20 6e 65 77 20 6a 6f 75   write a new jou
12e20 72 6e 61 6c 20 68 65 61 64 65 72 20 69 6e 74 6f  rnal header into
12e30 20 74 68 65 0a 09 20 20 2a 2a 20 6a 6f 75 72 6e   the..  ** journ
12e40 61 6c 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73  al file. This is
12e50 20 64 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65   done to avoid e
12e60 76 65 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20  ver modifying a 
12e70 6a 6f 75 72 6e 61 6c 0a 09 20 20 2a 2a 20 68 65  journal..  ** he
12e80 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e 76  ader that is inv
12e90 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f 6c  olved in the rol
12ea0 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20 74  lback of pages t
12eb0 68 61 74 20 68 61 76 65 0a 09 20 20 2a 2a 20 61  hat have..  ** a
12ec0 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69 74  lready been writ
12ed0 74 65 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ten to the datab
12ee0 61 73 65 20 28 69 6e 20 63 61 73 65 20 74 68 65  ase (in case the
12ef0 20 68 65 61 64 65 72 20 69 73 0a 09 20 20 2a 2a   header is..  **
12f00 20 74 72 61 73 68 65 64 20 77 68 65 6e 20 74 68   trashed when th
12f10 65 20 6e 52 65 63 20 66 69 65 6c 64 20 69 73 20  e nRec field is 
12f20 75 70 64 61 74 65 64 29 2e 0a 20 20 20 20 20 20  updated)..      
12f30 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20      */.         
12f40 20 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20   pPager->nRec = 
12f50 30 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  0;.          ass
12f60 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
12f70 72 6e 61 6c 4f 66 66 20 3e 20 30 20 29 3b 0a 20  rnalOff > 0 );. 
12f80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72           rc = wr
12f90 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50  iteJournalHdr(pP
12fa0 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20  ager);.         
12fb0 20 69 66 28 20 72 63 21 3d 30 20 29 7b 0a 20 20   if( rc!=0 ){.  
12fc0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
12fd0 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
12fe0 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
12ff0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
13000 54 45 5f 49 4f 45 52 52 3b 0a 20 20 20 20 20 20  TE_IOERR;.      
13010 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
13020 20 20 20 20 20 20 20 20 70 50 67 20 3d 20 70 50          pPg = pP
13030 61 67 65 72 2d 3e 70 46 69 72 73 74 3b 0a 20 20  ager->pFirst;.  
13040 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73 65      }.      asse
13050 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3d 3d 30  rt( pPg->nRef==0
13060 20 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 72   );..      /* Wr
13070 69 74 65 20 74 68 65 20 70 61 67 65 20 74 6f 20  ite the page to 
13080 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
13090 65 20 69 66 20 69 74 20 69 73 20 64 69 72 74 79  e if it is dirty
130a0 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
130b0 20 69 66 28 20 70 50 67 2d 3e 64 69 72 74 79 20   if( pPg->dirty 
130c0 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  ){.        asser
130d0 74 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63  t( pPg->needSync
130e0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
130f0 50 67 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a  Pg->pDirty = 0;.
13100 20 20 20 20 20 20 20 20 72 63 20 3d 20 70 61 67          rc = pag
13110 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c 69 73  er_write_pagelis
13120 74 28 20 70 50 67 20 29 3b 0a 20 20 20 20 20 20  t( pPg );.      
13130 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
13140 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13150 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f   sqlite3pager_ro
13160 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
13170 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
13180 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 3b 0a 20   SQLITE_IOERR;. 
13190 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
131a0 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
131b0 50 67 2d 3e 64 69 72 74 79 3d 3d 30 20 29 3b 0a  Pg->dirty==0 );.
131c0 0a 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 65  .      /* If the
131d0 20 70 61 67 65 20 77 65 20 61 72 65 20 72 65 63   page we are rec
131e0 79 63 6c 69 6e 67 20 69 73 20 6d 61 72 6b 65 64  ycling is marked
131f0 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
13200 63 6b 2c 20 74 68 65 6e 0a 20 20 20 20 20 20 2a  ck, then.      *
13210 2a 20 73 65 74 20 74 68 65 20 67 6c 6f 62 61 6c  * set the global
13220 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20   alwaysRollback 
13230 66 6c 61 67 2c 20 74 68 75 73 20 64 69 73 61 62  flag, thus disab
13240 6c 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 2a  ling the.      *
13250 2a 20 73 71 6c 69 74 65 5f 64 6f 6e 74 5f 72 6f  * sqlite_dont_ro
13260 6c 6c 62 61 63 6b 28 29 20 6f 70 74 69 6d 69 7a  llback() optimiz
13270 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 72 65  ation for the re
13280 73 74 20 6f 66 20 74 68 69 73 20 74 72 61 6e 73  st of this trans
13290 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2a  action..      **
132a0 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   It is necessary
132b0 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61   to do this beca
132c0 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72  use the page mar
132d0 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
132e0 63 6b 0a 20 20 20 20 20 20 2a 2a 20 6d 69 67 68  ck.      ** migh
132f0 74 20 62 65 20 72 65 6c 6f 61 64 65 64 20 61 74  t be reloaded at
13300 20 61 20 6c 61 74 65 72 20 74 69 6d 65 20 62 75   a later time bu
13310 74 20 61 74 20 74 68 61 74 20 70 6f 69 6e 74 20  t at that point 
13320 77 65 20 77 6f 6e 27 74 20 72 65 6d 65 6d 62 65  we won't remembe
13330 72 0a 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20  r.      ** that 
13340 69 73 20 77 61 73 20 6d 61 72 6b 65 64 20 61 6c  is was marked al
13350 77 61 79 73 52 6f 6c 6c 62 61 63 6b 2e 20 20 54  waysRollback.  T
13360 68 69 73 20 6d 65 61 6e 73 20 74 68 61 74 20 61  his means that a
13370 6c 6c 20 70 61 67 65 73 20 6d 75 73 74 0a 20 20  ll pages must.  
13380 20 20 20 20 2a 2a 20 62 65 20 6d 61 72 6b 65 64      ** be marked
13390 20 61 73 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61   as alwaysRollba
133a0 63 6b 20 66 72 6f 6d 20 68 65 72 65 20 6f 6e 20  ck from here on 
133b0 6f 75 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  out..      */.  
133c0 20 20 20 20 69 66 28 20 70 50 67 2d 3e 61 6c 77      if( pPg->alw
133d0 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20  aysRollback ){. 
133e0 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
133f0 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
13400 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  1;.      }..    
13410 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20    /* Unlink the 
13420 6f 6c 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68  old page from th
13430 65 20 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20  e free list and 
13440 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20  the hash table. 
13450 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 75 6e       */.      un
13460 6c 69 6e 6b 50 61 67 65 28 70 50 67 29 3b 0a 20  linkPage(pPg);. 
13470 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 4f 76       pPager->nOv
13480 66 6c 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  fl++;.    }.    
13490 70 50 67 2d 3e 70 67 6e 6f 20 3d 20 70 67 6e 6f  pPg->pgno = pgno
134a0 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72  ;.    if( pPager
134b0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 26 26 20  ->aInJournal && 
134c0 28 69 6e 74 29 70 67 6e 6f 3c 3d 70 50 61 67 65  (int)pgno<=pPage
134d0 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b  r->origDbSize ){
134e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 68  .      sqlite3Ch
134f0 65 63 6b 4d 65 6d 6f 72 79 28 70 50 61 67 65 72  eckMemory(pPager
13500 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 2c 20 70 67  ->aInJournal, pg
13510 6e 6f 2f 38 29 3b 0a 20 20 20 20 20 20 61 73 73  no/8);.      ass
13520 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
13530 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20  rnalOpen );.    
13540 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
13550 20 3d 20 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a   = (pPager->aInJ
13560 6f 75 72 6e 61 6c 5b 70 67 6e 6f 2f 38 5d 20 26  ournal[pgno/8] &
13570 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29 29 21   (1<<(pgno&7)))!
13580 3d 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e  =0;.      pPg->n
13590 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20  eedSync = 0;.   
135a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50   }else{.      pP
135b0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30  g->inJournal = 0
135c0 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65  ;.      pPg->nee
135d0 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 20 20 7d  dSync = 0;.    }
135e0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
135f0 3e 61 49 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  >aInStmt && (int
13600 29 70 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73  )pgno<=pPager->s
13610 74 6d 74 53 69 7a 65 0a 20 20 20 20 20 20 20 20  tmtSize.        
13620 20 20 20 20 20 26 26 20 28 70 50 61 67 65 72 2d       && (pPager-
13630 3e 61 49 6e 53 74 6d 74 5b 70 67 6e 6f 2f 38 5d  >aInStmt[pgno/8]
13640 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26 37 29 29   & (1<<(pgno&7))
13650 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 61  )!=0 ){.      pa
13660 67 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c  ge_add_to_stmt_l
13670 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 7d 65  ist(pPg);.    }e
13680 6c 73 65 7b 0a 20 20 20 20 20 20 70 61 67 65 5f  lse{.      page_
13690 72 65 6d 6f 76 65 5f 66 72 6f 6d 5f 73 74 6d 74  remove_from_stmt
136a0 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20  _list(pPg);.    
136b0 7d 0a 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79  }.    pPg->dirty
136c0 20 3d 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 0;.    pPg->n
136d0 52 65 66 20 3d 20 31 3b 0a 20 20 20 20 52 45 46  Ref = 1;.    REF
136e0 49 4e 46 4f 28 70 50 67 29 3b 0a 20 20 20 20 70  INFO(pPg);.    p
136f0 50 61 67 65 72 2d 3e 6e 52 65 66 2b 2b 3b 0a 20  Pager->nRef++;. 
13700 20 20 20 68 20 3d 20 70 61 67 65 72 5f 68 61 73     h = pager_has
13710 68 28 70 67 6e 6f 29 3b 0a 20 20 20 20 70 50 67  h(pgno);.    pPg
13720 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 70 50  ->pNextHash = pP
13730 61 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 3b 0a  ager->aHash[h];.
13740 20 20 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73      pPager->aHas
13750 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 20 20  h[h] = pPg;.    
13760 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  if( pPg->pNextHa
13770 73 68 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  sh ){.      asse
13780 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  rt( pPg->pNextHa
13790 73 68 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30  sh->pPrevHash==0
137a0 20 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   );.      pPg->p
137b0 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76 48  NextHash->pPrevH
137c0 61 73 68 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  ash = pPg;.    }
137d0 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
137e0 3e 6e 45 78 74 72 61 3e 30 20 29 7b 0a 20 20 20  >nExtra>0 ){.   
137f0 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f     memset(PGHDR_
13800 54 4f 5f 45 58 54 52 41 28 70 50 67 2c 20 70 50  TO_EXTRA(pPg, pP
13810 61 67 65 72 29 2c 20 30 2c 20 70 50 61 67 65 72  ager), 0, pPager
13820 2d 3e 6e 45 78 74 72 61 29 3b 0a 20 20 20 20 7d  ->nExtra);.    }
13830 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67 65  .    sqlite3page
13840 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61 67  r_pagecount(pPag
13850 65 72 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  er);.    if( pPa
13860 67 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20  ger->errMask!=0 
13870 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
13880 70 61 67 65 72 5f 75 6e 72 65 66 28 50 47 48 44  pager_unref(PGHD
13890 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 3b  R_TO_DATA(pPg));
138a0 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
138b0 72 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72  r_errcode(pPager
138c0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
138d0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  rc;.    }.    if
138e0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
138f0 3c 28 69 6e 74 29 70 67 6e 6f 20 29 7b 0a 20 20  <(int)pgno ){.  
13900 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
13910 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
13920 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13930 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ze);.    }else{.
13940 20 20 20 20 20 20 69 6e 74 20 72 63 3b 0a 20 20        int rc;.  
13950 20 20 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44      assert( MEMD
13960 42 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71  B==0 );.      sq
13970 6c 69 74 65 33 4f 73 53 65 65 6b 28 26 70 50 61  lite3OsSeek(&pPa
13980 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e 6f 2d 31  ger->fd, (pgno-1
13990 29 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70  )*(i64)pPager->p
139a0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
139b0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65  rc = sqlite3OsRe
139c0 61 64 28 26 70 50 61 67 65 72 2d 3e 66 64 2c 20  ad(&pPager->fd, 
139d0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
139e0 67 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  g), pPager->page
139f0 53 69 7a 65 29 3b 0a 20 20 20 20 20 20 54 52 41  Size);.      TRA
13a00 43 45 33 28 22 46 45 54 43 48 20 25 64 20 70 61  CE3("FETCH %d pa
13a10 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
13a20 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
13a30 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 43 4f 44  pgno);.      COD
13a40 45 43 28 70 50 61 67 65 72 2c 20 50 47 48 44 52  EC(pPager, PGHDR
13a50 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70  _TO_DATA(pPg), p
13a60 50 67 2d 3e 70 67 6e 6f 2c 20 33 29 3b 0a 20 20  Pg->pgno, 3);.  
13a70 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
13a80 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13a90 20 69 36 34 20 66 69 6c 65 53 69 7a 65 3b 0a 20   i64 fileSize;. 
13aa0 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
13ab0 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 26 70 50  e3OsFileSize(&pP
13ac0 61 67 65 72 2d 3e 66 64 2c 26 66 69 6c 65 53 69  ager->fd,&fileSi
13ad0 7a 65 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20  ze)!=SQLITE_OK. 
13ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c                ||
13af0 20 66 69 6c 65 53 69 7a 65 3e 3d 70 67 6e 6f 2a   fileSize>=pgno*
13b00 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
13b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
13b20 6c 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66  lite3pager_unref
13b30 28 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70  (PGHDR_TO_DATA(p
13b40 50 67 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Pg));.          
13b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
13b60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
13b70 20 20 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52      memset(PGHDR
13b80 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30  _TO_DATA(pPg), 0
13b90 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
13ba0 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
13bb0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13bc0 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 61      pPager->nRea
13bd0 64 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  d++;.      }.   
13be0 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
13bf0 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
13c00 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
13c10 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
13c20 20 20 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 2b     pPager->nHit+
13c30 2b 3b 0a 20 20 20 20 70 61 67 65 5f 72 65 66 28  +;.    page_ref(
13c40 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70 70 50  pPg);.  }.  *ppP
13c50 61 67 65 20 3d 20 50 47 48 44 52 5f 54 4f 5f 44  age = PGHDR_TO_D
13c60 41 54 41 28 70 50 67 29 3b 0a 20 20 72 65 74 75  ATA(pPg);.  retu
13c70 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
13c80 0a 2f 2a 0a 2a 2a 20 41 63 71 75 69 72 65 20 61  ./*.** Acquire a
13c90 20 70 61 67 65 20 69 66 20 69 74 20 69 73 20 61   page if it is a
13ca0 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20 69 6e  lready in the in
13cb0 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 2e 20 20  -memory cache.  
13cc0 44 6f 0a 2a 2a 20 6e 6f 74 20 72 65 61 64 20 74  Do.** not read t
13cd0 68 65 20 70 61 67 65 20 66 72 6f 6d 20 64 69 73  he page from dis
13ce0 6b 2e 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69  k.  Return a poi
13cf0 6e 74 65 72 20 74 6f 20 74 68 65 20 70 61 67 65  nter to the page
13d00 2c 0a 2a 2a 20 6f 72 20 30 20 69 66 20 74 68 65  ,.** or 0 if the
13d10 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
13d20 63 61 63 68 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  cache..**.** See
13d30 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 70 61 67   also sqlite3pag
13d40 65 72 5f 67 65 74 28 29 2e 20 20 54 68 65 20 64  er_get().  The d
13d50 69 66 66 65 72 65 6e 63 65 20 62 65 74 77 65 65  ifference betwee
13d60 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a  n this routine.*
13d70 2a 20 61 6e 64 20 73 71 6c 69 74 65 33 70 61 67  * and sqlite3pag
13d80 65 72 5f 67 65 74 28 29 20 69 73 20 74 68 61 74  er_get() is that
13d90 20 5f 67 65 74 28 29 20 77 69 6c 6c 20 67 6f 20   _get() will go 
13da0 74 6f 20 74 68 65 20 64 69 73 6b 20 61 6e 64 20  to the disk and 
13db0 72 65 61 64 0a 2a 2a 20 69 6e 20 74 68 65 20 70  read.** in the p
13dc0 61 67 65 20 69 66 20 74 68 65 20 70 61 67 65 20  age if the page 
13dd0 69 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 69  is not already i
13de0 6e 20 63 61 63 68 65 2e 20 20 54 68 69 73 20 72  n cache.  This r
13df0 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72 6e  outine.** return
13e00 73 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 70 61  s NULL if the pa
13e10 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63  ge is not in cac
13e20 68 65 20 6f 72 20 69 66 20 61 20 64 69 73 6b 20  he or if a disk 
13e30 49 2f 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 68 61  I/O error .** ha
13e40 73 20 65 76 65 72 20 68 61 70 70 65 6e 65 64 2e  s ever happened.
13e50 0a 2a 2f 0a 76 6f 69 64 20 2a 73 71 6c 69 74 65  .*/.void *sqlite
13e60 33 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  3pager_lookup(Pa
13e70 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
13e80 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
13e90 20 2a 70 50 67 3b 0a 0a 20 20 61 73 73 65 72 74   *pPg;..  assert
13ea0 28 20 70 50 61 67 65 72 21 3d 30 20 29 3b 0a 20  ( pPager!=0 );. 
13eb0 20 61 73 73 65 72 74 28 20 70 67 6e 6f 21 3d 30   assert( pgno!=0
13ec0 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72   );.  if( pPager
13ed0 2d 3e 65 72 72 4d 61 73 6b 20 26 20 7e 28 50 41  ->errMask & ~(PA
13ee0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 29 20 29 7b  GER_ERR_FULL) ){
13ef0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
13f00 20 7d 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72   }.  pPg = pager
13f10 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
13f20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67  pgno);.  if( pPg
13f30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13f40 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
13f50 0a 20 20 72 65 74 75 72 6e 20 50 47 48 44 52 5f  .  return PGHDR_
13f60 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 7d 0a  TO_DATA(pPg);.}.
13f70 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 61  ./*.** Release a
13f80 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   page..**.** If 
13f90 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65  the number of re
13fa0 66 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20  ferences to the 
13fb0 70 61 67 65 20 64 72 6f 70 20 74 6f 20 7a 65 72  page drop to zer
13fc0 6f 2c 20 74 68 65 6e 20 74 68 65 0a 2a 2a 20 70  o, then the.** p
13fd0 61 67 65 20 69 73 20 61 64 64 65 64 20 74 6f 20  age is added to 
13fe0 74 68 65 20 4c 52 55 20 6c 69 73 74 2e 20 20 57  the LRU list.  W
13ff0 68 65 6e 20 61 6c 6c 20 72 65 66 65 72 65 6e 63  hen all referenc
14000 65 73 20 74 6f 20 61 6c 6c 20 70 61 67 65 73 0a  es to all pages.
14010 2a 2a 20 61 72 65 20 72 65 6c 65 61 73 65 64 2c  ** are released,
14020 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
14030 72 73 20 61 6e 64 20 74 68 65 20 6c 6f 63 6b 20  rs and the lock 
14040 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
14050 69 73 0a 2a 2a 20 72 65 6d 6f 76 65 64 2e 0a 2a  is.** removed..*
14060 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
14070 65 72 5f 75 6e 72 65 66 28 76 6f 69 64 20 2a 70  er_unref(void *p
14080 44 61 74 61 29 7b 0a 20 20 50 67 48 64 72 20 2a  Data){.  PgHdr *
14090 70 50 67 3b 0a 0a 20 20 2f 2a 20 44 65 63 72 65  pPg;..  /* Decre
140a0 6d 65 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e  ment the referen
140b0 63 65 20 63 6f 75 6e 74 20 66 6f 72 20 74 68 69  ce count for thi
140c0 73 20 70 61 67 65 0a 20 20 2a 2f 0a 20 20 70 50  s page.  */.  pP
140d0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
140e0 52 28 70 44 61 74 61 29 3b 0a 20 20 61 73 73 65  R(pData);.  asse
140f0 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30 20  rt( pPg->nRef>0 
14100 29 3b 0a 20 20 70 50 67 2d 3e 6e 52 65 66 2d 2d  );.  pPg->nRef--
14110 3b 0a 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29  ;.  REFINFO(pPg)
14120 3b 0a 0a 20 20 2f 2a 20 57 68 65 6e 20 74 68 65  ;..  /* When the
14130 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65 72   number of refer
14140 65 6e 63 65 73 20 74 6f 20 61 20 70 61 67 65 20  ences to a page 
14150 72 65 61 63 68 20 30 2c 20 63 61 6c 6c 20 74 68  reach 0, call th
14160 65 0a 20 20 2a 2a 20 64 65 73 74 72 75 63 74 6f  e.  ** destructo
14170 72 20 61 6e 64 20 61 64 64 20 74 68 65 20 70 61  r and add the pa
14180 67 65 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ge to the freeli
14190 73 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  st..  */.  if( p
141a0 50 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20  Pg->nRef==0 ){. 
141b0 20 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72     Pager *pPager
141c0 3b 0a 20 20 20 20 70 50 61 67 65 72 20 3d 20 70  ;.    pPager = p
141d0 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 20 20  Pg->pPager;.    
141e0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d  pPg->pNextFree =
141f0 20 30 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   0;.    pPg->pPr
14200 65 76 46 72 65 65 20 3d 20 70 50 61 67 65 72 2d  evFree = pPager-
14210 3e 70 4c 61 73 74 3b 0a 20 20 20 20 70 50 61 67  >pLast;.    pPag
14220 65 72 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b  er->pLast = pPg;
14230 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50  .    if( pPg->pP
14240 72 65 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20  revFree ){.     
14250 20 70 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d   pPg->pPrevFree-
14260 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67  >pNextFree = pPg
14270 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
14280 20 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73     pPager->pFirs
14290 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20  t = pPg;.    }. 
142a0 20 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64     if( pPg->need
142b0 53 79 6e 63 3d 3d 30 20 26 26 20 70 50 61 67 65  Sync==0 && pPage
142c0 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64 3d  r->pFirstSynced=
142d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67  =0 ){.      pPag
142e0 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65 64  er->pFirstSynced
142f0 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20   = pPg;.    }.  
14300 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 78 44    if( pPager->xD
14310 65 73 74 72 75 63 74 6f 72 20 29 7b 0a 20 20 20  estructor ){.   
14320 20 20 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74     pPager->xDest
14330 72 75 63 74 6f 72 28 70 44 61 74 61 2c 20 70 50  ructor(pData, pP
14340 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
14350 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
14360 20 57 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 20   When all pages 
14370 72 65 61 63 68 20 74 68 65 20 66 72 65 65 6c 69  reach the freeli
14380 73 74 2c 20 64 72 6f 70 20 74 68 65 20 72 65 61  st, drop the rea
14390 64 20 6c 6f 63 6b 20 66 72 6f 6d 0a 20 20 20 20  d lock from.    
143a0 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
143b0 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
143c0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 2d 2d 3b   pPager->nRef--;
143d0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
143e0 67 65 72 2d 3e 6e 52 65 66 3e 3d 30 20 29 3b 0a  ger->nRef>=0 );.
143f0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
14400 6e 52 65 66 3d 3d 30 20 26 26 20 21 4d 45 4d 44  nRef==0 && !MEMD
14410 42 20 29 7b 0a 20 20 20 20 20 20 70 61 67 65 72  B ){.      pager
14420 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b 0a  _reset(pPager);.
14430 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
14440 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
14450 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
14460 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
14470 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
14480 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
14490 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
144a0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
144b0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
144c0 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
144d0 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
144e0 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
144f0 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
14500 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
14510 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
14520 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
14530 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
14540 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
14550 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
14560 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
14570 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
14580 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
14590 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
145a0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
145b0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
145c0 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
145d0 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
145e0 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
145f0 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
14600 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
14610 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 70 61 67   );.  sqlite3pag
14620 65 72 5f 70 61 67 65 63 6f 75 6e 74 28 70 50 61  er_pagecount(pPa
14630 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  ger);.  pPager->
14640 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73 71 6c  aInJournal = sql
14650 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65  iteMalloc( pPage
14660 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20  r->dbSize/8 + 1 
14670 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
14680 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30 20 29  >aInJournal==0 )
14690 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54  {.    rc = SQLIT
146a0 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67 6f 74  E_NOMEM;.    got
146b0 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e  o failed_to_open
146c0 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a 20 20  _journal;.  }.  
146d0 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70  rc = sqlite3OsOp
146e0 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50 61 67  enExclusive(pPag
146f0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70  er->zJournal, &p
14700 50 61 67 65 72 2d 3e 6a 66 64 2c 70 50 61 67 65  Pager->jfd,pPage
14710 72 2d 3e 74 65 6d 70 46 69 6c 65 29 3b 0a 20 20  r->tempFile);.  
14720 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
14730 66 66 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  ff = 0;.  pPager
14740 2d 3e 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b  ->setMaster = 0;
14750 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  .  pPager->journ
14760 61 6c 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28  alHdr = 0;.  if(
14770 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14780 7b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  {.    goto faile
14790 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
147a0 6c 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  l;.  }.  sqlite3
147b0 4f 73 4f 70 65 6e 44 69 72 65 63 74 6f 72 79 28  OsOpenDirectory(
147c0 70 50 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f  pPager->zDirecto
147d0 72 79 2c 20 26 70 50 61 67 65 72 2d 3e 6a 66 64  ry, &pPager->jfd
147e0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75  );.  pPager->jou
147f0 72 6e 61 6c 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  rnalOpen = 1;.  
14800 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53  pPager->journalS
14810 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20 70 50  tarted = 0;.  pP
14820 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d  ager->needSync =
14830 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 6c   0;.  pPager->al
14840 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 30  waysRollback = 0
14850 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e 52 65 63  ;.  pPager->nRec
14860 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 50 61 67   = 0;.  if( pPag
14870 65 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29  er->errMask!=0 )
14880 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14890 5f 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29  _errcode(pPager)
148a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
148b0 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
148c0 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61 67  rigDbSize = pPag
148d0 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20 20 72  er->dbSize;..  r
148e0 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e 61 6c  c = writeJournal
148f0 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  Hdr(pPager);..  
14900 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
14910 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63 3d 3d  Autoopen && rc==
14920 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14930 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67   rc = sqlite3pag
14940 65 72 5f 73 74 6d 74 5f 62 65 67 69 6e 28 70 50  er_stmt_begin(pP
14950 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
14960 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
14970 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
14980 5f 75 6e 77 72 69 74 65 6c 6f 63 6b 28 70 50 61  _unwritelock(pPa
14990 67 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  ger);.    if( rc
149a0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
149b0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
149c0 5f 46 55 4c 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d  _FULL;.    }.  }
149d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 66  .  return rc;..f
149e0 61 69 6c 65 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f  ailed_to_open_jo
149f0 75 72 6e 61 6c 3a 0a 20 20 73 71 6c 69 74 65 46  urnal:.  sqliteF
14a00 72 65 65 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a  ree(pPager->aInJ
14a10 6f 75 72 6e 61 6c 29 3b 0a 20 20 70 50 61 67 65  ournal);.  pPage
14a20 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
14a30 30 3b 0a 20 20 73 71 6c 69 74 65 33 4f 73 55 6e  0;.  sqlite3OsUn
14a40 6c 6f 63 6b 28 26 70 50 61 67 65 72 2d 3e 66 64  lock(&pPager->fd
14a50 2c 20 4e 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 70 50  , NO_LOCK);.  pP
14a60 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
14a70 47 45 52 5f 55 4e 4c 4f 43 4b 3b 0a 20 20 72 65  GER_UNLOCK;.  re
14a80 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
14a90 2a 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74  * Acquire a writ
14aa0 65 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  e-lock on the da
14ab0 74 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63  tabase.  The loc
14ac0 6b 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65  k is removed whe
14ad0 6e 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20  n.** the any of 
14ae0 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61  the following ha
14af0 70 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20  ppen:.**.**   * 
14b00 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 63 6f   sqlite3pager_co
14b10 6d 6d 69 74 28 29 20 69 73 20 63 61 6c 6c 65 64  mmit() is called
14b20 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
14b30 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28  3pager_rollback(
14b40 29 20 69 73 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20  ) is called..** 
14b50 20 20 2a 20 20 73 71 6c 69 74 65 33 70 61 67 65    *  sqlite3page
14b60 72 5f 63 6c 6f 73 65 28 29 20 69 73 20 63 61 6c  r_close() is cal
14b70 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c  led..**   *  sql
14b80 69 74 65 33 70 61 67 65 72 5f 75 6e 72 65 66 28  ite3pager_unref(
14b90 29 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 6f  ) is called to o
14ba0 6e 20 65 76 65 72 79 20 6f 75 74 73 74 61 6e 64  n every outstand
14bb0 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ing page..**.** 
14bc0 54 68 65 20 66 69 72 73 74 20 70 61 72 61 6d 65  The first parame
14bd0 74 65 72 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ter to this rout
14be0 69 6e 65 20 69 73 20 61 20 70 6f 69 6e 74 65 72  ine is a pointer
14bf0 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20 70 61 67   to any open pag
14c00 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
14c10 62 61 73 65 20 66 69 6c 65 2e 20 20 4e 6f 74 68  base file.  Noth
14c20 69 6e 67 20 63 68 61 6e 67 65 73 20 61 62 6f 75  ing changes abou
14c30 74 20 74 68 65 20 70 61 67 65 20 2d 20 69 74 20  t the page - it 
14c40 69 73 20 75 73 65 64 20 6d 65 72 65 6c 79 20 74  is used merely t
14c50 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20 61 20 70  o.** acquire a p
14c60 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 50 61  ointer to the Pa
14c70 67 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e  ger structure an
14c80 64 20 61 73 20 70 72 6f 6f 66 20 74 68 61 74 20  d as proof that 
14c90 74 68 65 72 65 20 69 73 0a 2a 2a 20 61 6c 72 65  there is.** alre
14ca0 61 64 79 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  ady a read-lock 
14cb0 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  on the database.
14cc0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 6f 6e  .**.** The secon
14cd0 64 20 70 61 72 61 6d 65 74 65 72 20 69 6e 64 69  d parameter indi
14ce0 63 61 74 65 73 20 68 6f 77 20 6d 75 63 68 20 73  cates how much s
14cf0 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 74 6f  pace in bytes to
14d00 20 72 65 73 65 72 76 65 20 66 6f 72 20 61 0a 2a   reserve for a.*
14d10 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  * master journal
14d20 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74 20 74 68   file-name at th
14d30 65 20 73 74 61 72 74 20 6f 66 20 74 68 65 20 6a  e start of the j
14d40 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69 74 20 69  ournal when it i
14d50 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a 0a 2a 2a  s created..**.**
14d60 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20   A journal file 
14d70 69 73 20 6f 70 65 6e 65 64 20 69 66 20 74 68 69  is opened if thi
14d80 73 20 69 73 20 6e 6f 74 20 61 20 74 65 6d 70 6f  s is not a tempo
14d90 72 61 72 79 20 66 69 6c 65 2e 20 20 46 6f 72 20  rary file.  For 
14da0 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20 66 69 6c  temporary.** fil
14db0 65 73 2c 20 74 68 65 20 6f 70 65 6e 69 6e 67 20  es, the opening 
14dc0 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
14dd0 69 6c 65 20 69 73 20 64 65 66 65 72 72 65 64 20  ile is deferred 
14de0 75 6e 74 69 6c 20 74 68 65 72 65 20 69 73 20 61  until there is a
14df0 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e 65 65 64  n.** actual need
14e00 20 74 6f 20 77 72 69 74 65 20 74 6f 20 74 68 65   to write to the
14e10 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a 20   journal..**.** 
14e20 49 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  If the database 
14e30 69 73 20 61 6c 72 65 61 64 79 20 72 65 73 65 72  is already reser
14e40 76 65 64 20 66 6f 72 20 77 72 69 74 69 6e 67 2c  ved for writing,
14e50 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
14e60 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20   a no-op..**.** 
14e70 49 66 20 65 78 46 6c 61 67 20 69 73 20 74 72 75  If exFlag is tru
14e80 65 2c 20 67 6f 20 61 68 65 61 64 20 61 6e 64 20  e, go ahead and 
14e90 67 65 74 20 61 6e 20 45 58 43 4c 55 53 49 56 45  get an EXCLUSIVE
14ea0 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 66 69 6c   lock on the fil
14eb0 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74 65 6c 79  e.** immediately
14ec0 20 69 6e 73 74 65 61 64 20 6f 66 20 77 61 69 74   instead of wait
14ed0 69 6e 67 20 75 6e 74 69 6c 20 77 65 20 74 72 79  ing until we try
14ee0 20 74 6f 20 66 6c 75 73 68 20 74 68 65 20 63 61   to flush the ca
14ef0 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20 65 78 46  che.  The.** exF
14f00 6c 61 67 20 69 73 20 69 67 6e 6f 72 65 64 20 69  lag is ignored i
14f10 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  f a transaction 
14f20 69 73 20 61 6c 72 65 61 64 79 20 61 63 74 69 76  is already activ
14f30 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
14f40 33 70 61 67 65 72 5f 62 65 67 69 6e 28 76 6f 69  3pager_begin(voi
14f50 64 20 2a 70 44 61 74 61 2c 20 69 6e 74 20 65 78  d *pData, int ex
14f60 46 6c 61 67 29 7b 0a 20 20 50 67 48 64 72 20 2a  Flag){.  PgHdr *
14f70 70 50 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47  pPg = DATA_TO_PG
14f80 48 44 52 28 70 44 61 74 61 29 3b 0a 20 20 50 61  HDR(pData);.  Pa
14f90 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
14fa0 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
14fb0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
14fc0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
14fd0 6e 52 65 66 3e 30 20 29 3b 0a 20 20 61 73 73 65  nRef>0 );.  asse
14fe0 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
14ff0 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20  e!=PAGER_UNLOCK 
15000 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
15010 3e 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 48  >state==PAGER_SH
15020 41 52 45 44 20 29 7b 0a 20 20 20 20 61 73 73 65  ARED ){.    asse
15030 72 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a  rt( pPager->aInJ
15040 6f 75 72 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20  ournal==0 );.   
15050 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20   if( MEMDB ){.  
15060 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
15070 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55 53  e = PAGER_EXCLUS
15080 49 56 45 3b 0a 20 20 20 20 20 20 70 50 61 67 65  IVE;.      pPage
15090 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20  r->origDbSize = 
150a0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a  pPager->dbSize;.
150b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
150c0 20 69 66 28 20 53 51 4c 49 54 45 5f 42 55 53 59   if( SQLITE_BUSY
150d0 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 7c  _RESERVED_LOCK |
150e0 7c 20 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20  | exFlag ){.    
150f0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
15100 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
15110 65 72 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43  er, RESERVED_LOC
15120 4b 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  K);.      }else{
15130 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
15140 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 26 70 50 61  lite3OsLock(&pPa
15150 67 65 72 2d 3e 66 64 2c 20 52 45 53 45 52 56 45  ger->fd, RESERVE
15160 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 7d  D_LOCK);.      }
15170 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
15180 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
15190 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74      pPager->stat
151a0 65 20 3d 20 50 41 47 45 52 5f 52 45 53 45 52 56  e = PAGER_RESERV
151b0 45 44 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ED;.        if( 
151c0 65 78 46 6c 61 67 20 29 7b 0a 20 20 20 20 20 20  exFlag ){.      
151d0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77      rc = pager_w
151e0 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
151f0 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
15200 43 4b 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  CK);.        }. 
15210 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
15220 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
15230 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
15240 20 72 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   rc;.      }.   
15250 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79     pPager->dirty
15260 43 61 63 68 65 20 3d 20 30 3b 0a 20 20 20 20 20  Cache = 0;.     
15270 20 54 52 41 43 45 32 28 22 54 52 41 4e 53 41 43   TRACE2("TRANSAC
15280 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47 45  TION %d\n", PAGE
15290 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20  RID(pPager));.  
152a0 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e      if( pPager->
152b0 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21 70  useJournal && !p
152c0 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20  Pager->tempFile 
152d0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
152e0 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e  pager_open_journ
152f0 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  al(pPager);.    
15300 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
15310 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15320 0a 2a 2a 20 4d 61 72 6b 20 61 20 64 61 74 61 20  .** Mark a data 
15330 70 61 67 65 20 61 73 20 77 72 69 74 65 61 62 6c  page as writeabl
15340 65 2e 20 20 54 68 65 20 70 61 67 65 20 69 73 20  e.  The page is 
15350 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
15360 20 6a 6f 75 72 6e 61 6c 20 0a 2a 2a 20 69 66 20   journal .** if 
15370 69 74 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20  it is not there 
15380 61 6c 72 65 61 64 79 2e 20 20 54 68 69 73 20 72  already.  This r
15390 6f 75 74 69 6e 65 20 6d 75 73 74 20 62 65 20 63  outine must be c
153a0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 6d 61 6b  alled before mak
153b0 69 6e 67 0a 2a 2a 20 63 68 61 6e 67 65 73 20 74  ing.** changes t
153c0 6f 20 61 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  o a page..**.** 
153d0 54 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 74  The first time t
153e0 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
153f0 61 6c 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72  alled, the pager
15400 20 63 72 65 61 74 65 73 20 61 20 6e 65 77 0a 2a   creates a new.*
15410 2a 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 61 63  * journal and ac
15420 71 75 69 72 65 73 20 61 20 52 45 53 45 52 56 45  quires a RESERVE
15430 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61  D lock on the da
15440 74 61 62 61 73 65 2e 20 20 49 66 20 74 68 65 20  tabase.  If the 
15450 52 45 53 45 52 56 45 44 0a 2a 2a 20 6c 6f 63 6b  RESERVED.** lock
15460 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 61 63   could not be ac
15470 71 75 69 72 65 64 2c 20 74 68 69 73 20 72 6f 75  quired, this rou
15480 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
15490 49 54 45 5f 42 55 53 59 2e 20 20 54 68 65 0a 2a  ITE_BUSY.  The.*
154a0 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
154b0 65 20 6d 75 73 74 20 63 68 65 63 6b 20 66 6f 72  e must check for
154c0 20 74 68 61 74 20 72 65 74 75 72 6e 20 76 61 6c   that return val
154d0 75 65 20 61 6e 64 20 62 65 20 63 61 72 65 66 75  ue and be carefu
154e0 6c 20 6e 6f 74 20 74 6f 0a 2a 2a 20 63 68 61 6e  l not to.** chan
154f0 67 65 20 61 6e 79 20 70 61 67 65 20 64 61 74 61  ge any page data
15500 20 75 6e 74 69 6c 20 74 68 69 73 20 72 6f 75 74   until this rout
15510 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c 49  ine returns SQLI
15520 54 45 5f 4f 4b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  TE_OK..**.** If 
15530 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
15540 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20 77 72   could not be wr
15550 69 74 74 65 6e 20 62 65 63 61 75 73 65 20 74 68  itten because th
15560 65 20 64 69 73 6b 20 69 73 20 66 75 6c 6c 2c 0a  e disk is full,.
15570 2a 2a 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75  ** then this rou
15580 74 69 6e 65 20 72 65 74 75 72 6e 73 20 53 51 4c  tine returns SQL
15590 49 54 45 5f 46 55 4c 4c 20 61 6e 64 20 64 6f 65  ITE_FULL and doe
155a0 73 20 61 6e 20 69 6d 6d 65 64 69 61 74 65 20 72  s an immediate r
155b0 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20 41 6c 6c 20  ollback..** All 
155c0 73 75 62 73 65 71 75 65 6e 74 20 77 72 69 74 65  subsequent write
155d0 20 61 74 74 65 6d 70 74 73 20 61 6c 73 6f 20 72   attempts also r
155e0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 46 55 4c  eturn SQLITE_FUL
155f0 4c 20 75 6e 74 69 6c 20 74 68 65 72 65 0a 2a 2a  L until there.**
15600 20 69 73 20 61 20 63 61 6c 6c 20 74 6f 20 73 71   is a call to sq
15610 6c 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69  lite3pager_commi
15620 74 28 29 20 6f 72 20 73 71 6c 69 74 65 33 70 61  t() or sqlite3pa
15630 67 65 72 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 74  ger_rollback() t
15640 6f 0a 2a 2a 20 72 65 73 65 74 2e 0a 2a 2f 0a 69  o.** reset..*/.i
15650 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
15660 77 72 69 74 65 28 76 6f 69 64 20 2a 70 44 61 74  write(void *pDat
15670 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
15680 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44 52   = DATA_TO_PGHDR
15690 28 70 44 61 74 61 29 3b 0a 20 20 50 61 67 65 72  (pData);.  Pager
156a0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
156b0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
156c0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
156d0 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20 65 72   /* Check for er
156e0 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rors.  */.  if( 
156f0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 20  pPager->errMask 
15700 29 7b 20 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ){ .    return p
15710 61 67 65 72 5f 65 72 72 63 6f 64 65 28 70 50 61  ager_errcode(pPa
15720 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  ger);.  }.  if( 
15730 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79  pPager->readOnly
15740 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
15750 51 4c 49 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a  QLITE_PERM;.  }.
15760 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61 67  .  assert( !pPag
15770 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29 3b  er->setMaster );
15780 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
15790 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
157a0 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
157b0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
157c0 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
157d0 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
157e0 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
157f0 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 70  t away..  */.  p
15800 50 67 2d 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20  Pg->dirty = 1;. 
15810 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
15820 6e 61 6c 20 26 26 20 28 70 50 67 2d 3e 69 6e 53  nal && (pPg->inS
15830 74 6d 74 20 7c 7c 20 70 50 61 67 65 72 2d 3e 73  tmt || pPager->s
15840 74 6d 74 49 6e 55 73 65 3d 3d 30 29 20 29 7b 0a  tmtInUse==0) ){.
15850 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
15860 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 7d 65  yCache = 1;.  }e
15870 6c 73 65 7b 0a 0a 20 20 20 20 2f 2a 20 49 66 20  lse{..    /* If 
15880 77 65 20 67 65 74 20 74 68 69 73 20 66 61 72 2c  we get this far,
15890 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 74   it means that t
158a0 68 65 20 70 61 67 65 20 6e 65 65 64 73 20 74 6f  he page needs to
158b0 20 62 65 0a 20 20 20 20 2a 2a 20 77 72 69 74 74   be.    ** writt
158c0 65 6e 20 74 6f 20 74 68 65 20 74 72 61 6e 73 61  en to the transa
158d0 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6f 72  ction journal or
158e0 20 74 68 65 20 63 6b 65 63 6b 70 6f 69 6e 74 20   the ckeckpoint 
158f0 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 2a 2a 20 6f  journal.    ** o
15900 72 20 62 6f 74 68 2e 0a 20 20 20 20 2a 2a 0a 20  r both..    **. 
15910 20 20 20 2a 2a 20 46 69 72 73 74 20 63 68 65 63     ** First chec
15920 6b 20 74 6f 20 73 65 65 20 74 68 61 74 20 74 68  k to see that th
15930 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f  e transaction jo
15940 75 72 6e 61 6c 20 65 78 69 73 74 73 20 61 6e 64  urnal exists and
15950 0a 20 20 20 20 2a 2a 20 63 72 65 61 74 65 20 69  .    ** create i
15960 74 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  t if it does not
15970 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
15980 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61  ert( pPager->sta
15990 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te!=PAGER_UNLOCK
159a0 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   );.    rc = sql
159b0 69 74 65 33 70 61 67 65 72 5f 62 65 67 69 6e 28  ite3pager_begin(
159c0 70 44 61 74 61 2c 20 30 29 3b 0a 20 20 20 20 69  pData, 0);.    i
159d0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
159e0 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
159f0 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61   rc;.    }.    a
15a00 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
15a10 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
15a20 52 56 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  RVED );.    if( 
15a30 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
15a40 4f 70 65 6e 20 26 26 20 70 50 61 67 65 72 2d 3e  Open && pPager->
15a50 75 73 65 4a 6f 75 72 6e 61 6c 20 29 7b 0a 20 20  useJournal ){.  
15a60 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 6f      rc = pager_o
15a70 70 65 6e 5f 6a 6f 75 72 6e 61 6c 28 70 50 61 67  pen_journal(pPag
15a80 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
15a90 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
15aa0 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a  eturn rc;.    }.
15ab0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
15ac0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
15ad0 7c 7c 20 21 70 50 61 67 65 72 2d 3e 75 73 65 4a  || !pPager->useJ
15ae0 6f 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50  ournal );.    pP
15af0 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
15b00 20 3d 20 31 3b 0a 20 20 0a 20 20 20 20 2f 2a 20   = 1;.  .    /* 
15b10 54 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  The transaction 
15b20 6a 6f 75 72 6e 61 6c 20 6e 6f 77 20 65 78 69 73  journal now exis
15b30 74 73 20 61 6e 64 20 77 65 20 68 61 76 65 20 61  ts and we have a
15b40 20 52 45 53 45 52 56 45 44 20 6f 72 20 61 6e 0a   RESERVED or an.
15b50 20 20 20 20 2a 2a 20 45 58 43 4c 55 53 49 56 45      ** EXCLUSIVE
15b60 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69   lock on the mai
15b70 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  n database file.
15b80 20 20 57 72 69 74 65 20 74 68 65 20 63 75 72 72    Write the curr
15b90 65 6e 74 20 70 61 67 65 20 74 6f 0a 20 20 20 20  ent page to.    
15ba0 2a 2a 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ** the transacti
15bb0 6f 6e 20 6a 6f 75 72 6e 61 6c 20 69 66 20 69 74  on journal if it
15bc0 20 69 73 20 6e 6f 74 20 74 68 65 72 65 20 61 6c   is not there al
15bd0 72 65 61 64 79 2e 0a 20 20 20 20 2a 2f 0a 20 20  ready..    */.  
15be0 20 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f    if( !pPg->inJo
15bf0 75 72 6e 61 6c 20 26 26 20 28 70 50 61 67 65 72  urnal && (pPager
15c00 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 7c 7c 20  ->useJournal || 
15c10 4d 45 4d 44 42 29 20 29 7b 0a 20 20 20 20 20 20  MEMDB) ){.      
15c20 69 66 28 20 28 69 6e 74 29 70 50 67 2d 3e 70 67  if( (int)pPg->pg
15c30 6e 6f 20 3c 3d 20 70 50 61 67 65 72 2d 3e 6f 72  no <= pPager->or
15c40 69 67 44 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  igDbSize ){.    
15c50 20 20 20 20 69 6e 74 20 73 7a 50 67 3b 0a 20 20      int szPg;.  
15c60 20 20 20 20 20 20 75 33 32 20 73 61 76 65 64 3b        u32 saved;
15c70 0a 20 20 20 20 20 20 20 20 69 66 28 20 4d 45 4d  .        if( MEM
15c80 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  DB ){.          
15c90 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
15ca0 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
15cb0 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
15cc0 20 20 20 20 20 20 20 20 20 54 52 41 43 45 33 28           TRACE3(
15cd0 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65  "JOURNAL %d page
15ce0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
15cf0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
15d00 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  no);.          a
15d10 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 4f  ssert( pHist->pO
15d20 72 69 67 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  rig==0 );.      
15d30 20 20 20 20 70 48 69 73 74 2d 3e 70 4f 72 69 67      pHist->pOrig
15d40 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
15d50 61 77 28 20 70 50 61 67 65 72 2d 3e 70 61 67 65  aw( pPager->page
15d60 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20 20 20  Size );.        
15d70 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70 4f 72    if( pHist->pOr
15d80 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ig ){.          
15d90 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74 2d 3e    memcpy(pHist->
15da0 70 4f 72 69 67 2c 20 50 47 48 44 52 5f 54 4f 5f  pOrig, PGHDR_TO_
15db0 44 41 54 41 28 70 50 67 29 2c 20 70 50 61 67 65  DATA(pPg), pPage
15dc0 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
15dd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
15de0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15df0 20 20 20 75 33 32 20 63 6b 73 75 6d 3b 0a 20 20     u32 cksum;.  
15e00 20 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50          CODEC(pP
15e10 61 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67  ager, pData, pPg
15e20 2d 3e 70 67 6e 6f 2c 20 37 29 3b 0a 20 20 20 20  ->pgno, 7);.    
15e30 20 20 20 20 20 20 63 6b 73 75 6d 20 3d 20 70 61        cksum = pa
15e40 67 65 72 5f 63 6b 73 75 6d 28 70 50 61 67 65 72  ger_cksum(pPager
15e50 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 44 61  , pPg->pgno, pDa
15e60 74 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  ta);.          s
15e70 61 76 65 64 20 3d 20 2a 28 75 33 32 2a 29 50 47  aved = *(u32*)PG
15e80 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70 50 67  HDR_TO_EXTRA(pPg
15e90 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  , pPager);.     
15ea0 20 20 20 20 20 73 74 6f 72 65 33 32 62 69 74 73       store32bits
15eb0 28 63 6b 73 75 6d 2c 20 70 50 67 2c 20 70 50 61  (cksum, pPg, pPa
15ec0 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
15ed0 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
15ee0 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
15ef0 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 73  e+8;.          s
15f00 74 6f 72 65 33 32 62 69 74 73 28 70 50 67 2d 3e  tore32bits(pPg->
15f10 70 67 6e 6f 2c 20 70 50 67 2c 20 2d 34 29 3b 0a  pgno, pPg, -4);.
15f20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
15f30 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 26 70  qlite3OsWrite(&p
15f40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 28 28 63  Pager->jfd, &((c
15f50 68 61 72 2a 29 70 44 61 74 61 29 5b 2d 34 5d 2c  har*)pData)[-4],
15f60 20 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20   szPg);.        
15f70 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
15f80 6c 4f 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20  lOff += szPg;.  
15f90 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22          TRACE4("
15fa0 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20  JOURNAL %d page 
15fb0 25 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e  %d needSync=%d\n
15fc0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
15fd0 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61       PAGERID(pPa
15fe0 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  ger), pPg->pgno,
15ff0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b   pPg->needSync);
16000 0a 20 20 20 20 20 20 20 20 20 20 43 4f 44 45 43  .          CODEC
16010 28 70 50 61 67 65 72 2c 20 70 44 61 74 61 2c 20  (pPager, pData, 
16020 70 50 67 2d 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20  pPg->pgno, 0);. 
16030 20 20 20 20 20 20 20 20 20 2a 28 75 33 32 2a 29           *(u32*)
16040 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
16050 50 67 2c 20 70 50 61 67 65 72 29 20 3d 20 73 61  Pg, pPager) = sa
16060 76 65 64 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ved;.          i
16070 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
16080 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
16090 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
160a0 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20  lback(pPager);. 
160b0 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
160c0 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
160d0 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
160e0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
160f0 20 72 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   rc;.          }
16100 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
16110 72 2d 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20  r->nRec++;.     
16120 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
16130 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21  ger->aInJournal!
16140 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
16150 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
16160 61 6c 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20  al[pPg->pgno/8] 
16170 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f  |= 1<<(pPg->pgno
16180 26 37 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  &7);.          p
16190 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21  Pg->needSync = !
161a0 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
161b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 50            if( pP
161c0 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20  ager->stmtInUse 
161d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  ){.            p
161e0 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70  Pager->aInStmt[p
161f0 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31  Pg->pgno/8] |= 1
16200 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b  <<(pPg->pgno&7);
16210 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 61 67  .            pag
16220 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
16230 73 74 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20  st(pPg);.       
16240 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
16250 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
16260 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
16270 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6a 6f 75  c = !pPager->jou
16280 72 6e 61 6c 53 74 61 72 74 65 64 20 26 26 20 21  rnalStarted && !
16290 70 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a  pPager->noSync;.
162a0 20 20 20 20 20 20 20 20 54 52 41 43 45 34 28 22          TRACE4("
162b0 41 50 50 45 4e 44 20 25 64 20 70 61 67 65 20 25  APPEND %d page %
162c0 64 20 6e 65 65 64 53 79 6e 63 3d 25 64 5c 6e 22  d needSync=%d\n"
162d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
162e0 20 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72    PAGERID(pPager
162f0 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50  ), pPg->pgno, pP
16300 67 2d 3e 6e 65 65 64 53 79 6e 63 29 3b 0a 20 20  g->needSync);.  
16310 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
16320 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b  pPg->needSync ){
16330 0a 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d  .        pPager-
16340 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20  >needSync = 1;. 
16350 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67       }.      pPg
16360 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
16370 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
16380 20 49 66 20 74 68 65 20 73 74 61 74 65 6d 65 6e   If the statemen
16390 74 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f 70 65  t journal is ope
163a0 6e 20 61 6e 64 20 74 68 65 20 70 61 67 65 20 69  n and the page i
163b0 73 20 6e 6f 74 20 69 6e 20 69 74 2c 0a 20 20 20  s not in it,.   
163c0 20 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74   ** then write t
163d0 68 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20  he current page 
163e0 74 6f 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74  to the statement
163f0 20 6a 6f 75 72 6e 61 6c 2e 20 20 4e 6f 74 65 20   journal.  Note 
16400 74 68 61 74 0a 20 20 20 20 2a 2a 20 74 68 65 20  that.    ** the 
16410 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
16420 6c 20 66 6f 72 6d 61 74 20 64 69 66 66 65 72 73  l format differs
16430 20 66 72 6f 6d 20 74 68 65 20 73 74 61 6e 64 61   from the standa
16440 72 64 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61  rd journal forma
16450 74 0a 20 20 20 20 2a 2a 20 69 6e 20 74 68 61 74  t.    ** in that
16460 20 69 74 20 6f 6d 69 74 73 20 74 68 65 20 63 68   it omits the ch
16470 65 63 6b 73 75 6d 73 20 61 6e 64 20 74 68 65 20  ecksums and the 
16480 68 65 61 64 65 72 2e 0a 20 20 20 20 2a 2f 0a 20  header..    */. 
16490 20 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73     if( pPager->s
164a0 74 6d 74 49 6e 55 73 65 20 26 26 20 21 70 50 67  tmtInUse && !pPg
164b0 2d 3e 69 6e 53 74 6d 74 20 26 26 20 28 69 6e 74  ->inStmt && (int
164c0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
164d0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 29 7b 0a  er->stmtSize ){.
164e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
164f0 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20  g->inJournal || 
16500 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70  (int)pPg->pgno>p
16510 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
16520 65 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4d  e );.      if( M
16530 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20 20  EMDB ){.        
16540 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74  PgHistory *pHist
16550 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53 54   = PGHDR_TO_HIST
16560 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a 20  (pPg, pPager);. 
16570 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
16580 48 69 73 74 2d 3e 70 53 74 6d 74 3d 3d 30 20 29  Hist->pStmt==0 )
16590 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d  ;.        pHist-
165a0 3e 70 53 74 6d 74 20 3d 20 73 71 6c 69 74 65 4d  >pStmt = sqliteM
165b0 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67 65 72  allocRaw( pPager
165c0 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a 20 20  ->pageSize );.  
165d0 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
165e0 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
165f0 20 20 20 20 6d 65 6d 63 70 79 28 70 48 69 73 74      memcpy(pHist
16600 2d 3e 70 53 74 6d 74 2c 20 50 47 48 44 52 5f 54  ->pStmt, PGHDR_T
16610 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 70 50 61  O_DATA(pPg), pPa
16620 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a  ger->pageSize);.
16630 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
16640 20 20 54 52 41 43 45 33 28 22 53 54 4d 54 2d 4a    TRACE3("STMT-J
16650 4f 55 52 4e 41 4c 20 25 64 20 70 61 67 65 20 25  OURNAL %d page %
16660 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
16670 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
16680 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
16690 20 20 20 20 20 20 20 20 73 74 6f 72 65 33 32 62          store32b
166a0 69 74 73 28 70 50 67 2d 3e 70 67 6e 6f 2c 20 70  its(pPg->pgno, p
166b0 50 67 2c 20 2d 34 29 3b 0a 20 20 20 20 20 20 20  Pg, -4);.       
166c0 20 43 4f 44 45 43 28 70 50 61 67 65 72 2c 20 70   CODEC(pPager, p
166d0 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c  Data, pPg->pgno,
166e0 20 37 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20   7);.        rc 
166f0 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65  = sqlite3OsWrite
16700 28 26 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 28  (&pPager->stfd,(
16710 28 63 68 61 72 2a 29 70 44 61 74 61 29 2d 34 2c  (char*)pData)-4,
16720 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
16730 65 2b 34 29 3b 0a 20 20 20 20 20 20 20 20 54 52  e+4);.        TR
16740 41 43 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e  ACE3("STMT-JOURN
16750 41 4c 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22  AL %d page %d\n"
16760 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
16770 29 2c 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20  ), pPg->pgno);. 
16780 20 20 20 20 20 20 20 43 4f 44 45 43 28 70 50 61         CODEC(pPa
16790 67 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d  ger, pData, pPg-
167a0 3e 70 67 6e 6f 2c 20 30 29 3b 0a 20 20 20 20 20  >pgno, 0);.     
167b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
167c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
167d0 20 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72    sqlite3pager_r
167e0 6f 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b  ollback(pPager);
167f0 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65  .          pPage
16800 72 2d 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41  r->errMask |= PA
16810 47 45 52 5f 45 52 52 5f 46 55 4c 4c 3b 0a 20 20  GER_ERR_FULL;.  
16820 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72          return r
16830 63 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  c;.        }.   
16840 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d       pPager->stm
16850 74 4e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  tNRec++;.       
16860 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
16870 3e 61 49 6e 53 74 6d 74 21 3d 30 20 29 3b 0a 20  >aInStmt!=0 );. 
16880 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 61         pPager->a
16890 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70 67 6e 6f  InStmt[pPg->pgno
168a0 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50 67 2d 3e  /8] |= 1<<(pPg->
168b0 70 67 6e 6f 26 37 29 3b 0a 20 20 20 20 20 20 7d  pgno&7);.      }
168c0 0a 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f  .      page_add_
168d0 74 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67  to_stmt_list(pPg
168e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
168f0 2f 2a 20 55 70 64 61 74 65 20 74 68 65 20 64 61  /* Update the da
16900 74 61 62 61 73 65 20 73 69 7a 65 20 61 6e 64 20  tabase size and 
16910 72 65 74 75 72 6e 2e 0a 20 20 2a 2f 0a 20 20 69  return..  */.  i
16920 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  f( pPager->dbSiz
16930 65 3c 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  e<(int)pPg->pgno
16940 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   ){.    pPager->
16950 64 62 53 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67  dbSize = pPg->pg
16960 6e 6f 3b 0a 20 20 20 20 69 66 28 20 21 4d 45 4d  no;.    if( !MEM
16970 44 42 20 26 26 20 70 50 61 67 65 72 2d 3e 64 62  DB && pPager->db
16980 53 69 7a 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59  Size==PENDING_BY
16990 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53  TE/pPager->pageS
169a0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ize ){.      pPa
169b0 67 65 72 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20  ger->dbSize++;. 
169c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
169d0 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
169e0 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
169f0 65 20 70 61 67 65 20 67 69 76 65 6e 20 69 6e 20  e page given in 
16a00 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77 61 73  the argument was
16a10 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61 73 73   previously pass
16a20 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74 65 33  ed.** to sqlite3
16a30 70 61 67 65 72 5f 77 72 69 74 65 28 29 2e 20 20  pager_write().  
16a40 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
16a50 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 69  return TRUE if i
16a60 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63 68  t is ok.** to ch
16a70 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  ange the content
16a80 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a 2f   of the page..*/
16a90 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
16aa0 72 5f 69 73 77 72 69 74 65 61 62 6c 65 28 76 6f  r_iswriteable(vo
16ab0 69 64 20 2a 70 44 61 74 61 29 7b 0a 20 20 50 67  id *pData){.  Pg
16ac0 48 64 72 20 2a 70 50 67 20 3d 20 44 41 54 41 5f  Hdr *pPg = DATA_
16ad0 54 4f 5f 50 47 48 44 52 28 70 44 61 74 61 29 3b  TO_PGHDR(pData);
16ae0 0a 20 20 72 65 74 75 72 6e 20 70 50 67 2d 3e 64  .  return pPg->d
16af0 69 72 74 79 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  irty;.}..#ifndef
16b00 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41 43   SQLITE_OMIT_VAC
16b10 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61 63  UUM./*.** Replac
16b20 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  e the content of
16b30 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 77   a single page w
16b40 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ith the informat
16b50 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72 64  ion in the third
16b60 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  .** argument..*/
16b70 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65  .int sqlite3page
16b80 72 5f 6f 76 65 72 77 72 69 74 65 28 50 61 67 65  r_overwrite(Page
16b90 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
16ba0 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74  pgno, void *pDat
16bb0 61 29 7b 0a 20 20 76 6f 69 64 20 2a 70 50 61 67  a){.  void *pPag
16bc0 65 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20  e;.  int rc;..  
16bd0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
16be0 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 70 67  r_get(pPager, pg
16bf0 6e 6f 2c 20 26 70 50 61 67 65 29 3b 0a 20 20 69  no, &pPage);.  i
16c00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
16c10 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   ){.    rc = sql
16c20 69 74 65 33 70 61 67 65 72 5f 77 72 69 74 65 28  ite3pager_write(
16c30 70 50 61 67 65 29 3b 0a 20 20 20 20 69 66 28 20  pPage);.    if( 
16c40 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
16c50 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 70 50  .      memcpy(pP
16c60 61 67 65 2c 20 70 44 61 74 61 2c 20 70 50 61 67  age, pData, pPag
16c70 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
16c80 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
16c90 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61 67  pager_unref(pPag
16ca0 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
16cb0 20 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f   rc;.}.#endif../
16cc0 2a 0a 2a 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74  *.** A call to t
16cd0 68 69 73 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c  his routine tell
16ce0 73 20 74 68 65 20 70 61 67 65 72 20 74 68 61 74  s the pager that
16cf0 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65 73   it is not neces
16d00 73 61 72 79 20 74 6f 0a 2a 2a 20 77 72 69 74 65  sary to.** write
16d10 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
16d20 20 6f 6e 20 70 61 67 65 20 22 70 67 6e 6f 22 20   on page "pgno" 
16d30 62 61 63 6b 20 74 6f 20 74 68 65 20 64 69 73 6b  back to the disk
16d40 2c 20 65 76 65 6e 20 74 68 6f 75 67 68 0a 2a 2a  , even though.**
16d50 20 74 68 61 74 20 70 61 67 65 20 6d 69 67 68 74   that page might
16d60 20 62 65 20 6d 61 72 6b 65 64 20 61 73 20 64 69   be marked as di
16d70 72 74 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6f  rty..**.** The o
16d80 76 65 72 6c 79 69 6e 67 20 73 6f 66 74 77 61 72  verlying softwar
16d90 65 20 6c 61 79 65 72 20 63 61 6c 6c 73 20 74 68  e layer calls th
16da0 69 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20  is routine when 
16db0 61 6c 6c 20 6f 66 20 74 68 65 20 64 61 74 61 0a  all of the data.
16dc0 2a 2a 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  ** on the given 
16dd0 70 61 67 65 20 69 73 20 75 6e 75 73 65 64 2e 20  page is unused. 
16de0 20 54 68 65 20 70 61 67 65 72 20 6d 61 72 6b 73   The pager marks
16df0 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
16e00 61 6e 20 73 6f 0a 2a 2a 20 74 68 61 74 20 69 74  an so.** that it
16e10 20 64 6f 65 73 20 6e 6f 74 20 67 65 74 20 77 72   does not get wr
16e20 69 74 74 65 6e 20 74 6f 20 64 69 73 6b 2e 0a 2a  itten to disk..*
16e30 2a 0a 2a 2a 20 54 65 73 74 73 20 73 68 6f 77 20  *.** Tests show 
16e40 74 68 61 74 20 74 68 69 73 20 6f 70 74 69 6d 69  that this optimi
16e50 7a 61 74 69 6f 6e 2c 20 74 6f 67 65 74 68 65 72  zation, together
16e60 20 77 69 74 68 20 74 68 65 0a 2a 2a 20 73 71 6c   with the.** sql
16e70 69 74 65 33 70 61 67 65 72 5f 64 6f 6e 74 5f 72  ite3pager_dont_r
16e80 6f 6c 6c 62 61 63 6b 28 29 20 62 65 6c 6f 77 2c  ollback() below,
16e90 20 6d 6f 72 65 20 74 68 61 6e 20 64 6f 75 62 6c   more than doubl
16ea0 65 20 74 68 65 20 73 70 65 65 64 0a 2a 2a 20 6f  e the speed.** o
16eb0 66 20 6c 61 72 67 65 20 49 4e 53 45 52 54 20 6f  f large INSERT o
16ec0 70 65 72 61 74 69 6f 6e 73 20 61 6e 64 20 71 75  perations and qu
16ed0 61 64 72 75 70 6c 65 20 74 68 65 20 73 70 65 65  adruple the spee
16ee0 64 20 6f 66 20 6c 61 72 67 65 20 44 45 4c 45 54  d of large DELET
16ef0 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74  Es..**.** When t
16f00 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
16f10 61 6c 6c 65 64 2c 20 73 65 74 20 74 68 65 20 61  alled, set the a
16f20 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 66 6c  lwaysRollback fl
16f30 61 67 20 74 6f 20 74 72 75 65 2e 0a 2a 2a 20 53  ag to true..** S
16f40 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
16f50 74 6f 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  to sqlite3pager_
16f60 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b 28 29 20  dont_rollback() 
16f70 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70 61 67  for the same pag
16f80 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72 65 61  e.** will therea
16f90 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65 64 2e  fter be ignored.
16fa0 20 20 54 68 69 73 20 69 73 20 6e 65 63 65 73 73    This is necess
16fb0 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61 20 70  ary to avoid a p
16fc0 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72 65 20  roblem.** where 
16fd0 61 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  a page with data
16fe0 20 69 73 20 61 64 64 65 64 20 74 6f 20 74 68 65   is added to the
16ff0 20 66 72 65 65 6c 69 73 74 20 64 75 72 69 6e 67   freelist during
17000 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a 2a 20   one part of.** 
17010 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 74 68  a transaction th
17020 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  en removed from 
17030 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72  the freelist dur
17040 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61 72 74  ing a later part
17050 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d 65 20  .** of the same 
17060 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20  transaction and 
17070 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d 65 20  reused for some 
17080 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e 20 20  other purpose.  
17090 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20 66 69  When it.** is fi
170a0 72 73 74 20 61 64 64 65 64 20 74 6f 20 74 68 65  rst added to the
170b0 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69 73 20   freelist, this 
170c0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
170d0 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65 64 2c  d.  When reused,
170e0 0a 2a 2a 20 74 68 65 20 64 6f 6e 74 5f 72 6f 6c  .** the dont_rol
170f0 6c 62 61 63 6b 28 29 20 72 6f 75 74 69 6e 65 20  lback() routine 
17100 69 73 20 63 61 6c 6c 65 64 2e 20 20 42 75 74 20  is called.  But 
17110 62 65 63 61 75 73 65 20 74 68 65 20 70 61 67 65  because the page
17120 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 63 72 69   contains.** cri
17130 74 69 63 61 6c 20 64 61 74 61 2c 20 77 65 20 73  tical data, we s
17140 74 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65 20  till need to be 
17150 73 75 72 65 20 69 74 20 67 65 74 73 20 72 6f 6c  sure it gets rol
17160 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
17170 65 0a 2a 2a 20 6f 66 20 74 68 65 20 64 6f 6e 74  e.** of the dont
17180 5f 72 6f 6c 6c 62 61 63 6b 28 29 20 63 61 6c 6c  _rollback() call
17190 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
171a0 33 70 61 67 65 72 5f 64 6f 6e 74 5f 77 72 69 74  3pager_dont_writ
171b0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
171c0 20 50 67 6e 6f 20 70 67 6e 6f 29 7b 0a 20 20 50   Pgno pgno){.  P
171d0 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66  gHdr *pPg;..  if
171e0 28 20 4d 45 4d 44 42 20 29 20 72 65 74 75 72 6e  ( MEMDB ) return
171f0 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61 67 65 72  ;..  pPg = pager
17200 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20  _lookup(pPager, 
17210 70 67 6e 6f 29 3b 0a 20 20 70 50 67 2d 3e 61 6c  pgno);.  pPg->al
17220 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20 31  waysRollback = 1
17230 3b 0a 20 20 69 66 28 20 70 50 67 20 26 26 20 70  ;.  if( pPg && p
17240 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20 20  Pg->dirty ){.   
17250 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64 62 53   if( pPager->dbS
17260 69 7a 65 3d 3d 28 69 6e 74 29 70 50 67 2d 3e 70  ize==(int)pPg->p
17270 67 6e 6f 20 26 26 20 70 50 61 67 65 72 2d 3e 6f  gno && pPager->o
17280 72 69 67 44 62 53 69 7a 65 3c 70 50 61 67 65 72  rigDbSize<pPager
17290 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20  ->dbSize ){.    
172a0 20 20 2f 2a 20 49 66 20 74 68 69 73 20 70 61 67    /* If this pag
172b0 65 73 20 69 73 20 74 68 65 20 6c 61 73 74 20 70  es is the last p
172c0 61 67 65 20 69 6e 20 74 68 65 20 66 69 6c 65 20  age in the file 
172d0 61 6e 64 20 74 68 65 20 66 69 6c 65 20 68 61 73  and the file has
172e0 20 67 72 6f 77 6e 0a 20 20 20 20 20 20 2a 2a 20   grown.      ** 
172f0 64 75 72 69 6e 67 20 74 68 65 20 63 75 72 72 65  during the curre
17300 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20  nt transaction, 
17310 74 68 65 6e 20 64 6f 20 4e 4f 54 20 6d 61 72 6b  then do NOT mark
17320 20 74 68 65 20 70 61 67 65 20 61 73 20 63 6c 65   the page as cle
17330 61 6e 2e 0a 20 20 20 20 20 20 2a 2a 20 57 68 65  an..      ** Whe
17340 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
17350 69 6c 65 20 67 72 6f 77 73 2c 20 77 65 20 6d 75  ile grows, we mu
17360 73 74 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61  st make sure tha
17370 74 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 0a  t the last page.
17380 20 20 20 20 20 20 2a 2a 20 67 65 74 73 20 77 72        ** gets wr
17390 69 74 74 65 6e 20 61 74 20 6c 65 61 73 74 20 6f  itten at least o
173a0 6e 63 65 20 73 6f 20 74 68 61 74 20 74 68 65 20  nce so that the 
173b0 64 69 73 6b 20 66 69 6c 65 20 77 69 6c 6c 20 62  disk file will b
173c0 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 20 20  e the correct.  
173d0 20 20 20 20 2a 2a 20 73 69 7a 65 2e 20 49 66 20      ** size. If 
173e0 79 6f 75 20 64 6f 20 6e 6f 74 20 77 72 69 74 65  you do not write
173f0 20 74 68 69 73 20 70 61 67 65 20 61 6e 64 20 74   this page and t
17400 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 66  he size of the f
17410 69 6c 65 0a 20 20 20 20 20 20 2a 2a 20 6f 6e 20  ile.      ** on 
17420 74 68 65 20 64 69 73 6b 20 65 6e 64 73 20 75 70  the disk ends up
17430 20 62 65 69 6e 67 20 74 6f 6f 20 73 6d 61 6c 6c   being too small
17440 2c 20 74 68 61 74 20 63 61 6e 20 6c 65 61 64 20  , that can lead 
17450 74 6f 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  to database.    
17460 20 20 2a 2a 20 63 6f 72 72 75 70 74 69 6f 6e 20    ** corruption 
17470 64 75 72 69 6e 67 20 74 68 65 20 6e 65 78 74 20  during the next 
17480 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
17490 20 20 20 2a 2f 0a 20 20 20 20 7d 65 6c 73 65 7b     */.    }else{
174a0 0a 20 20 20 20 20 20 54 52 41 43 45 33 28 22 44  .      TRACE3("D
174b0 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
174c0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 67 6e 6f  d of %d\n", pgno
174d0 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65 72  , PAGERID(pPager
174e0 29 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64  ));.      pPg->d
174f0 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  irty = 0;.    }.
17500 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 63    }.}../*.** A c
17510 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75 74  all to this rout
17520 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70 61  ine tells the pa
17530 67 65 72 20 74 68 61 74 20 69 66 20 61 20 72 6f  ger that if a ro
17540 6c 6c 62 61 63 6b 20 6f 63 63 75 72 73 2c 0a 2a  llback occurs,.*
17550 2a 20 69 74 20 69 73 20 6e 6f 74 20 6e 65 63 65  * it is not nece
17560 73 73 61 72 79 20 74 6f 20 72 65 73 74 6f 72 65  ssary to restore
17570 20 74 68 65 20 64 61 74 61 20 6f 6e 20 74 68 65   the data on the
17580 20 67 69 76 65 6e 20 70 61 67 65 2e 20 20 54 68   given page.  Th
17590 69 73 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74  is.** means that
175a0 20 74 68 65 20 70 61 67 65 72 20 64 6f 65 73 20   the pager does 
175b0 6e 6f 74 20 68 61 76 65 20 74 6f 20 72 65 63 6f  not have to reco
175c0 72 64 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  rd the given pag
175d0 65 20 69 6e 20 74 68 65 0a 2a 2a 20 72 6f 6c 6c  e in the.** roll
175e0 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  back journal..*/
175f0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 70 61 67  .void sqlite3pag
17600 65 72 5f 64 6f 6e 74 5f 72 6f 6c 6c 62 61 63 6b  er_dont_rollback
17610 28 76 6f 69 64 20 2a 70 44 61 74 61 29 7b 0a 20  (void *pData){. 
17620 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 44 41   PgHdr *pPg = DA
17630 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 44 61 74  TA_TO_PGHDR(pDat
17640 61 29 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61  a);.  Pager *pPa
17650 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65  ger = pPg->pPage
17660 72 3b 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72  r;..  if( pPager
17670 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f 45  ->state!=PAGER_E
17680 58 43 4c 55 53 49 56 45 20 7c 7c 20 70 50 61 67  XCLUSIVE || pPag
17690 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d  er->journalOpen=
176a0 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
176b0 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f  f( pPg->alwaysRo
176c0 6c 6c 62 61 63 6b 20 7c 7c 20 70 50 61 67 65 72  llback || pPager
176d0 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b  ->alwaysRollback
176e0 20 7c 7c 20 4d 45 4d 44 42 20 29 20 72 65 74 75   || MEMDB ) retu
176f0 72 6e 3b 0a 20 20 69 66 28 20 21 70 50 67 2d 3e  rn;.  if( !pPg->
17700 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28 69 6e  inJournal && (in
17710 74 29 70 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70  t)pPg->pgno <= p
17720 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
17730 65 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  e ){.    assert(
17740 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
17750 6e 61 6c 21 3d 30 20 29 3b 0a 20 20 20 20 70 50  nal!=0 );.    pP
17760 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
17770 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
17780 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
17790 29 3b 0a 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f  );.    pPg->inJo
177a0 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 69  urnal = 1;.    i
177b0 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  f( pPager->stmtI
177c0 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20 70 50  nUse ){.      pP
177d0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50  ager->aInStmt[pP
177e0 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c  g->pgno/8] |= 1<
177f0 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a  <(pPg->pgno&7);.
17800 20 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74        page_add_t
17810 6f 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29  o_stmt_list(pPg)
17820 3b 0a 20 20 20 20 7d 0a 20 20 20 20 54 52 41 43  ;.    }.    TRAC
17830 45 33 28 22 44 4f 4e 54 5f 52 4f 4c 4c 42 41 43  E3("DONT_ROLLBAC
17840 4b 20 70 61 67 65 20 25 64 20 6f 66 20 25 64 5c  K page %d of %d\
17850 6e 22 2c 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 50  n", pPg->pgno, P
17860 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
17870 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
17880 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20  r->stmtInUse && 
17890 21 70 50 67 2d 3e 69 6e 53 74 6d 74 20 26 26 20  !pPg->inStmt && 
178a0 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d  (int)pPg->pgno<=
178b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65  pPager->stmtSize
178c0 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
178d0 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c  pPg->inJournal |
178e0 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f  | (int)pPg->pgno
178f0 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  >pPager->origDbS
17900 69 7a 65 20 29 3b 0a 20 20 20 20 61 73 73 65 72  ize );.    asser
17910 74 28 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74  t( pPager->aInSt
17920 6d 74 21 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  mt!=0 );.    pPa
17930 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
17940 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
17950 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
17960 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f 5f 73     page_add_to_s
17970 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b 0a 20  tmt_list(pPg);. 
17980 20 7d 0a 7d 0a 0a 0a 23 69 66 6e 64 65 66 20 53   }.}...#ifndef S
17990 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45 4d 4f 52  QLITE_OMIT_MEMOR
179a0 59 44 42 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  YDB./*.** Clear 
179b0 61 20 50 67 48 69 73 74 6f 72 79 20 62 6c 6f 63  a PgHistory bloc
179c0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
179d0 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 50 67   clearHistory(Pg
179e0 48 69 73 74 6f 72 79 20 2a 70 48 69 73 74 29 7b  History *pHist){
179f0 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 48  .  sqliteFree(pH
17a00 69 73 74 2d 3e 70 4f 72 69 67 29 3b 0a 20 20 73  ist->pOrig);.  s
17a10 71 6c 69 74 65 46 72 65 65 28 70 48 69 73 74 2d  qliteFree(pHist-
17a20 3e 70 53 74 6d 74 29 3b 0a 20 20 70 48 69 73 74  >pStmt);.  pHist
17a30 2d 3e 70 4f 72 69 67 20 3d 20 30 3b 0a 20 20 70  ->pOrig = 0;.  p
17a40 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b  Hist->pStmt = 0;
17a50 0a 7d 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  .}.#else.#define
17a60 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28 78 29   clearHistory(x)
17a70 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
17a80 6f 6d 6d 69 74 20 61 6c 6c 20 63 68 61 6e 67 65  ommit all change
17a90 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  s to the databas
17aa0 65 20 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68  e and release th
17ab0 65 20 77 72 69 74 65 20 6c 6f 63 6b 2e 0a 2a 2a  e write lock..**
17ac0 0a 2a 2a 20 49 66 20 74 68 65 20 63 6f 6d 6d 69  .** If the commi
17ad0 74 20 66 61 69 6c 73 20 66 6f 72 20 61 6e 79 20  t fails for any 
17ae0 72 65 61 73 6f 6e 2c 20 61 20 72 6f 6c 6c 62 61  reason, a rollba
17af0 63 6b 20 61 74 74 65 6d 70 74 20 69 73 20 6d 61  ck attempt is ma
17b00 64 65 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  de.** and an err
17b10 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
17b20 6e 65 64 2e 20 20 49 66 20 74 68 65 20 63 6f 6d  ned.  If the com
17b30 6d 69 74 20 77 6f 72 6b 65 64 2c 20 53 51 4c 49  mit worked, SQLI
17b40 54 45 5f 4f 4b 0a 2a 2a 20 69 73 20 72 65 74 75  TE_OK.** is retu
17b50 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
17b60 69 74 65 33 70 61 67 65 72 5f 63 6f 6d 6d 69 74  ite3pager_commit
17b70 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
17b80 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
17b90 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
17ba0 70 50 61 67 65 72 2d 3e 65 72 72 4d 61 73 6b 3d  pPager->errMask=
17bb0 3d 50 41 47 45 52 5f 45 52 52 5f 46 55 4c 4c 20  =PAGER_ERR_FULL 
17bc0 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  ){.    rc = sqli
17bd0 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62 61 63  te3pager_rollbac
17be0 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69  k(pPager);.    i
17bf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
17c00 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53   ){.      rc = S
17c10 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20  QLITE_FULL;.    
17c20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  }.    return rc;
17c30 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65  .  }.  if( pPage
17c40 72 2d 3e 65 72 72 4d 61 73 6b 21 3d 30 20 29 7b  r->errMask!=0 ){
17c50 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f  .    rc = pager_
17c60 65 72 72 63 6f 64 65 28 70 50 61 67 65 72 29 3b  errcode(pPager);
17c70 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
17c80 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
17c90 2d 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45  ->state<PAGER_RE
17ca0 53 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65  SERVED ){.    re
17cb0 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
17cc0 52 3b 0a 20 20 7d 0a 20 20 54 52 41 43 45 32 28  R;.  }.  TRACE2(
17cd0 22 43 4f 4d 4d 49 54 20 25 64 5c 6e 22 2c 20 50  "COMMIT %d\n", P
17ce0 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b  AGERID(pPager));
17cf0 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a  .  if( MEMDB ){.
17d00 20 20 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f      pPg = pager_
17d10 67 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61  get_all_dirty_pa
17d20 67 65 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20  ges(pPager);.   
17d30 20 77 68 69 6c 65 28 20 70 50 67 20 29 7b 0a 20   while( pPg ){. 
17d40 20 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72       clearHistor
17d50 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28  y(PGHDR_TO_HIST(
17d60 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a 20  pPg, pPager));. 
17d70 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79 20       pPg->dirty 
17d80 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e  = 0;.      pPg->
17d90 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
17da0 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d 74       pPg->inStmt
17db0 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
17dc0 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50 67  >pPrevStmt = pPg
17dd0 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b  ->pNextStmt = 0;
17de0 0a 20 20 20 20 20 20 70 50 67 20 3d 20 70 50 67  .      pPg = pPg
17df0 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a  ->pDirty;.    }.
17e00 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
17e10 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65     for(pPg=pPage
17e20 72 2d 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50  r->pAll; pPg; pP
17e30 67 3d 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29  g=pPg->pNextAll)
17e40 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
17e50 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44 52  y *pHist = PGHDR
17e60 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70 50  _TO_HIST(pPg, pP
17e70 61 67 65 72 29 3b 0a 20 20 20 20 20 20 61 73 73  ager);.      ass
17e80 65 72 74 28 20 21 70 50 67 2d 3e 61 6c 77 61 79  ert( !pPg->alway
17e90 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20 20  sRollback );.   
17ea0 20 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73     assert( !pHis
17eb0 74 2d 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20  t->pOrig );.    
17ec0 20 20 61 73 73 65 72 74 28 20 21 70 48 69 73 74    assert( !pHist
17ed0 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 7d  ->pStmt );.    }
17ee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 70 50 61 67  .#endif.    pPag
17ef0 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20  er->pStmt = 0;. 
17f00 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
17f10 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
17f20 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
17f30 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 69 66 28  TE_OK;.  }.  if(
17f40 20 70 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61   pPager->dirtyCa
17f50 63 68 65 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  che==0 ){.    /*
17f60 20 45 78 69 74 20 65 61 72 6c 79 20 28 77 69 74   Exit early (wit
17f70 68 6f 75 74 20 64 6f 69 6e 67 20 74 68 65 20 74  hout doing the t
17f80 69 6d 65 2d 63 6f 6e 73 75 6d 69 6e 67 20 73 71  ime-consuming sq
17f90 6c 69 74 65 33 4f 73 53 79 6e 63 28 29 20 63 61  lite3OsSync() ca
17fa0 6c 6c 73 29 0a 20 20 20 20 2a 2a 20 69 66 20 74  lls).    ** if t
17fb0 68 65 72 65 20 68 61 76 65 20 62 65 65 6e 20 6e  here have been n
17fc0 6f 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68 65  o changes to the
17fd0 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20   database file. 
17fe0 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  */.    assert( p
17ff0 50 61 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 3d  Pager->needSync=
18000 3d 30 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  =0 );.    rc = p
18010 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
18020 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70 50  (pPager);.    pP
18030 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
18040 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63  1;.    return rc
18050 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
18060 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
18070 70 65 6e 20 29 3b 0a 20 20 72 63 20 3d 20 73 71  pen );.  rc = sq
18080 6c 69 74 65 33 70 61 67 65 72 5f 73 79 6e 63 28  lite3pager_sync(
18090 70 50 61 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  pPager, 0, 0);. 
180a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
180b0 4f 4b 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 63  OK ){.    goto c
180c0 6f 6d 6d 69 74 5f 61 62 6f 72 74 3b 0a 20 20 7d  ommit_abort;.  }
180d0 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e  .  rc = pager_un
180e0 77 72 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72  writelock(pPager
180f0 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53  );.  pPager->dbS
18100 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
18110 72 6e 20 72 63 3b 0a 0a 20 20 2f 2a 20 4a 75 6d  rn rc;..  /* Jum
18120 70 20 68 65 72 65 20 69 66 20 61 6e 79 74 68 69  p here if anythi
18130 6e 67 20 67 6f 65 73 20 77 72 6f 6e 67 20 64 75  ng goes wrong du
18140 72 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  ring the commit 
18150 70 72 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 63 6f  process..  */.co
18160 6d 6d 69 74 5f 61 62 6f 72 74 3a 0a 20 20 73 71  mmit_abort:.  sq
18170 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c 6c 62  lite3pager_rollb
18180 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 72  ack(pPager);.  r
18190 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
181a0 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20  ** Rollback all 
181b0 63 68 61 6e 67 65 73 2e 20 20 54 68 65 20 64 61  changes.  The da
181c0 74 61 62 61 73 65 20 66 61 6c 6c 73 20 62 61 63  tabase falls bac
181d0 6b 20 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45  k to PAGER_SHARE
181e0 44 20 6d 6f 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69  D mode..** All i
181f0 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20 70  n-memory cache p
18200 61 67 65 73 20 72 65 76 65 72 74 20 74 6f 20 74  ages revert to t
18210 68 65 69 72 20 6f 72 69 67 69 6e 61 6c 20 64 61  heir original da
18220 74 61 20 63 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20  ta contents..** 
18230 54 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 64  The journal is d
18240 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
18250 69 73 20 72 6f 75 74 69 6e 65 20 63 61 6e 6e 6f  is routine canno
18260 74 20 66 61 69 6c 20 75 6e 6c 65 73 73 20 73 6f  t fail unless so
18270 6d 65 20 6f 74 68 65 72 20 70 72 6f 63 65 73 73  me other process
18280 20 69 73 20 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e   is not followin
18290 67 0a 2a 2a 20 74 68 65 20 63 6f 72 72 65 63 74  g.** the correct
182a0 20 6c 6f 63 6b 69 6e 67 20 70 72 6f 74 6f 63 6f   locking protoco
182b0 6c 20 28 53 51 4c 49 54 45 5f 50 52 4f 54 4f 43  l (SQLITE_PROTOC
182c0 4f 4c 29 20 6f 72 20 75 6e 6c 65 73 73 20 73 6f  OL) or unless so
182d0 6d 65 20 6f 74 68 65 72 0a 2a 2a 20 70 72 6f 63  me other.** proc
182e0 65 73 73 20 69 73 20 77 72 69 74 69 6e 67 20 74  ess is writing t
182f0 72 61 73 68 20 69 6e 74 6f 20 74 68 65 20 6a 6f  rash into the jo
18300 75 72 6e 61 6c 20 66 69 6c 65 20 28 53 51 4c 49  urnal file (SQLI
18310 54 45 5f 43 4f 52 52 55 50 54 29 20 6f 72 0a 2a  TE_CORRUPT) or.*
18320 2a 20 75 6e 6c 65 73 73 20 61 20 70 72 69 6f 72  * unless a prior
18330 20 6d 61 6c 6c 6f 63 28 29 20 66 61 69 6c 65 64   malloc() failed
18340 20 28 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 29 2e   (SQLITE_NOMEM).
18350 20 20 41 70 70 72 6f 70 72 69 61 74 65 20 65 72    Appropriate er
18360 72 6f 72 0a 2a 2a 20 63 6f 64 65 73 20 61 72 65  ror.** codes are
18370 20 72 65 74 75 72 6e 65 64 20 66 6f 72 20 61 6c   returned for al
18380 6c 20 74 68 65 73 65 20 6f 63 63 61 73 69 6f 6e  l these occasion
18390 73 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 0a 2a  s.  Otherwise,.*
183a0 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  * SQLITE_OK is r
183b0 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20  eturned..*/.int 
183c0 73 71 6c 69 74 65 33 70 61 67 65 72 5f 72 6f 6c  sqlite3pager_rol
183d0 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  lback(Pager *pPa
183e0 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  ger){.  int rc;.
183f0 20 20 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41    TRACE2("ROLLBA
18400 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  CK %d\n", PAGERI
18410 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66  D(pPager));.  if
18420 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50  ( MEMDB ){.    P
18430 67 48 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72  gHdr *p;.    for
18440 28 70 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b  (p=pPager->pAll;
18450 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c   p; p=p->pNextAl
18460 6c 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74  l){.      PgHist
18470 6f 72 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20  ory *pHist;.    
18480 20 20 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c    assert( !p->al
18490 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a  waysRollback );.
184a0 20 20 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69        if( !p->di
184b0 72 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61  rty ){.        a
184c0 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73 74  ssert( !((PgHist
184d0 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48  ory *)PGHDR_TO_H
184e0 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d  IST(p, pPager))-
184f0 3e 70 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20  >pOrig );.      
18500 20 20 61 73 73 65 72 74 28 20 21 28 28 50 67 48    assert( !((PgH
18510 69 73 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54  istory *)PGHDR_T
18520 4f 5f 48 49 53 54 28 70 2c 20 70 50 61 67 65 72  O_HIST(p, pPager
18530 29 29 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20  ))->pStmt );.   
18540 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
18550 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48       }..      pH
18560 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
18570 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a  IST(p, pPager);.
18580 20 20 20 20 20 20 69 66 28 20 70 48 69 73 74 2d        if( pHist-
18590 3e 70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20  >pOrig ){.      
185a0 20 20 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54    memcpy(PGHDR_T
185b0 4f 5f 44 41 54 41 28 70 29 2c 20 70 48 69 73 74  O_DATA(p), pHist
185c0 2d 3e 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d  ->pOrig, pPager-
185d0 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
185e0 20 20 20 20 54 52 41 43 45 33 28 22 52 4f 4c 4c      TRACE3("ROLL
185f0 42 41 43 4b 2d 50 41 47 45 20 25 64 20 6f 66 20  BACK-PAGE %d of 
18600 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e 6f 2c 20  %d\n", p->pgno, 
18610 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
18620 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
18630 20 20 20 20 20 20 20 54 52 41 43 45 33 28 22 50         TRACE3("P
18640 41 47 45 20 25 64 20 69 73 20 63 6c 65 61 6e 20  AGE %d is clean 
18650 6f 6e 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  on %d\n", p->pgn
18660 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
18670 72 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  r));.      }.   
18680 20 20 20 63 6c 65 61 72 48 69 73 74 6f 72 79 28     clearHistory(
18690 70 48 69 73 74 29 3b 0a 20 20 20 20 20 20 70 2d  pHist);.      p-
186a0 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20 20  >dirty = 0;.    
186b0 20 20 70 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d    p->inJournal =
186c0 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 53   0;.      p->inS
186d0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  tmt = 0;.      p
186e0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 2d  ->pPrevStmt = p-
186f0 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30 3b 0a  >pNextStmt = 0;.
18700 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 67 65  .      if( pPage
18710 72 2d 3e 78 52 65 69 6e 69 74 65 72 20 29 7b 0a  r->xReiniter ){.
18720 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
18730 78 52 65 69 6e 69 74 65 72 28 50 47 48 44 52 5f  xReiniter(PGHDR_
18740 54 4f 5f 44 41 54 41 28 70 29 2c 20 70 50 61 67  TO_DATA(p), pPag
18750 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20  er->pageSize);. 
18760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 0a 20 20       }.      .  
18770 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e    }.    pPager->
18780 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70  pStmt = 0;.    p
18790 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
187a0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
187b0 7a 65 3b 0a 20 20 20 20 6d 65 6d 6f 72 79 54 72  ze;.    memoryTr
187c0 75 6e 63 61 74 65 28 70 50 61 67 65 72 29 3b 0a  uncate(pPager);.
187d0 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
187e0 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
187f0 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50  Pager->state = P
18800 41 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20  AGER_SHARED;.   
18810 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
18820 4b 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 21 70  K;.  }..  if( !p
18830 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
18840 65 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e 6a 6f  e || !pPager->jo
18850 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20 20 20  urnalOpen ){.   
18860 20 72 63 20 3d 20 70 61 67 65 72 5f 75 6e 77 72   rc = pager_unwr
18870 69 74 65 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  itelock(pPager);
18880 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
18890 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 20 20 72 65  ize = -1;.    re
188a0 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20  turn rc;.  }..  
188b0 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 4d  if( pPager->errM
188c0 61 73 6b 21 3d 30 20 26 26 20 70 50 61 67 65 72  ask!=0 && pPager
188d0 2d 3e 65 72 72 4d 61 73 6b 21 3d 50 41 47 45 52  ->errMask!=PAGER
188e0 5f 45 52 52 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  _ERR_FULL ){.   
188f0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18900 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
18910 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
18920 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
18930 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  er);.    }.    r
18940 65 74 75 72 6e 20 70 61 67 65 72 5f 65 72 72 63  eturn pager_errc
18950 6f 64 65 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ode(pPager);.  }
18960 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
18970 74 61 74 65 3d 3d 50 41 47 45 52 5f 52 45 53 45  tate==PAGER_RESE
18980 52 56 45 44 20 29 7b 0a 20 20 20 20 69 6e 74 20  RVED ){.    int 
18990 72 63 32 2c 20 72 63 33 3b 0a 20 20 20 20 72 63  rc2, rc3;.    rc
189a0 20 3d 20 70 61 67 65 72 5f 72 65 6c 6f 61 64 5f   = pager_reload_
189b0 63 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20  cache(pPager);. 
189c0 20 20 20 72 63 32 20 3d 20 70 61 67 65 72 5f 74     rc2 = pager_t
189d0 72 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20  runcate(pPager, 
189e0 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69  pPager->origDbSi
189f0 7a 65 29 3b 0a 20 20 20 20 72 63 33 20 3d 20 70  ze);.    rc3 = p
18a00 61 67 65 72 5f 75 6e 77 72 69 74 65 6c 6f 63 6b  ager_unwritelock
18a10 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66  (pPager);.    if
18a20 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18a30 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
18a40 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 33  2;.      if( rc3
18a50 20 29 20 72 63 20 3d 20 72 63 33 3b 0a 20 20 20   ) rc = rc3;.   
18a60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
18a70 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61 79 62  rc = pager_playb
18a80 61 63 6b 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  ack(pPager);.  }
18a90 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
18aa0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d  E_OK ){.    rc =
18ab0 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b   SQLITE_CORRUPT;
18ac0 20 20 2f 2a 20 62 6b 70 74 2d 43 4f 52 52 55 50    /* bkpt-CORRUP
18ad0 54 20 2a 2f 0a 20 20 20 20 70 50 61 67 65 72 2d  T */.    pPager-
18ae0 3e 65 72 72 4d 61 73 6b 20 7c 3d 20 50 41 47 45  >errMask |= PAGE
18af0 52 5f 45 52 52 5f 43 4f 52 52 55 50 54 3b 0a 20  R_ERR_CORRUPT;. 
18b00 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 64 62 53   }.  pPager->dbS
18b10 69 7a 65 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75  ize = -1;.  retu
18b20 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
18b30 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
18b40 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
18b50 20 69 73 20 6f 70 65 6e 65 64 20 72 65 61 64 2d   is opened read-
18b60 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 46 41  only.  Return FA
18b70 4c 53 45 0a 2a 2a 20 69 66 20 74 68 65 20 64 61  LSE.** if the da
18b80 74 61 62 61 73 65 20 69 73 20 28 69 6e 20 74 68  tabase is (in th
18b90 65 6f 72 79 29 20 77 72 69 74 61 62 6c 65 2e 0a  eory) writable..
18ba0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
18bb0 67 65 72 5f 69 73 72 65 61 64 6f 6e 6c 79 28 50  ger_isreadonly(P
18bc0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
18bd0 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e   return pPager->
18be0 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a 0a 2f 2a 0a  readOnly;.}../*.
18bf0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
18c00 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73 74  is used for test
18c10 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73  ing and analysis
18c20 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a 73   only..*/.int *s
18c30 71 6c 69 74 65 33 70 61 67 65 72 5f 73 74 61 74  qlite3pager_stat
18c40 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
18c50 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
18c60 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
18c70 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
18c80 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
18c90 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
18ca0 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
18cb0 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
18cc0 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
18cd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
18ce0 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
18cf0 65 72 72 4d 61 73 6b 3b 0a 20 20 61 5b 36 5d 20  errMask;.  a[6] 
18d00 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
18d10 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
18d20 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
18d30 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c 3b 0a   pPager->nOvfl;.
18d40 20 20 61 5b 39 5d 20 3d 20 70 50 61 67 65 72 2d    a[9] = pPager-
18d50 3e 6e 52 65 61 64 3b 0a 20 20 61 5b 31 30 5d 20  >nRead;.  a[10] 
18d60 3d 20 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65  = pPager->nWrite
18d70 3b 0a 20 20 72 65 74 75 72 6e 20 61 3b 0a 7d 0a  ;.  return a;.}.
18d80 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 73  ./*.** Set the s
18d90 74 61 74 65 6d 65 6e 74 20 72 6f 6c 6c 62 61 63  tatement rollbac
18da0 6b 20 70 6f 69 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54  k point..**.** T
18db0 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
18dc0 6c 64 20 62 65 20 63 61 6c 6c 65 64 20 77 69 74  ld be called wit
18dd0 68 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f  h the transactio
18de0 6e 20 6a 6f 75 72 6e 61 6c 20 61 6c 72 65 61 64  n journal alread
18df0 79 0a 2a 2a 20 6f 70 65 6e 2e 20 20 41 20 6e 65  y.** open.  A ne
18e00 77 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  w statement jour
18e10 6e 61 6c 20 69 73 20 63 72 65 61 74 65 64 20 74  nal is created t
18e20 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
18e30 74 6f 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 63  to rollback.** c
18e40 68 61 6e 67 65 73 20 6f 66 20 61 20 73 69 6e 67  hanges of a sing
18e50 6c 65 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 77  le SQL command w
18e60 69 74 68 69 6e 20 61 20 6c 61 72 67 65 72 20 74  ithin a larger t
18e70 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  ransaction..*/.i
18e80 6e 74 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f  nt sqlite3pager_
18e90 73 74 6d 74 5f 62 65 67 69 6e 28 50 61 67 65 72  stmt_begin(Pager
18ea0 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
18eb0 20 72 63 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d   rc;.  char zTem
18ec0 70 5b 53 51 4c 49 54 45 5f 54 45 4d 50 4e 41 4d  p[SQLITE_TEMPNAM
18ed0 45 5f 53 49 5a 45 5d 3b 0a 20 20 61 73 73 65 72  E_SIZE];.  asser
18ee0 74 28 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74  t( !pPager->stmt
18ef0 49 6e 55 73 65 20 29 3b 0a 20 20 61 73 73 65 72  InUse );.  asser
18f00 74 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  t( pPager->dbSiz
18f10 65 3e 3d 30 20 29 3b 0a 20 20 54 52 41 43 45 32  e>=0 );.  TRACE2
18f20 28 22 53 54 4d 54 2d 42 45 47 49 4e 20 25 64 5c  ("STMT-BEGIN %d\
18f30 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  n", PAGERID(pPag
18f40 65 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44  er));.  if( MEMD
18f50 42 20 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d  B ){.    pPager-
18f60 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 31 3b 0a  >stmtInUse = 1;.
18f70 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
18f80 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 64  Size = pPager->d
18f90 62 53 69 7a 65 3b 0a 20 20 20 20 72 65 74 75 72  bSize;.    retur
18fa0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  n SQLITE_OK;.  }
18fb0 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
18fc0 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b 0a 20  journalOpen ){. 
18fd0 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41     pPager->stmtA
18fe0 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a 20 20 20  utoopen = 1;.   
18ff0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
19000 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  K;.  }.  assert(
19010 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
19020 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61 67 65 72  Open );.  pPager
19030 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73 71 6c 69  ->aInStmt = sqli
19040 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61 67 65 72  teMalloc( pPager
19050 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20 31 20 29  ->dbSize/8 + 1 )
19060 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  ;.  if( pPager->
19070 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b 0a 20 20  aInStmt==0 ){.  
19080 20 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28    sqlite3OsLock(
19090 26 70 50 61 67 65 72 2d 3e 66 64 2c 20 53 48 41  &pPager->fd, SHA
190a0 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 72  RED_LOCK);.    r
190b0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f 4d  eturn SQLITE_NOM
190c0 45 4d 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20  EM;.  }.#ifndef 
190d0 4e 44 45 42 55 47 0a 20 20 72 63 20 3d 20 73 71  NDEBUG.  rc = sq
190e0 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28  lite3OsFileSize(
190f0 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 26 70  &pPager->jfd, &p
19100 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65  Pager->stmtJSize
19110 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 67 6f  );.  if( rc ) go
19120 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61  to stmt_begin_fa
19130 69 6c 65 64 3b 0a 20 20 61 73 73 65 72 74 28 20  iled;.  assert( 
19140 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69 7a  pPager->stmtJSiz
19150 65 20 3d 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75  e == pPager->jou
19160 72 6e 61 6c 4f 66 66 20 29 3b 0a 23 65 6e 64 69  rnalOff );.#endi
19170 66 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  f.  pPager->stmt
19180 4a 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  JSize = pPager->
19190 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70 50  journalOff;.  pP
191a0 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
191b0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b   pPager->dbSize;
191c0 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48  .  pPager->stmtH
191d0 64 72 4f 66 66 20 3d 20 30 3b 0a 20 20 70 50 61  drOff = 0;.  pPa
191e0 67 65 72 2d 3e 73 74 6d 74 43 6b 73 75 6d 20 3d  ger->stmtCksum =
191f0 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e   pPager->cksumIn
19200 69 74 3b 0a 20 20 69 66 28 20 21 70 50 61 67 65  it;.  if( !pPage
19210 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 29 7b 0a 20  r->stmtOpen ){. 
19220 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 70     rc = sqlite3p
19230 61 67 65 72 5f 6f 70 65 6e 74 65 6d 70 28 7a 54  ager_opentemp(zT
19240 65 6d 70 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  emp, &pPager->st
19250 66 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  fd);.    if( rc 
19260 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69  ) goto stmt_begi
19270 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50  n_failed;.    pP
19280 61 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d  ager->stmtOpen =
19290 20 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   1;.    pPager->
192a0 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20  stmtNRec = 0;.  
192b0 7d 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  }.  pPager->stmt
192c0 49 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74  InUse = 1;.  ret
192d0 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  urn SQLITE_OK;. 
192e0 0a 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c  .stmt_begin_fail
192f0 65 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72  ed:.  if( pPager
19300 2d 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20  ->aInStmt ){.   
19310 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
19320 65 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20  er->aInStmt);.  
19330 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d    pPager->aInStm
19340 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  t = 0;.  }.  ret
19350 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
19360 20 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d   Commit a statem
19370 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
19380 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 63 6f  te3pager_stmt_co
19390 6d 6d 69 74 28 50 61 67 65 72 20 2a 70 50 61 67  mmit(Pager *pPag
193a0 65 72 29 7b 0a 20 20 69 66 28 20 70 50 61 67 65  er){.  if( pPage
193b0 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
193c0 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 2c 20      PgHdr *pPg, 
193d0 2a 70 4e 65 78 74 3b 0a 20 20 20 20 54 52 41 43  *pNext;.    TRAC
193e0 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49 54 20  E2("STMT-COMMIT 
193f0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
19400 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28  Pager));.    if(
19410 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20   !MEMDB ){.     
19420 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 26   sqlite3OsSeek(&
19430 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29  pPager->stfd, 0)
19440 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  ;.      /* sqlit
19450 65 33 4f 73 54 72 75 6e 63 61 74 65 28 26 70 50  e3OsTruncate(&pP
19460 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
19470 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
19480 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
19490 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
194a0 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
194b0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72  0;.    }.    for
194c0 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 53 74  (pPg=pPager->pSt
194d0 6d 74 3b 20 70 50 67 3b 20 70 50 67 3d 70 4e 65  mt; pPg; pPg=pNe
194e0 78 74 29 7b 0a 20 20 20 20 20 20 70 4e 65 78 74  xt){.      pNext
194f0 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 53 74 6d   = pPg->pNextStm
19500 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
19510 20 70 50 67 2d 3e 69 6e 53 74 6d 74 20 29 3b 0a   pPg->inStmt );.
19520 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 53 74 6d        pPg->inStm
19530 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67  t = 0;.      pPg
19540 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 50  ->pPrevStmt = pP
19550 67 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  g->pNextStmt = 0
19560 3b 0a 20 20 20 20 20 20 69 66 28 20 4d 45 4d 44  ;.      if( MEMD
19570 42 20 29 7b 0a 20 20 20 20 20 20 20 20 50 67 48  B ){.        PgH
19580 69 73 74 6f 72 79 20 2a 70 48 69 73 74 20 3d 20  istory *pHist = 
19590 50 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50  PGHDR_TO_HIST(pP
195a0 67 2c 20 70 50 61 67 65 72 29 3b 0a 20 20 20 20  g, pPager);.    
195b0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
195c0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
195d0 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70 53 74        pHist->pSt
195e0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  mt = 0;.      }.
195f0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
19600 2d 3e 73 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a  ->stmtNRec = 0;.
19610 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74      pPager->stmt
19620 49 6e 55 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  InUse = 0;.    p
19630 50 61 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30  Pager->pStmt = 0
19640 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e  ;.  }.  pPager->
19650 73 74 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 30  stmtAutoopen = 0
19660 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
19670 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  E_OK;.}../*.** R
19680 6f 6c 6c 62 61 63 6b 20 61 20 73 74 61 74 65 6d  ollback a statem
19690 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ent..*/.int sqli
196a0 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f 72 6f  te3pager_stmt_ro
196b0 6c 6c 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50  llback(Pager *pP
196c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
196d0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
196e0 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20  tmtInUse ){.    
196f0 54 52 41 43 45 32 28 22 53 54 4d 54 2d 52 4f 4c  TRACE2("STMT-ROL
19700 4c 42 41 43 4b 20 25 64 5c 6e 22 2c 20 50 41 47  LBACK %d\n", PAG
19710 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
19720 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a     if( MEMDB ){.
19730 20 20 20 20 20 20 50 67 48 64 72 20 2a 70 50 67        PgHdr *pPg
19740 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67 3d  ;.      for(pPg=
19750 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20 70  pPager->pStmt; p
19760 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65  Pg; pPg=pPg->pNe
19770 78 74 53 74 6d 74 29 7b 0a 20 20 20 20 20 20 20  xtStmt){.       
19780 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
19790 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
197a0 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
197b0 20 20 20 20 20 20 20 20 69 66 28 20 70 48 69 73          if( pHis
197c0 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  t->pStmt ){.    
197d0 20 20 20 20 20 20 6d 65 6d 63 70 79 28 50 47 48        memcpy(PGH
197e0 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
197f0 20 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 70   pHist->pStmt, p
19800 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29  Pager->pageSize)
19810 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
19820 74 65 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53  teFree(pHist->pS
19830 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  tmt);.          
19840 70 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 30  pHist->pStmt = 0
19850 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
19860 20 20 7d 0a 20 20 20 20 20 20 70 50 61 67 65 72    }.      pPager
19870 2d 3e 64 62 53 69 7a 65 20 3d 20 70 50 61 67 65  ->dbSize = pPage
19880 72 2d 3e 73 74 6d 74 53 69 7a 65 3b 0a 20 20 20  r->stmtSize;.   
19890 20 20 20 6d 65 6d 6f 72 79 54 72 75 6e 63 61 74     memoryTruncat
198a0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  e(pPager);.     
198b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
198c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
198d0 20 20 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d    rc = pager_stm
198e0 74 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65  t_playback(pPage
198f0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  r);.    }.    sq
19900 6c 69 74 65 33 70 61 67 65 72 5f 73 74 6d 74 5f  lite3pager_stmt_
19910 63 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a  commit(pPager);.
19920 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20    }else{.    rc 
19930 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d  = SQLITE_OK;.  }
19940 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 41  .  pPager->stmtA
19950 75 74 6f 6f 70 65 6e 20 3d 20 30 3b 0a 20 20 72  utoopen = 0;.  r
19960 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
19970 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 66 75  ** Return the fu
19980 6c 6c 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74  ll pathname of t
19990 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
199a0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
199b0 2a 73 71 6c 69 74 65 33 70 61 67 65 72 5f 66 69  *sqlite3pager_fi
199c0 6c 65 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  lename(Pager *pP
199d0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
199e0 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d  pPager->zFilenam
199f0 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  e;.}../*.** Retu
19a00 72 6e 20 74 68 65 20 64 69 72 65 63 74 6f 72 79  rn the directory
19a10 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
19a20 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73 74 20   file..*/.const 
19a30 63 68 61 72 20 2a 73 71 6c 69 74 65 33 70 61 67  char *sqlite3pag
19a40 65 72 5f 64 69 72 6e 61 6d 65 28 50 61 67 65 72  er_dirname(Pager
19a50 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65 74   *pPager){.  ret
19a60 75 72 6e 20 70 50 61 67 65 72 2d 3e 7a 44 69 72  urn pPager->zDir
19a70 65 63 74 6f 72 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ectory;.}../*.**
19a80 20 52 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c   Return the full
19a90 20 70 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65   pathname of the
19aa0 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 2a   journal file..*
19ab0 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71  /.const char *sq
19ac0 6c 69 74 65 33 70 61 67 65 72 5f 6a 6f 75 72 6e  lite3pager_journ
19ad0 61 6c 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50  alname(Pager *pP
19ae0 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  ager){.  return 
19af0 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
19b00 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
19b10 68 65 20 63 6f 64 65 63 20 66 6f 72 20 74 68 69  he codec for thi
19b20 73 20 70 61 67 65 72 0a 2a 2f 0a 76 6f 69 64 20  s pager.*/.void 
19b30 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 65 74  sqlite3pager_set
19b40 5f 63 6f 64 65 63 28 0a 20 20 50 61 67 65 72 20  _codec(.  Pager 
19b50 2a 70 50 61 67 65 72 2c 0a 20 20 76 6f 69 64 20  *pPager,.  void 
19b60 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a 2c  (*xCodec)(void*,
19b70 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29 2c  void*,Pgno,int),
19b80 0a 20 20 76 6f 69 64 20 2a 70 43 6f 64 65 63 41  .  void *pCodecA
19b90 72 67 0a 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  rg.){.  pPager->
19ba0 78 43 6f 64 65 63 20 3d 20 78 43 6f 64 65 63 3b  xCodec = xCodec;
19bb0 0a 20 20 70 50 61 67 65 72 2d 3e 70 43 6f 64 65  .  pPager->pCode
19bc0 63 41 72 67 20 3d 20 70 43 6f 64 65 63 41 72 67  cArg = pCodecArg
19bd0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
19be0 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65  routine is calle
19bf0 64 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74  d to increment t
19c00 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
19c10 20 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c   change-counter,
19c20 0a 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79  .** stored at by
19c30 74 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67  te 24 of the pag
19c40 65 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  er file..*/.stat
19c50 69 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63  ic int pager_inc
19c60 72 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28  r_changecounter(
19c70 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
19c80 20 20 76 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20    void *pPage;. 
19c90 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
19ca0 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
19cb0 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
19cc0 0a 20 20 2f 2a 20 4f 70 65 6e 20 70 61 67 65 20  .  /* Open page 
19cd0 31 20 6f 66 20 74 68 65 20 66 69 6c 65 20 66 6f  1 of the file fo
19ce0 72 20 77 72 69 74 69 6e 67 2e 20 2a 2f 0a 20 20  r writing. */.  
19cf0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
19d00 72 5f 67 65 74 28 70 50 61 67 65 72 2c 20 31 2c  r_get(pPager, 1,
19d10 20 26 70 50 61 67 65 29 3b 0a 20 20 69 66 28 20   &pPage);.  if( 
19d20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
19d30 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 72 63 20  return rc;.  rc 
19d40 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 77  = sqlite3pager_w
19d50 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20 69  rite(pPage);.  i
19d60 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
19d70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20   ) return rc;.. 
19d80 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
19d90 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
19da0 74 65 20 32 34 2e 20 2a 2f 0a 20 20 70 50 67 48  te 24. */.  pPgH
19db0 64 72 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48  dr = DATA_TO_PGH
19dc0 44 52 28 70 50 61 67 65 29 3b 0a 20 20 63 68 61  DR(pPage);.  cha
19dd0 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72 65  nge_counter = re
19de0 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50 67  trieve32bits(pPg
19df0 48 64 72 2c 20 32 34 29 3b 0a 0a 20 20 2f 2a 20  Hdr, 24);..  /* 
19e00 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 76 61  Increment the va
19e10 6c 75 65 20 6a 75 73 74 20 72 65 61 64 20 61 6e  lue just read an
19e20 64 20 77 72 69 74 65 20 69 74 20 62 61 63 6b 20  d write it back 
19e30 74 6f 20 62 79 74 65 20 32 34 2e 20 2a 2f 0a 20  to byte 24. */. 
19e40 20 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2b   change_counter+
19e50 2b 3b 0a 20 20 73 74 6f 72 65 33 32 62 69 74 73  +;.  store32bits
19e60 28 63 68 61 6e 67 65 5f 63 6f 75 6e 74 65 72 2c  (change_counter,
19e70 20 70 50 67 48 64 72 2c 20 32 34 29 3b 0a 0a 20   pPgHdr, 24);.. 
19e80 20 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20   /* Release the 
19e90 70 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20  page reference. 
19ea0 2a 2f 0a 20 20 73 71 6c 69 74 65 33 70 61 67 65  */.  sqlite3page
19eb0 72 5f 75 6e 72 65 66 28 70 50 61 67 65 29 3b 0a  r_unref(pPage);.
19ec0 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
19ed0 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
19ee0 63 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  c the database f
19ef0 69 6c 65 20 66 6f 72 20 74 68 65 20 70 61 67 65  ile for the page
19f00 72 20 70 50 61 67 65 72 2e 20 7a 4d 61 73 74 65  r pPager. zMaste
19f10 72 20 70 6f 69 6e 74 73 20 74 6f 20 74 68 65 20  r points to the 
19f20 6e 61 6d 65 0a 2a 2a 20 6f 66 20 61 20 6d 61 73  name.** of a mas
19f30 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
19f40 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
19f50 77 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65  written into the
19f60 20 69 6e 64 69 76 69 64 75 61 6c 0a 2a 2a 20 6a   individual.** j
19f70 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 7a 4d 61  ournal file. zMa
19f80 73 74 65 72 20 6d 61 79 20 62 65 20 4e 55 4c 4c  ster may be NULL
19f90 2c 20 77 68 69 63 68 20 69 73 20 69 6e 74 65 72  , which is inter
19fa0 70 72 65 74 65 64 20 61 73 20 6e 6f 20 6d 61 73  preted as no mas
19fb0 74 65 72 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 28  ter.** journal (
19fc0 61 20 73 69 6e 67 6c 65 20 64 61 74 61 62 61 73  a single databas
19fd0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 29 2e 0a  e transaction)..
19fe0 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19ff0 6e 65 20 65 6e 73 75 72 65 73 20 74 68 61 74 20  ne ensures that 
1a000 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 73  the journal is s
1a010 79 6e 63 65 64 2c 20 61 6c 6c 20 64 69 72 74 79  ynced, all dirty
1a020 20 70 61 67 65 73 20 77 72 69 74 74 65 6e 0a 2a   pages written.*
1a030 2a 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73  * to the databas
1a040 65 20 66 69 6c 65 20 61 6e 64 20 74 68 65 20 64  e file and the d
1a050 61 74 61 62 61 73 65 20 66 69 6c 65 20 73 79 6e  atabase file syn
1a060 63 65 64 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68  ced. The only th
1a070 69 6e 67 20 74 68 61 74 0a 2a 2a 20 72 65 6d 61  ing that.** rema
1a080 69 6e 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68  ins to commit th
1a090 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
1a0a0 20 74 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6a   to delete the j
1a0b0 6f 75 72 6e 61 6c 20 66 69 6c 65 20 28 6f 72 0a  ournal file (or.
1a0c0 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  ** master journa
1a0d0 6c 20 66 69 6c 65 20 69 66 20 73 70 65 63 69 66  l file if specif
1a0e0 69 65 64 29 2e 0a 2a 2a 0a 2a 2a 20 4e 6f 74 65  ied)..**.** Note
1a0f0 20 74 68 61 74 20 69 66 20 7a 4d 61 73 74 65 72   that if zMaster
1a100 3d 3d 4e 55 4c 4c 2c 20 74 68 69 73 20 64 6f 65  ==NULL, this doe
1a110 73 20 6e 6f 74 20 6f 76 65 72 77 72 69 74 65 20  s not overwrite 
1a120 61 20 70 72 65 76 69 6f 75 73 20 76 61 6c 75 65  a previous value
1a130 0a 2a 2a 20 70 61 73 73 65 64 20 74 6f 20 61 6e  .** passed to an
1a140 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f 73 79   sqlite3pager_sy
1a150 6e 63 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a  nc() call..**.**
1a160 20 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54   If parameter nT
1a170 72 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  runc is non-zero
1a180 2c 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72  , then the pager
1a190 20 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74   file is truncat
1a1a0 65 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20  ed to.** nTrunc 
1a1b0 70 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75  pages (this is u
1a1c0 73 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75  sed by auto-vacu
1a1d0 75 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a  um databases)..*
1a1e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61 67  /.int sqlite3pag
1a1f0 65 72 5f 73 79 6e 63 28 50 61 67 65 72 20 2a 70  er_sync(Pager *p
1a200 50 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61  Pager, const cha
1a210 72 20 2a 7a 4d 61 73 74 65 72 2c 20 50 67 6e 6f  r *zMaster, Pgno
1a220 20 6e 54 72 75 6e 63 29 7b 0a 20 20 69 6e 74 20   nTrunc){.  int 
1a230 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
1a240 0a 20 20 54 52 41 43 45 34 28 22 44 41 54 41 42  .  TRACE4("DATAB
1a250 41 53 45 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25  ASE SYNC: File=%
1a260 73 20 7a 4d 61 73 74 65 72 3d 25 73 20 6e 54 72  s zMaster=%s nTr
1a270 75 6e 63 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20  unc=%d\n", .    
1a280 20 20 70 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e    pPager->zFilen
1a290 61 6d 65 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54  ame, zMaster, nT
1a2a0 72 75 6e 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20  runc);..  /* If 
1a2b0 74 68 69 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65  this is an in-me
1a2c0 6d 6f 72 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70  mory db, or no p
1a2d0 61 67 65 73 20 68 61 76 65 20 62 65 65 6e 20 77  ages have been w
1a2e0 72 69 74 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68  ritten to, or th
1a2f0 69 73 0a 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e  is.  ** function
1a300 20 68 61 73 20 61 6c 72 65 61 64 79 20 62 65 65   has already bee
1a310 6e 20 63 61 6c 6c 65 64 2c 20 69 74 20 69 73 20  n called, it is 
1a320 61 20 6e 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20  a no-op..  */.  
1a330 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
1a340 65 21 3d 50 41 47 45 52 5f 53 59 4e 43 45 44 20  e!=PAGER_SYNCED 
1a350 26 26 20 21 4d 45 4d 44 42 20 26 26 20 70 50 61  && !MEMDB && pPa
1a360 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1a370 29 7b 0a 20 20 20 20 50 67 48 64 72 20 2a 70 50  ){.    PgHdr *pP
1a380 67 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  g;.    assert( p
1a390 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
1a3a0 65 6e 20 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66  en );..    /* If
1a3b0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
1a3c0 6c 20 66 69 6c 65 20 6e 61 6d 65 20 68 61 73 20  l file name has 
1a3d0 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1a3e0 74 74 65 6e 20 74 6f 20 74 68 65 0a 20 20 20 20  tten to the.    
1a3f0 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c  ** journal file,
1a400 20 74 68 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73   then no sync is
1a410 20 72 65 71 75 69 72 65 64 2e 20 54 68 69 73 20   required. This 
1a420 68 61 70 70 65 6e 73 20 77 68 65 6e 20 69 74 20  happens when it 
1a430 69 73 0a 20 20 20 20 2a 2a 20 77 72 69 74 74 65  is.    ** writte
1a440 6e 2c 20 74 68 65 6e 20 74 68 65 20 70 72 6f 63  n, then the proc
1a450 65 73 73 20 66 61 69 6c 73 20 74 6f 20 75 70 67  ess fails to upg
1a460 72 61 64 65 20 66 72 6f 6d 20 61 20 52 45 53 45  rade from a RESE
1a470 52 56 45 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a  RVED to an.    *
1a480 2a 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b  * EXCLUSIVE lock
1a490 2e 20 54 68 65 20 6e 65 78 74 20 74 69 6d 65 20  . The next time 
1a4a0 74 68 65 20 70 72 6f 63 65 73 73 20 74 72 69 65  the process trie
1a4b0 73 20 74 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a  s to commit the.
1a4c0 20 20 20 20 2a 2a 20 74 72 61 6e 73 61 63 74 69      ** transacti
1a4d0 6f 6e 20 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20  on the m-j name 
1a4e0 77 69 6c 6c 20 68 61 76 65 20 61 6c 72 65 61 64  will have alread
1a4f0 79 20 62 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a  y been written..
1a500 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 21      */.    if( !
1a510 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65  pPager->setMaste
1a520 72 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  r ){.      rc = 
1a530 70 61 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67  pager_incr_chang
1a540 65 63 6f 75 6e 74 65 72 28 70 50 61 67 65 72 29  ecounter(pPager)
1a550 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
1a560 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f  SQLITE_OK ) goto
1a570 20 73 79 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e   sync_exit;.#ifn
1a580 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1a590 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 20  AUTOVACUUM.     
1a5a0 20 69 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29   if( nTrunc!=0 )
1a5b0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  {.        /* If 
1a5c0 74 68 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e  this transaction
1a5d0 20 68 61 73 20 6d 61 64 65 20 74 68 65 20 64 61   has made the da
1a5e0 74 61 62 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20  tabase smaller, 
1a5f0 74 68 65 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20  then all pages. 
1a600 20 20 20 20 20 20 20 2a 2a 20 62 65 69 6e 67 20         ** being 
1a610 64 69 73 63 61 72 64 65 64 20 62 79 20 74 68 65  discarded by the
1a620 20 74 72 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74   truncation must
1a630 20 62 65 20 77 72 69 74 74 65 6e 20 74 6f 20 74   be written to t
1a640 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20  he journal.     
1a650 20 20 20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20     ** file..    
1a660 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 50      */.        P
1a670 67 6e 6f 20 69 3b 0a 20 20 20 20 20 20 20 20 76  gno i;.        v
1a680 6f 69 64 20 2a 70 50 61 67 65 3b 0a 20 20 20 20  oid *pPage;.    
1a690 20 20 20 20 66 6f 72 28 20 69 3d 6e 54 72 75 6e      for( i=nTrun
1a6a0 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65 72 2d 3e  c+1; i<=pPager->
1a6b0 6f 72 69 67 44 62 53 69 7a 65 3b 20 69 2b 2b 20  origDbSize; i++ 
1a6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1a6d0 20 21 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f   !(pPager->aInJo
1a6e0 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20 28 31 3c  urnal[i/8] & (1<
1a6f0 3c 28 69 26 37 29 29 29 20 29 7b 0a 20 20 20 20  <(i&7))) ){.    
1a700 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
1a710 69 74 65 33 70 61 67 65 72 5f 67 65 74 28 70 50  ite3pager_get(pP
1a720 61 67 65 72 2c 20 69 2c 20 26 70 50 61 67 65 29  ager, i, &pPage)
1a730 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
1a740 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a750 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1a760 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
1a770 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65 72 5f   = sqlite3pager_
1a780 77 72 69 74 65 28 70 50 61 67 65 29 3b 0a 20 20  write(pPage);.  
1a790 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1a7a0 33 70 61 67 65 72 5f 75 6e 72 65 66 28 70 50 61  3pager_unref(pPa
1a7b0 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1a7c0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a7d0 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1a7e0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xit;.          }
1a7f0 0a 20 20 20 20 20 20 20 20 7d 20 0a 20 20 20 20  .        } .    
1a800 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
1a810 20 72 63 20 3d 20 77 72 69 74 65 4d 61 73 74 65   rc = writeMaste
1a820 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65 72 2c  rJournal(pPager,
1a830 20 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 20   zMaster);.     
1a840 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1a850 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
1a860 78 69 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  xit;.      rc = 
1a870 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50 61 67  syncJournal(pPag
1a880 65 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  er);.      if( r
1a890 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
1a8a0 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20  oto sync_exit;. 
1a8b0 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51     }..#ifndef SQ
1a8c0 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
1a8d0 43 55 55 4d 0a 20 20 20 20 69 66 28 20 6e 54 72  CUUM.    if( nTr
1a8e0 75 6e 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  unc!=0 ){.      
1a8f0 72 63 20 3d 20 73 71 6c 69 74 65 33 70 61 67 65  rc = sqlite3page
1a900 72 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65  r_truncate(pPage
1a910 72 2c 20 6e 54 72 75 6e 63 29 3b 0a 20 20 20 20  r, nTrunc);.    
1a920 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1a930 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f  _OK ) goto sync_
1a940 65 78 69 74 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  exit;.    }.#end
1a950 69 66 0a 0a 20 20 20 20 2f 2a 20 57 72 69 74 65  if..    /* Write
1a960 20 61 6c 6c 20 64 69 72 74 79 20 70 61 67 65 73   all dirty pages
1a970 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
1a980 20 66 69 6c 65 20 2a 2f 0a 20 20 20 20 70 50 67   file */.    pPg
1a990 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 61 6c 6c   = pager_get_all
1a9a0 5f 64 69 72 74 79 5f 70 61 67 65 73 28 70 50 61  _dirty_pages(pPa
1a9b0 67 65 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 70  ger);.    rc = p
1a9c0 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65 6c  ager_write_pagel
1a9d0 69 73 74 28 70 50 67 29 3b 0a 20 20 20 20 69 66  ist(pPg);.    if
1a9e0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1a9f0 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65 78 69 74  ) goto sync_exit
1aa00 3b 0a 0a 20 20 20 20 2f 2a 20 53 79 6e 63 20 74  ;..    /* Sync t
1aa10 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
1aa20 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50  . */.    if( !pP
1aa30 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a  ager->noSync ){.
1aa40 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
1aa50 65 33 4f 73 53 79 6e 63 28 26 70 50 61 67 65 72  e3OsSync(&pPager
1aa60 2d 3e 66 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ->fd);.    }..  
1aa70 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20    pPager->state 
1aa80 3d 20 50 41 47 45 52 5f 53 59 4e 43 45 44 3b 0a  = PAGER_SYNCED;.
1aa90 20 20 7d 0a 0a 73 79 6e 63 5f 65 78 69 74 3a 0a    }..sync_exit:.
1aaa0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
1aab0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1aac0 4d 49 54 5f 41 55 54 4f 56 41 43 55 55 4d 0a 2f  MIT_AUTOVACUUM./
1aad0 2a 0a 2a 2a 20 4d 6f 76 65 20 74 68 65 20 70 61  *.** Move the pa
1aae0 67 65 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  ge identified by
1aaf0 20 70 44 61 74 61 20 74 6f 20 6c 6f 63 61 74 69   pData to locati
1ab00 6f 6e 20 70 67 6e 6f 20 69 6e 20 74 68 65 20 66  on pgno in the f
1ab10 69 6c 65 2e 20 0a 2a 2a 0a 2a 2a 20 54 68 65 72  ile. .**.** Ther
1ab20 65 20 6d 75 73 74 20 62 65 20 6e 6f 20 72 65 66  e must be no ref
1ab30 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 63  erences to the c
1ab40 75 72 72 65 6e 74 20 70 61 67 65 20 70 67 6e 6f  urrent page pgno
1ab50 2e 20 49 66 20 63 75 72 72 65 6e 74 20 70 61 67  . If current pag
1ab60 65 0a 2a 2a 20 70 67 6e 6f 20 69 73 20 6e 6f 74  e.** pgno is not
1ab70 20 61 6c 72 65 61 64 79 20 69 6e 20 74 68 65 20   already in the 
1ab80 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c  rollback journal
1ab90 2c 20 69 74 20 69 73 20 6e 6f 74 20 77 72 69 74  , it is not writ
1aba0 74 65 6e 20 74 68 65 72 65 20 62 79 0a 2a 2a 20  ten there by.** 
1abb0 62 79 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e  by this routine.
1abc0 20 54 68 65 20 73 61 6d 65 20 61 70 70 6c 69 65   The same applie
1abd0 73 20 74 6f 20 74 68 65 20 70 61 67 65 20 70 44  s to the page pD
1abe0 61 74 61 20 72 65 66 65 72 73 20 74 6f 20 6f 6e  ata refers to on
1abf0 20 65 6e 74 72 79 20 74 6f 0a 2a 2a 20 74 68 69   entry to.** thi
1ac00 73 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a  s routine..**.**
1ac10 20 52 65 66 65 72 65 6e 63 65 73 20 74 6f 20 74   References to t
1ac20 68 65 20 70 61 67 65 20 72 65 66 65 72 65 64 20  he page refered 
1ac30 74 6f 20 62 79 20 70 44 61 74 61 20 72 65 6d 61  to by pData rema
1ac40 69 6e 20 76 61 6c 69 64 2e 20 55 70 64 61 74 69  in valid. Updati
1ac50 6e 67 20 61 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64  ng any.** meta-d
1ac60 61 74 61 20 61 73 73 6f 63 69 61 74 65 64 20 77  ata associated w
1ac70 69 74 68 20 70 61 67 65 20 70 44 61 74 61 20 28  ith page pData (
1ac80 69 2e 65 2e 20 64 61 74 61 20 73 74 6f 72 65 64  i.e. data stored
1ac90 20 69 6e 20 74 68 65 20 6e 45 78 74 72 61 20 62   in the nExtra b
1aca0 79 74 65 73 0a 2a 2a 20 61 6c 6c 6f 63 61 74 65  ytes.** allocate
1acb0 64 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68 65  d along with the
1acc0 20 70 61 67 65 29 20 69 73 20 74 68 65 20 72 65   page) is the re
1acd0 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
1ace0 74 68 65 20 63 61 6c 6c 65 72 2e 0a 2a 2a 0a 2a  the caller..**.*
1acf0 2a 20 41 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * A transaction 
1ad00 6d 75 73 74 20 62 65 20 61 63 74 69 76 65 20 77  must be active w
1ad10 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65  hen this routine
1ad20 20 69 73 20 63 61 6c 6c 65 64 2c 20 68 6f 77 65   is called, howe
1ad30 76 65 72 20 69 74 20 69 73 20 0a 2a 2a 20 69 6c  ver it is .** il
1ad40 6c 65 67 61 6c 20 74 6f 20 63 61 6c 6c 20 74 68  legal to call th
1ad50 69 73 20 72 6f 75 74 69 6e 65 20 69 66 20 61 20  is routine if a 
1ad60 73 74 61 74 6d 65 6e 74 20 74 72 61 6e 73 61 63  statment transac
1ad70 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 2e 0a  tion is active..
1ad80 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 70 61  */.int sqlite3pa
1ad90 67 65 72 5f 6d 6f 76 65 70 61 67 65 28 50 61 67  ger_movepage(Pag
1ada0 65 72 20 2a 70 50 61 67 65 72 2c 20 76 6f 69 64  er *pPager, void
1adb0 20 2a 70 44 61 74 61 2c 20 50 67 6e 6f 20 70 67   *pData, Pgno pg
1adc0 6e 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50  no){.  PgHdr *pP
1add0 67 20 3d 20 44 41 54 41 5f 54 4f 5f 50 47 48 44  g = DATA_TO_PGHD
1ade0 52 28 70 44 61 74 61 29 3b 0a 20 20 50 67 48 64  R(pData);.  PgHd
1adf0 72 20 2a 70 50 67 4f 6c 64 3b 20 0a 20 20 69 6e  r *pPgOld; .  in
1ae00 74 20 68 3b 0a 20 20 50 67 6e 6f 20 6e 65 65 64  t h;.  Pgno need
1ae10 53 79 6e 63 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20  SyncPgno = 0;.. 
1ae20 20 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72   assert( !pPager
1ae30 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20  ->stmtInUse );. 
1ae40 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52   assert( pPg->nR
1ae50 65 66 3e 30 20 29 3b 0a 0a 20 20 54 52 41 43 45  ef>0 );..  TRACE
1ae60 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65 20  5("MOVE %d page 
1ae70 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64 29  %d (needSync=%d)
1ae80 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22 2c   moves to %d\n",
1ae90 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44 28   .      PAGERID(
1aea0 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67  pPager), pPg->pg
1aeb0 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  no, pPg->needSyn
1aec0 63 2c 20 70 67 6e 6f 29 3b 0a 0a 20 20 69 66 28  c, pgno);..  if(
1aed0 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 29   pPg->needSync )
1aee0 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e 63 50 67  {.    needSyncPg
1aef0 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a  no = pPg->pgno;.
1af00 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1af10 3e 69 6e 4a 6f 75 72 6e 61 6c 20 29 3b 0a 20 20  >inJournal );.  
1af20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e 64    assert( pPg->d
1af30 69 72 74 79 20 29 3b 0a 20 20 20 20 61 73 73 65  irty );.    asse
1af40 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64  rt( pPager->need
1af50 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a 20 20 2f  Sync );.  }..  /
1af60 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72 6f  * Unlink pPg fro
1af70 6d 20 69 74 27 73 20 68 61 73 68 2d 63 68 61 69  m it's hash-chai
1af80 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b 48 61 73  n */.  unlinkHas
1af90 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20 70  hChain(pPager, p
1afa0 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68  Pg);..  /* If th
1afb0 65 20 63 61 63 68 65 20 63 6f 6e 74 61 69 6e 73  e cache contains
1afc0 20 61 20 70 61 67 65 20 77 69 74 68 20 70 61 67   a page with pag
1afd0 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f 2c 20 72  e-number pgno, r
1afe0 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a 20 66 72  emove it.  ** fr
1aff0 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
1b000 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20 74 68 65  in. Also, if the
1b010 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63 20   PgHdr.needSync 
1b020 77 61 73 20 73 65 74 20 66 6f 72 20 0a 20 20 2a  was set for .  *
1b030 2a 20 70 61 67 65 20 70 67 6e 6f 20 62 65 66 6f  * page pgno befo
1b040 72 65 20 74 68 65 20 27 6d 6f 76 65 27 20 6f 70  re the 'move' op
1b050 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e 65 65 64  eration, it need
1b060 73 20 74 6f 20 62 65 20 72 65 74 61 69 6e 65 64  s to be retained
1b070 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68 65 20 70   .  ** for the p
1b080 61 67 65 20 6d 6f 76 65 64 20 74 68 65 72 65 2e  age moved there.
1b090 0a 20 20 2a 2f 0a 20 20 70 50 67 4f 6c 64 20 3d  .  */.  pPgOld =
1b0a0 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50   pager_lookup(pP
1b0b0 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69  ager, pgno);.  i
1b0c0 66 28 20 70 50 67 4f 6c 64 20 29 7b 0a 20 20 20  f( pPgOld ){.   
1b0d0 20 61 73 73 65 72 74 28 20 70 50 67 4f 6c 64 2d   assert( pPgOld-
1b0e0 3e 6e 52 65 66 3d 3d 30 20 29 3b 0a 20 20 20 20  >nRef==0 );.    
1b0f0 75 6e 6c 69 6e 6b 48 61 73 68 43 68 61 69 6e 28  unlinkHashChain(
1b100 70 50 61 67 65 72 2c 20 70 50 67 4f 6c 64 29 3b  pPager, pPgOld);
1b110 0a 20 20 20 20 70 50 67 4f 6c 64 2d 3e 64 69 72  .    pPgOld->dir
1b120 74 79 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  ty = 0;.    if( 
1b130 70 50 67 4f 6c 64 2d 3e 6e 65 65 64 53 79 6e 63  pPgOld->needSync
1b140 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
1b150 28 20 70 50 67 4f 6c 64 2d 3e 69 6e 4a 6f 75 72  ( pPgOld->inJour
1b160 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 70 50 67  nal );.      pPg
1b170 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 31 3b  ->inJournal = 1;
1b180 0a 20 20 20 20 20 20 70 50 67 2d 3e 6e 65 65 64  .      pPg->need
1b190 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1b1a0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b1b0 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20 20  needSync );.    
1b1c0 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e  }.  }..  /* Chan
1b1d0 67 65 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62  ge the page numb
1b1e0 65 72 20 66 6f 72 20 70 50 67 20 61 6e 64 20 69  er for pPg and i
1b1f0 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68  nsert it into th
1b200 65 20 6e 65 77 20 68 61 73 68 2d 63 68 61 69 6e  e new hash-chain
1b210 2e 20 2a 2f 0a 20 20 70 50 67 2d 3e 70 67 6e 6f  . */.  pPg->pgno
1b220 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d 20 70   = pgno;.  h = p
1b230 61 67 65 72 5f 68 61 73 68 28 70 67 6e 6f 29 3b  ager_hash(pgno);
1b240 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 61  .  if( pPager->a
1b250 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20 20 61  Hash[h] ){.    a
1b260 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 61  ssert( pPager->a
1b270 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
1b280 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 70 50 61  sh==0 );.    pPa
1b290 67 65 72 2d 3e 61 48 61 73 68 5b 68 5d 2d 3e 70  ger->aHash[h]->p
1b2a0 50 72 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a  PrevHash = pPg;.
1b2b0 20 20 7d 0a 20 20 70 50 67 2d 3e 70 4e 65 78 74    }.  pPg->pNext
1b2c0 48 61 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61  Hash = pPager->a
1b2d0 48 61 73 68 5b 68 5d 3b 0a 20 20 70 50 61 67 65  Hash[h];.  pPage
1b2e0 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1b2f0 67 3b 0a 20 20 70 50 67 2d 3e 70 50 72 65 76 48  g;.  pPg->pPrevH
1b300 61 73 68 20 3d 20 30 3b 0a 0a 20 20 70 50 67 2d  ash = 0;..  pPg-
1b310 3e 64 69 72 74 79 20 3d 20 31 3b 0a 20 20 70 50  >dirty = 1;.  pP
1b320 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65  ager->dirtyCache
1b330 20 3d 20 31 3b 0a 0a 20 20 69 66 28 20 6e 65 65   = 1;..  if( nee
1b340 64 53 79 6e 63 50 67 6e 6f 20 29 7b 0a 20 20 20  dSyncPgno ){.   
1b350 20 2f 2a 20 49 66 20 6e 65 65 64 53 79 6e 63 50   /* If needSyncP
1b360 67 6e 6f 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  gno is non-zero,
1b370 20 74 68 65 6e 20 74 68 65 20 6a 6f 75 72 6e 61   then the journa
1b380 6c 20 66 69 6c 65 20 6e 65 65 64 73 20 74 6f 20  l file needs to 
1b390 62 65 20 0a 20 20 20 20 2a 2a 20 73 79 6e 63 28  be .    ** sync(
1b3a0 29 65 64 20 62 65 66 6f 72 65 20 61 6e 79 20 64  )ed before any d
1b3b0 61 74 61 20 69 73 20 77 72 69 74 74 65 6e 20 74  ata is written t
1b3c0 6f 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  o database file 
1b3d0 70 61 67 65 20 6e 65 65 64 53 79 6e 63 50 67 6e  page needSyncPgn
1b3e0 6f 2e 0a 20 20 20 20 2a 2a 20 43 75 72 72 65 6e  o..    ** Curren
1b3f0 74 6c 79 2c 20 6e 6f 20 73 75 63 68 20 70 61 67  tly, no such pag
1b400 65 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20  e exists in the 
1b410 70 61 67 65 2d 63 61 63 68 65 20 61 6e 64 20 74  page-cache and t
1b420 68 65 20 0a 20 20 20 20 2a 2a 20 50 61 67 65 72  he .    ** Pager
1b430 2e 61 49 6e 4a 6f 75 72 6e 61 6c 20 62 69 74 20  .aInJournal bit 
1b440 68 61 73 20 62 65 65 6e 20 73 65 74 2e 20 54 68  has been set. Th
1b450 69 73 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72  is needs to be r
1b460 65 6d 65 64 69 65 64 20 62 79 20 6c 6f 61 64 69  emedied by loadi
1b470 6e 67 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 61  ng.    ** the pa
1b480 67 65 20 69 6e 74 6f 20 74 68 65 20 70 61 67 65  ge into the page
1b490 72 2d 63 61 63 68 65 20 61 6e 64 20 73 65 74 74  r-cache and sett
1b4a0 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e 65  ing the PgHdr.ne
1b4b0 65 64 53 79 6e 63 20 66 6c 61 67 2e 0a 20 20 20  edSync flag..   
1b4c0 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 73   **.    ** The s
1b4d0 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1b4e0 29 20 63 61 6c 6c 20 6d 61 79 20 63 61 75 73 65  ) call may cause
1b4f0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20   the journal to 
1b500 73 79 6e 63 2e 20 53 6f 20 6d 61 6b 65 0a 20 20  sync. So make.  
1b510 20 20 2a 2a 20 73 75 72 65 20 74 68 65 20 50 61    ** sure the Pa
1b520 67 65 72 2e 6e 65 65 64 53 79 6e 63 20 66 6c 61  ger.needSync fla
1b530 67 20 69 73 20 73 65 74 20 74 6f 6f 2e 0a 20 20  g is set too..  
1b540 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 72 63 3b    */.    int rc;
1b550 0a 20 20 20 20 76 6f 69 64 20 2a 70 4e 65 65 64  .    void *pNeed
1b560 53 79 6e 63 3b 0a 20 20 20 20 61 73 73 65 72 74  Sync;.    assert
1b570 28 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79  ( pPager->needSy
1b580 6e 63 20 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  nc );.    rc = s
1b590 71 6c 69 74 65 33 70 61 67 65 72 5f 67 65 74 28  qlite3pager_get(
1b5a0 70 50 61 67 65 72 2c 20 6e 65 65 64 53 79 6e 63  pPager, needSync
1b5b0 50 67 6e 6f 2c 20 26 70 4e 65 65 64 53 79 6e 63  Pgno, &pNeedSync
1b5c0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1b5d0 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
1b5e0 6e 20 72 63 3b 0a 20 20 20 20 70 50 61 67 65 72  n rc;.    pPager
1b5f0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a  ->needSync = 1;.
1b600 20 20 20 20 44 41 54 41 5f 54 4f 5f 50 47 48 44      DATA_TO_PGHD
1b610 52 28 70 4e 65 65 64 53 79 6e 63 29 2d 3e 6e 65  R(pNeedSync)->ne
1b620 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20  edSync = 1;.    
1b630 44 41 54 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e  DATA_TO_PGHDR(pN
1b640 65 65 64 53 79 6e 63 29 2d 3e 69 6e 4a 6f 75 72  eedSync)->inJour
1b650 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20 44 41 54  nal = 1;.    DAT
1b660 41 5f 54 4f 5f 50 47 48 44 52 28 70 4e 65 65 64  A_TO_PGHDR(pNeed
1b670 53 79 6e 63 29 2d 3e 64 69 72 74 79 20 3d 20 31  Sync)->dirty = 1
1b680 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 70 61 67  ;.    sqlite3pag
1b690 65 72 5f 75 6e 72 65 66 28 70 4e 65 65 64 53 79  er_unref(pNeedSy
1b6a0 6e 63 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75  nc);.  }..  retu
1b6b0 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b6c0 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
1b6d0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
1b6e0 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 53 51 4c  ) || defined(SQL
1b6f0 49 54 45 5f 54 45 53 54 29 0a 2f 2a 0a 2a 2a 20  ITE_TEST)./*.** 
1b700 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1b710 6e 74 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  nt state of the 
1b720 66 69 6c 65 20 6c 6f 63 6b 20 66 6f 72 20 74 68  file lock for th
1b730 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
1b740 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
1b750 75 65 20 69 73 20 6f 6e 65 20 6f 66 20 4e 4f 5f  ue is one of NO_
1b760 4c 4f 43 4b 2c 20 53 48 41 52 45 44 5f 4c 4f 43  LOCK, SHARED_LOC
1b770 4b 2c 20 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b  K, RESERVED_LOCK
1b780 2c 0a 2a 2a 20 50 45 4e 44 49 4e 47 5f 4c 4f 43  ,.** PENDING_LOC
1b790 4b 2c 20 6f 72 20 45 58 43 4c 55 53 49 56 45 5f  K, or EXCLUSIVE_
1b7a0 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  LOCK..*/.int sql
1b7b0 69 74 65 33 70 61 67 65 72 5f 6c 6f 63 6b 73 74  ite3pager_lockst
1b7c0 61 74 65 28 50 61 67 65 72 20 2a 70 50 61 67 65  ate(Pager *pPage
1b7d0 72 29 7b 0a 23 69 66 64 65 66 20 4f 53 5f 54 45  r){.#ifdef OS_TE
1b7e0 53 54 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ST.  return pPag
1b7f0 65 72 2d 3e 66 64 2d 3e 66 64 2e 6c 6f 63 6b 74  er->fd->fd.lockt
1b800 79 70 65 3b 0a 23 65 6c 73 65 0a 20 20 72 65 74  ype;.#else.  ret
1b810 75 72 6e 20 70 50 61 67 65 72 2d 3e 66 64 2e 6c  urn pPager->fd.l
1b820 6f 63 6b 74 79 70 65 3b 0a 23 65 6e 64 69 66 0a  ocktype;.#endif.
1b830 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66  }.#endif..#ifdef
1b840 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f 2a   SQLITE_DEBUG./*
1b850 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73 74  .** Print a list
1b860 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65 72  ing of all refer
1b870 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64 20  enced pages and 
1b880 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74 2e  their ref count.
1b890 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
1b8a0 70 61 67 65 72 5f 72 65 66 64 75 6d 70 28 50 61  pager_refdump(Pa
1b8b0 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
1b8c0 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
1b8d0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
1b8e0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
1b8f0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
1b900 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
1b910 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1b920 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
1b930 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
1b940 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
1b950 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
1b960 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
1b970 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
1b980 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
1b990 69 66 0a                                         if.