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

Artifact 43e9bffb0ea6a76e06537790323c4a3e3a3a51cc:


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 33 34  : pager.c,v 1.34
0350: 39 20 32 30 30 37 2f 30 36 2f 32 36 20 32 32 3a  9 2007/06/26 22:
0360: 31 30 3a 31 32 20 64 72 68 20 45 78 70 20 24 0a  10:12 drh Exp $.
0370: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
0380: 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 0a 23 69  E_OMIT_DISKIO.#i
0390: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
03a0: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 6f  t.h".#include "o
03b0: 73 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 22 70  s.h".#include "p
03c0: 61 67 65 72 2e 68 22 0a 23 69 6e 63 6c 75 64 65  ager.h".#include
03d0: 20 3c 61 73 73 65 72 74 2e 68 3e 0a 23 69 6e 63   <assert.h>.#inc
03e0: 6c 75 64 65 20 3c 73 74 72 69 6e 67 2e 68 3e 0a  lude <string.h>.
03f0: 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f  ./*.** Macros fo
0400: 72 20 74 72 6f 75 62 6c 65 73 68 6f 6f 74 69 6e  r troubleshootin
0410: 67 2e 20 20 4e 6f 72 6d 61 6c 6c 79 20 74 75 72  g.  Normally tur
0420: 6e 65 64 20 6f 66 66 0a 2a 2f 0a 23 69 66 20 30  ned off.*/.#if 0
0430: 0a 23 64 65 66 69 6e 65 20 73 71 6c 69 74 65 33  .#define sqlite3
0440: 44 65 62 75 67 50 72 69 6e 74 66 20 70 72 69 6e  DebugPrintf prin
0450: 74 66 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52  tf.#define PAGER
0460: 54 52 41 43 45 31 28 58 29 20 20 20 20 20 20 20  TRACE1(X)       
0470: 73 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e  sqlite3DebugPrin
0480: 74 66 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41  tf(X).#define PA
0490: 47 45 52 54 52 41 43 45 32 28 58 2c 59 29 20 20  GERTRACE2(X,Y)  
04a0: 20 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50     sqlite3DebugP
04b0: 72 69 6e 74 66 28 58 2c 59 29 0a 23 64 65 66 69  rintf(X,Y).#defi
04c0: 6e 65 20 50 41 47 45 52 54 52 41 43 45 33 28 58  ne PAGERTRACE3(X
04d0: 2c 59 2c 5a 29 20 20 20 73 71 6c 69 74 65 33 44  ,Y,Z)   sqlite3D
04e0: 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59 2c 5a  ebugPrintf(X,Y,Z
04f0: 29 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 54  ).#define PAGERT
0500: 52 41 43 45 34 28 58 2c 59 2c 5a 2c 57 29 20 73  RACE4(X,Y,Z,W) s
0510: 71 6c 69 74 65 33 44 65 62 75 67 50 72 69 6e 74  qlite3DebugPrint
0520: 66 28 58 2c 59 2c 5a 2c 57 29 0a 23 64 65 66 69  f(X,Y,Z,W).#defi
0530: 6e 65 20 50 41 47 45 52 54 52 41 43 45 35 28 58  ne PAGERTRACE5(X
0540: 2c 59 2c 5a 2c 57 2c 56 29 20 73 71 6c 69 74 65  ,Y,Z,W,V) sqlite
0550: 33 44 65 62 75 67 50 72 69 6e 74 66 28 58 2c 59  3DebugPrintf(X,Y
0560: 2c 5a 2c 57 2c 56 29 0a 23 65 6c 73 65 0a 23 64  ,Z,W,V).#else.#d
0570: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
0580: 31 28 58 29 0a 23 64 65 66 69 6e 65 20 50 41 47  1(X).#define PAG
0590: 45 52 54 52 41 43 45 32 28 58 2c 59 29 0a 23 64  ERTRACE2(X,Y).#d
05a0: 65 66 69 6e 65 20 50 41 47 45 52 54 52 41 43 45  efine PAGERTRACE
05b0: 33 28 58 2c 59 2c 5a 29 0a 23 64 65 66 69 6e 65  3(X,Y,Z).#define
05c0: 20 50 41 47 45 52 54 52 41 43 45 34 28 58 2c 59   PAGERTRACE4(X,Y
05d0: 2c 5a 2c 57 29 0a 23 64 65 66 69 6e 65 20 50 41  ,Z,W).#define PA
05e0: 47 45 52 54 52 41 43 45 35 28 58 2c 59 2c 5a 2c  GERTRACE5(X,Y,Z,
05f0: 57 2c 56 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  W,V).#endif../*.
0600: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
0610: 20 74 77 6f 20 6d 61 63 72 6f 73 20 61 72 65 20   two macros are 
0620: 75 73 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  used within the 
0630: 50 41 47 45 52 54 52 41 43 45 58 28 29 20 6d 61  PAGERTRACEX() ma
0640: 63 72 6f 73 20 61 62 6f 76 65 0a 2a 2a 20 74 6f  cros above.** to
0650: 20 70 72 69 6e 74 20 6f 75 74 20 66 69 6c 65 2d   print out file-
0660: 64 65 73 63 72 69 70 74 6f 72 73 2e 20 0a 2a 2a  descriptors. .**
0670: 0a 2a 2a 20 50 41 47 45 52 49 44 28 29 20 74 61  .** PAGERID() ta
0680: 6b 65 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  kes a pointer to
0690: 20 61 20 50 61 67 65 72 20 73 74 72 75 63 74 20   a Pager struct 
06a0: 61 73 20 69 74 27 73 20 61 72 67 75 6d 65 6e 74  as it's argument
06b0: 2e 20 54 68 65 0a 2a 2a 20 61 73 73 6f 63 69 61  . The.** associa
06c0: 74 65 64 20 66 69 6c 65 2d 64 65 73 63 72 69 70  ted file-descrip
06d0: 74 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e  tor is returned.
06e0: 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28 29 20   FILEHANDLEID() 
06f0: 74 61 6b 65 73 20 61 6e 20 4f 73 46 69 6c 65 0a  takes an OsFile.
0700: 2a 2a 20 73 74 72 75 63 74 20 61 73 20 69 74 27  ** struct as it'
0710: 73 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23  s argument..*/.#
0720: 64 65 66 69 6e 65 20 50 41 47 45 52 49 44 28 70  define PAGERID(p
0730: 29 20 28 28 69 6e 74 29 28 70 2d 3e 66 64 29 29  ) ((int)(p->fd))
0740: 0a 23 64 65 66 69 6e 65 20 46 49 4c 45 48 41 4e  .#define FILEHAN
0750: 44 4c 45 49 44 28 66 64 29 20 28 28 69 6e 74 29  DLEID(fd) ((int)
0760: 66 64 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 70  fd)../*.** The p
0770: 61 67 65 20 63 61 63 68 65 20 61 73 20 61 20 77  age cache as a w
0780: 68 6f 6c 65 20 69 73 20 61 6c 77 61 79 73 20 69  hole is always i
0790: 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c  n one of the fol
07a0: 6c 6f 77 69 6e 67 0a 2a 2a 20 73 74 61 74 65 73  lowing.** states
07b0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  :.**.**   PAGER_
07c0: 55 4e 4c 4f 43 4b 20 20 20 20 20 20 20 20 54 68  UNLOCK        Th
07d0: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
07e0: 6e 6f 74 20 63 75 72 72 65 6e 74 6c 79 20 72 65  not currently re
07f0: 61 64 69 6e 67 20 6f 72 20 0a 2a 2a 20 20 20 20  ading or .**    
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0810: 20 20 20 77 72 69 74 69 6e 67 20 74 68 65 20 64     writing the d
0820: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54  atabase file.  T
0830: 68 65 72 65 20 69 73 20 6e 6f 0a 2a 2a 20 20 20  here is no.**   
0840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0850: 20 20 20 20 64 61 74 61 20 68 65 6c 64 20 69 6e      data held in
0860: 20 6d 65 6d 6f 72 79 2e 20 20 54 68 69 73 20 69   memory.  This i
0870: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 0a 2a 2a  s the initial.**
0880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0890: 20 20 20 20 20 20 20 73 74 61 74 65 2e 0a 2a 2a         state..**
08a0: 0a 2a 2a 20 20 20 50 41 47 45 52 5f 53 48 41 52  .**   PAGER_SHAR
08b0: 45 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61  ED        The pa
08c0: 67 65 20 63 61 63 68 65 20 69 73 20 72 65 61 64  ge cache is read
08d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
08e0: 2e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ..**            
08f0: 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 69             Writi
0900: 6e 67 20 69 73 20 6e 6f 74 20 70 65 72 6d 69 74  ng is not permit
0910: 74 65 64 2e 20 20 54 68 65 72 65 20 63 61 6e 20  ted.  There can 
0920: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
0930: 20 20 20 20 20 20 20 20 20 20 20 20 6d 75 6c 74              mult
0940: 69 70 6c 65 20 72 65 61 64 65 72 73 20 61 63 63  iple readers acc
0950: 65 73 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20  essing the same 
0960: 64 61 74 61 62 61 73 65 0a 2a 2a 20 20 20 20 20  database.**     
0970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0980: 20 20 66 69 6c 65 20 61 74 20 74 68 65 20 73 61    file at the sa
0990: 6d 65 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  me time..**.**  
09a0: 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20   PAGER_RESERVED 
09b0: 20 20 20 20 20 54 68 69 73 20 70 72 6f 63 65 73       This proces
09c0: 73 20 68 61 73 20 72 65 73 65 72 76 65 64 20 74  s has reserved t
09d0: 68 65 20 64 61 74 61 62 61 73 65 20 66 6f 72 20  he database for 
09e0: 77 72 69 74 69 6e 67 0a 2a 2a 20 20 20 20 20 20  writing.**      
09f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a00: 20 62 75 74 20 68 61 73 20 6e 6f 74 20 79 65 74   but has not yet
0a10: 20 6d 61 64 65 20 61 6e 79 20 63 68 61 6e 67 65   made any change
0a20: 73 2e 20 20 4f 6e 6c 79 20 6f 6e 65 20 70 72 6f  s.  Only one pro
0a30: 63 65 73 73 0a 2a 2a 20 20 20 20 20 20 20 20 20  cess.**         
0a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
0a50: 20 61 20 74 69 6d 65 20 63 61 6e 20 72 65 73 65   a time can rese
0a60: 72 76 65 20 74 68 65 20 64 61 74 61 62 61 73 65  rve the database
0a70: 2e 20 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 0a  .  The original.
0a80: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0a90: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
0aa0: 65 20 66 69 6c 65 20 68 61 73 20 6e 6f 74 20 62  e file has not b
0ab0: 65 65 6e 20 6d 6f 64 69 66 69 65 64 20 73 6f 20  een modified so 
0ac0: 6f 74 68 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  other.**        
0ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
0ae0: 72 6f 63 65 73 73 65 73 20 6d 61 79 20 73 74 69  rocesses may sti
0af0: 6c 6c 20 62 65 20 72 65 61 64 69 6e 67 20 74 68  ll be reading th
0b00: 65 20 6f 6e 2d 64 69 73 6b 0a 2a 2a 20 20 20 20  e on-disk.**    
0b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0b20: 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c 65     database file
0b30: 2e 0a 2a 2a 0a 2a 2a 20 20 20 50 41 47 45 52 5f  ..**.**   PAGER_
0b40: 45 58 43 4c 55 53 49 56 45 20 20 20 20 20 54 68  EXCLUSIVE     Th
0b50: 65 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  e page cache is 
0b60: 77 72 69 74 69 6e 67 20 74 68 65 20 64 61 74 61  writing the data
0b70: 62 61 73 65 2e 0a 2a 2a 20 20 20 20 20 20 20 20  base..**        
0b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 41                 A
0b90: 63 63 65 73 73 20 69 73 20 65 78 63 6c 75 73 69  ccess is exclusi
0ba0: 76 65 2e 20 20 4e 6f 20 6f 74 68 65 72 20 70 72  ve.  No other pr
0bb0: 6f 63 65 73 73 65 73 20 6f 72 0a 2a 2a 20 20 20  ocesses or.**   
0bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0bd0: 20 20 20 20 74 68 72 65 61 64 73 20 63 61 6e 20      threads can 
0be0: 62 65 20 72 65 61 64 69 6e 67 20 6f 72 20 77 72  be reading or wr
0bf0: 69 74 69 6e 67 20 77 68 69 6c 65 20 6f 6e 65 0a  iting while one.
0c00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
0c10: 20 20 20 20 20 20 20 20 20 70 72 6f 63 65 73 73           process
0c20: 20 69 73 20 77 72 69 74 69 6e 67 2e 0a 2a 2a 0a   is writing..**.
0c30: 2a 2a 20 20 20 50 41 47 45 52 5f 53 59 4e 43 45  **   PAGER_SYNCE
0c40: 44 20 20 20 20 20 20 20 20 54 68 65 20 70 61 67  D        The pag
0c50: 65 72 20 6d 6f 76 65 73 20 74 6f 20 74 68 69 73  er moves to this
0c60: 20 73 74 61 74 65 20 66 72 6f 6d 20 50 41 47 45   state from PAGE
0c70: 52 5f 45 58 43 4c 55 53 49 56 45 0a 2a 2a 20 20  R_EXCLUSIVE.**  
0c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c90: 20 20 20 20 20 61 66 74 65 72 20 61 6c 6c 20 64       after all d
0ca0: 69 72 74 79 20 70 61 67 65 73 20 68 61 76 65 20  irty pages have 
0cb0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
0cc0: 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  the.**          
0cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74               dat
0ce0: 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64 20 74  abase file and t
0cf0: 68 65 20 66 69 6c 65 20 68 61 73 20 62 65 65 6e  he file has been
0d00: 20 73 79 6e 63 65 64 20 74 6f 0a 2a 2a 20 20 20   synced to.**   
0d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0d20: 20 20 20 20 64 69 73 6b 2e 20 41 6c 6c 20 74 68      disk. All th
0d30: 61 74 20 72 65 6d 61 69 6e 73 20 74 6f 20 64 6f  at remains to do
0d40: 20 69 73 20 74 6f 20 72 65 6d 6f 76 65 20 6f 72   is to remove or
0d50: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
0d60: 20 20 20 20 20 20 20 20 20 20 74 72 75 6e 63 61            trunca
0d70: 74 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  te the journal f
0d80: 69 6c 65 20 61 6e 64 20 74 68 65 20 74 72 61 6e  ile and the tran
0d90: 73 61 63 74 69 6f 6e 20 0a 2a 2a 20 20 20 20 20  saction .**     
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0db0: 20 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74    will be commit
0dc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
0dd0: 61 67 65 20 63 61 63 68 65 20 63 6f 6d 65 73 20  age cache comes 
0de0: 75 70 20 69 6e 20 50 41 47 45 52 5f 55 4e 4c 4f  up in PAGER_UNLO
0df0: 43 4b 2e 20 20 54 68 65 20 66 69 72 73 74 20 74  CK.  The first t
0e00: 69 6d 65 20 61 0a 2a 2a 20 73 71 6c 69 74 65 33  ime a.** sqlite3
0e10: 50 61 67 65 72 47 65 74 28 29 20 6f 63 63 75 72  PagerGet() occur
0e20: 73 2c 20 74 68 65 20 73 74 61 74 65 20 74 72 61  s, the state tra
0e30: 6e 73 69 74 69 6f 6e 73 20 74 6f 20 50 41 47 45  nsitions to PAGE
0e40: 52 5f 53 48 41 52 45 44 2e 0a 2a 2a 20 41 66 74  R_SHARED..** Aft
0e50: 65 72 20 61 6c 6c 20 70 61 67 65 73 20 68 61 76  er all pages hav
0e60: 65 20 62 65 65 6e 20 72 65 6c 65 61 73 65 64 20  e been released 
0e70: 75 73 69 6e 67 20 73 71 6c 69 74 65 5f 70 61 67  using sqlite_pag
0e80: 65 5f 75 6e 72 65 66 28 29 2c 0a 2a 2a 20 74 68  e_unref(),.** th
0e90: 65 20 73 74 61 74 65 20 74 72 61 6e 73 69 74 69  e state transiti
0ea0: 6f 6e 73 20 62 61 63 6b 20 74 6f 20 50 41 47 45  ons back to PAGE
0eb0: 52 5f 55 4e 4c 4f 43 4b 2e 20 20 54 68 65 20 66  R_UNLOCK.  The f
0ec0: 69 72 73 74 20 74 69 6d 65 0a 2a 2a 20 74 68 61  irst time.** tha
0ed0: 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  t sqlite3PagerWr
0ee0: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 2c  ite() is called,
0ef0: 20 74 68 65 20 73 74 61 74 65 20 74 72 61 6e 73   the state trans
0f00: 69 74 69 6f 6e 73 20 74 6f 0a 2a 2a 20 50 41 47  itions to.** PAG
0f10: 45 52 5f 52 45 53 45 52 56 45 44 2e 20 20 28 4e  ER_RESERVED.  (N
0f20: 6f 74 65 20 74 68 61 74 20 73 71 6c 69 74 65 33  ote that sqlite3
0f30: 50 61 67 65 72 57 72 69 74 65 28 29 20 63 61 6e  PagerWrite() can
0f40: 20 6f 6e 6c 79 20 62 65 0a 2a 2a 20 63 61 6c 6c   only be.** call
0f50: 65 64 20 6f 6e 20 61 6e 20 6f 75 74 73 74 61 6e  ed on an outstan
0f60: 64 69 6e 67 20 70 61 67 65 20 77 68 69 63 68 20  ding page which 
0f70: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 70  means that the p
0f80: 61 67 65 72 20 6d 75 73 74 0a 2a 2a 20 62 65 20  ager must.** be 
0f90: 69 6e 20 50 41 47 45 52 5f 53 48 41 52 45 44 20  in PAGER_SHARED 
0fa0: 62 65 66 6f 72 65 20 69 74 20 74 72 61 6e 73 69  before it transi
0fb0: 74 69 6f 6e 73 20 74 6f 20 50 41 47 45 52 5f 52  tions to PAGER_R
0fc0: 45 53 45 52 56 45 44 2e 29 0a 2a 2a 20 50 41 47  ESERVED.).** PAG
0fd0: 45 52 5f 52 45 53 45 52 56 45 44 20 6d 65 61 6e  ER_RESERVED mean
0fe0: 73 20 74 68 61 74 20 74 68 65 72 65 20 69 73 20  s that there is 
0ff0: 61 6e 20 6f 70 65 6e 20 72 6f 6c 6c 62 61 63 6b  an open rollback
1000: 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 54 68 65   journal..** The
1010: 20 74 72 61 6e 73 69 74 69 6f 6e 20 74 6f 20 50   transition to P
1020: 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 20 6f  AGER_EXCLUSIVE o
1030: 63 63 75 72 73 20 62 65 66 6f 72 65 20 61 6e 79  ccurs before any
1040: 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20   changes.** are 
1050: 6d 61 64 65 20 74 6f 20 74 68 65 20 64 61 74 61  made to the data
1060: 62 61 73 65 20 66 69 6c 65 2c 20 74 68 6f 75 67  base file, thoug
1070: 68 20 77 72 69 74 65 73 20 74 6f 20 74 68 65 20  h writes to the 
1080: 72 6f 6c 6c 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72  rollback.** jour
1090: 6e 61 6c 20 6f 63 63 75 72 73 20 77 69 74 68 20  nal occurs with 
10a0: 6a 75 73 74 20 50 41 47 45 52 5f 52 45 53 45 52  just PAGER_RESER
10b0: 56 45 44 2e 20 20 41 66 74 65 72 20 61 6e 20 73  VED.  After an s
10c0: 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62  qlite3PagerRollb
10d0: 61 63 6b 28 29 0a 2a 2a 20 6f 72 20 73 71 6c 69  ack().** or sqli
10e0: 74 65 33 50 61 67 65 72 43 6f 6d 6d 69 74 50 68  te3PagerCommitPh
10f0: 61 73 65 54 77 6f 28 29 2c 20 74 68 65 20 73 74  aseTwo(), the st
1100: 61 74 65 20 63 61 6e 20 67 6f 20 62 61 63 6b 20  ate can go back 
1110: 74 6f 20 50 41 47 45 52 5f 53 48 41 52 45 44 2c  to PAGER_SHARED,
1120: 0a 2a 2a 20 6f 72 20 69 74 20 63 61 6e 20 73 74  .** or it can st
1130: 61 79 20 61 74 20 50 41 47 45 52 5f 45 58 43 4c  ay at PAGER_EXCL
1140: 55 53 49 56 45 20 69 66 20 77 65 20 61 72 65 20  USIVE if we are 
1150: 69 6e 20 65 78 63 6c 75 73 69 76 65 20 61 63 63  in exclusive acc
1160: 65 73 73 20 6d 6f 64 65 2e 0a 2a 2f 0a 23 64 65  ess mode..*/.#de
1170: 66 69 6e 65 20 50 41 47 45 52 5f 55 4e 4c 4f 43  fine PAGER_UNLOC
1180: 4b 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  K      0.#define
1190: 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 20 20   PAGER_SHARED   
11a0: 20 20 20 31 20 20 20 2f 2a 20 73 61 6d 65 20 61     1   /* same a
11b0: 73 20 53 48 41 52 45 44 5f 4c 4f 43 4b 20 2a 2f  s SHARED_LOCK */
11c0: 0a 23 64 65 66 69 6e 65 20 50 41 47 45 52 5f 52  .#define PAGER_R
11d0: 45 53 45 52 56 45 44 20 20 20 20 32 20 20 20 2f  ESERVED    2   /
11e0: 2a 20 73 61 6d 65 20 61 73 20 52 45 53 45 52 56  * same as RESERV
11f0: 45 44 5f 4c 4f 43 4b 20 2a 2f 0a 23 64 65 66 69  ED_LOCK */.#defi
1200: 6e 65 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49  ne PAGER_EXCLUSI
1210: 56 45 20 20 20 34 20 20 20 2f 2a 20 73 61 6d 65  VE   4   /* same
1220: 20 61 73 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f   as EXCLUSIVE_LO
1230: 43 4b 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  CK */.#define PA
1240: 47 45 52 5f 53 59 4e 43 45 44 20 20 20 20 20 20  GER_SYNCED      
1250: 35 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  5../*.** If the 
1260: 53 51 4c 49 54 45 5f 42 55 53 59 5f 52 45 53 45  SQLITE_BUSY_RESE
1270: 52 56 45 44 5f 4c 4f 43 4b 20 6d 61 63 72 6f 20  RVED_LOCK macro 
1280: 69 73 20 73 65 74 20 74 6f 20 74 72 75 65 20 61  is set to true a
1290: 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 2c 0a  t compile-time,.
12a0: 2a 2a 20 74 68 65 6e 20 66 61 69 6c 65 64 20 61  ** then failed a
12b0: 74 74 65 6d 70 74 73 20 74 6f 20 67 65 74 20 61  ttempts to get a
12c0: 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20 77   reserved lock w
12d0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 74 68 65 20 62  ill invoke the b
12e0: 75 73 79 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a  usy callback..**
12f0: 20 54 68 69 73 20 69 73 20 6f 66 66 20 62 79 20   This is off by 
1300: 64 65 66 61 75 6c 74 2e 20 20 54 6f 20 73 65 65  default.  To see
1310: 20 77 68 79 2c 20 63 6f 6e 73 69 64 65 72 20 74   why, consider t
1320: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 63 65  he following sce
1330: 6e 61 72 69 6f 3a 0a 2a 2a 20 0a 2a 2a 20 53 75  nario:.** .** Su
1340: 70 70 6f 73 65 20 74 68 72 65 61 64 20 41 20 61  ppose thread A a
1350: 6c 72 65 61 64 79 20 68 61 73 20 61 20 73 68 61  lready has a sha
1360: 72 65 64 20 6c 6f 63 6b 20 61 6e 64 20 77 61 6e  red lock and wan
1370: 74 73 20 61 20 72 65 73 65 72 76 65 64 20 6c 6f  ts a reserved lo
1380: 63 6b 2e 0a 2a 2a 20 54 68 72 65 61 64 20 42 20  ck..** Thread B 
1390: 61 6c 72 65 61 64 79 20 68 61 73 20 61 20 72 65  already has a re
13a0: 73 65 72 76 65 64 20 6c 6f 63 6b 20 61 6e 64 20  served lock and 
13b0: 77 61 6e 74 73 20 61 6e 20 65 78 63 6c 75 73 69  wants an exclusi
13c0: 76 65 20 6c 6f 63 6b 2e 20 20 49 66 0a 2a 2a 20  ve lock.  If.** 
13d0: 62 6f 74 68 20 74 68 72 65 61 64 73 20 61 72 65  both threads are
13e0: 20 75 73 69 6e 67 20 74 68 65 69 72 20 62 75 73   using their bus
13f0: 79 20 63 61 6c 6c 62 61 63 6b 73 2c 20 69 74 20  y callbacks, it 
1400: 6d 69 67 68 74 20 62 65 20 61 20 6c 6f 6e 67 20  might be a long 
1410: 74 69 6d 65 0a 2a 2a 20 62 65 20 66 6f 72 20 6f  time.** be for o
1420: 6e 65 20 6f 66 20 74 68 65 20 74 68 72 65 61 64  ne of the thread
1430: 73 20 67 69 76 65 20 75 70 20 61 6e 64 20 61 6c  s give up and al
1440: 6c 6f 77 73 20 74 68 65 20 6f 74 68 65 72 20 74  lows the other t
1450: 6f 20 70 72 6f 63 65 65 64 2e 0a 2a 2a 20 42 75  o proceed..** Bu
1460: 74 20 69 66 20 74 68 65 20 74 68 72 65 61 64 20  t if the thread 
1470: 74 72 79 69 6e 67 20 74 6f 20 67 65 74 20 74 68  trying to get th
1480: 65 20 72 65 73 65 72 76 65 64 20 6c 6f 63 6b 20  e reserved lock 
1490: 67 69 76 65 73 20 75 70 20 71 75 69 63 6b 6c 79  gives up quickly
14a0: 0a 2a 2a 20 28 69 66 20 69 74 20 6e 65 76 65 72  .** (if it never
14b0: 20 69 6e 76 6f 6b 65 73 20 69 74 73 20 62 75 73   invokes its bus
14c0: 79 20 63 61 6c 6c 62 61 63 6b 29 20 74 68 65 6e  y callback) then
14d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20   the contention 
14e0: 77 69 6c 6c 20 62 65 0a 2a 2a 20 72 65 73 6f 6c  will be.** resol
14f0: 76 65 64 20 71 75 69 63 6b 6c 79 2e 0a 2a 2f 0a  ved quickly..*/.
1500: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 42  #ifndef SQLITE_B
1510: 55 53 59 5f 52 45 53 45 52 56 45 44 5f 4c 4f 43  USY_RESERVED_LOC
1520: 4b 0a 23 20 64 65 66 69 6e 65 20 53 51 4c 49 54  K.# define SQLIT
1530: 45 5f 42 55 53 59 5f 52 45 53 45 52 56 45 44 5f  E_BUSY_RESERVED_
1540: 4c 4f 43 4b 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  LOCK 0.#endif../
1550: 2a 0a 2a 2a 20 54 68 69 73 20 6d 61 63 72 6f 20  *.** This macro 
1560: 72 6f 75 6e 64 73 20 76 61 6c 75 65 73 20 75 70  rounds values up
1570: 20 73 6f 20 74 68 61 74 20 69 66 20 74 68 65 20   so that if the 
1580: 76 61 6c 75 65 20 69 73 20 61 6e 20 61 64 64 72  value is an addr
1590: 65 73 73 20 69 74 0a 2a 2a 20 69 73 20 67 75 61  ess it.** is gua
15a0: 72 61 6e 74 65 65 64 20 74 6f 20 62 65 20 61 6e  ranteed to be an
15b0: 20 61 64 64 72 65 73 73 20 74 68 61 74 20 69 73   address that is
15c0: 20 61 6c 69 67 6e 65 64 20 74 6f 20 61 6e 20 38   aligned to an 8
15d0: 2d 62 79 74 65 20 62 6f 75 6e 64 61 72 79 2e 0a  -byte boundary..
15e0: 2a 2f 0a 23 64 65 66 69 6e 65 20 46 4f 52 43 45  */.#define FORCE
15f0: 5f 41 4c 49 47 4e 4d 45 4e 54 28 58 29 20 20 20  _ALIGNMENT(X)   
1600: 28 28 28 58 29 2b 37 29 26 7e 37 29 0a 0a 2f 2a  (((X)+7)&~7)../*
1610: 0a 2a 2a 20 45 61 63 68 20 69 6e 2d 6d 65 6d 6f  .** Each in-memo
1620: 72 79 20 69 6d 61 67 65 20 6f 66 20 61 20 70 61  ry image of a pa
1630: 67 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 74  ge begins with t
1640: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 65 61  he following hea
1650: 64 65 72 2e 0a 2a 2a 20 54 68 69 73 20 68 65 61  der..** This hea
1660: 64 65 72 20 69 73 20 6f 6e 6c 79 20 76 69 73 69  der is only visi
1670: 62 6c 65 20 74 6f 20 74 68 69 73 20 70 61 67 65  ble to this page
1680: 72 20 6d 6f 64 75 6c 65 2e 20 20 54 68 65 20 63  r module.  The c
1690: 6c 69 65 6e 74 0a 2a 2a 20 63 6f 64 65 20 74 68  lient.** code th
16a0: 61 74 20 63 61 6c 6c 73 20 70 61 67 65 72 20 73  at calls pager s
16b0: 65 65 73 20 6f 6e 6c 79 20 74 68 65 20 64 61 74  ees only the dat
16c0: 61 20 74 68 61 74 20 66 6f 6c 6c 6f 77 73 20 74  a that follows t
16d0: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
16e0: 20 43 6c 69 65 6e 74 20 63 6f 64 65 20 73 68 6f   Client code sho
16f0: 75 6c 64 20 63 61 6c 6c 20 73 71 6c 69 74 65 33  uld call sqlite3
1700: 50 61 67 65 72 57 72 69 74 65 28 29 20 6f 6e 20  PagerWrite() on 
1710: 61 20 70 61 67 65 20 70 72 69 6f 72 20 74 6f 20  a page prior to 
1720: 6d 61 6b 69 6e 67 0a 2a 2a 20 61 6e 79 20 6d 6f  making.** any mo
1730: 64 69 66 69 63 61 74 69 6f 6e 73 20 74 6f 20 74  difications to t
1740: 68 61 74 20 70 61 67 65 2e 20 20 54 68 65 20 66  hat page.  The f
1750: 69 72 73 74 20 74 69 6d 65 20 73 71 6c 69 74 65  irst time sqlite
1760: 33 50 61 67 65 72 57 72 69 74 65 28 29 0a 2a 2a  3PagerWrite().**
1770: 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68 65 20   is called, the 
1780: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f  original page co
1790: 6e 74 65 6e 74 73 20 61 72 65 20 77 72 69 74 74  ntents are writt
17a0: 65 6e 20 69 6e 74 6f 20 74 68 65 20 72 6f 6c 6c  en into the roll
17b0: 62 61 63 6b 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20  back.** journal 
17c0: 61 6e 64 20 50 67 48 64 72 2e 69 6e 4a 6f 75 72  and PgHdr.inJour
17d0: 6e 61 6c 20 61 6e 64 20 50 67 48 64 72 2e 6e 65  nal and PgHdr.ne
17e0: 65 64 53 79 6e 63 20 61 72 65 20 73 65 74 2e 20  edSync are set. 
17f0: 20 4c 61 74 65 72 2c 20 6f 6e 63 65 0a 2a 2a 20   Later, once.** 
1800: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 70 61 67 65  the journal page
1810: 20 68 61 73 20 6d 61 64 65 20 69 74 20 6f 6e 74   has made it ont
1820: 6f 20 74 68 65 20 64 69 73 6b 20 73 75 72 66 61  o the disk surfa
1830: 63 65 2c 20 50 67 48 64 72 2e 6e 65 65 64 53 79  ce, PgHdr.needSy
1840: 6e 63 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65 64  nc.** is cleared
1850: 2e 20 20 54 68 65 20 6d 6f 64 69 66 69 65 64 20  .  The modified 
1860: 70 61 67 65 20 63 61 6e 6e 6f 74 20 62 65 20 77  page cannot be w
1870: 72 69 74 74 65 6e 20 62 61 63 6b 20 69 6e 74 6f  ritten back into
1880: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1890: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 75   database file u
18a0: 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72 6e 61 6c  ntil the journal
18b0: 20 70 61 67 65 73 20 68 61 73 20 62 65 65 6e 20   pages has been 
18c0: 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 20 61  synced to disk a
18d0: 6e 64 20 74 68 65 0a 2a 2a 20 50 67 48 64 72 2e  nd the.** PgHdr.
18e0: 6e 65 65 64 53 79 6e 63 20 68 61 73 20 62 65 65  needSync has bee
18f0: 6e 20 63 6c 65 61 72 65 64 2e 0a 2a 2a 0a 2a 2a  n cleared..**.**
1900: 20 54 68 65 20 50 67 48 64 72 2e 64 69 72 74 79   The PgHdr.dirty
1910: 20 66 6c 61 67 20 69 73 20 73 65 74 20 77 68 65   flag is set whe
1920: 6e 20 73 71 6c 69 74 65 33 50 61 67 65 72 57 72  n sqlite3PagerWr
1930: 69 74 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20  ite() is called 
1940: 61 6e 64 0a 2a 2a 20 69 73 20 63 6c 65 61 72 65  and.** is cleare
1950: 64 20 61 67 61 69 6e 20 77 68 65 6e 20 74 68 65  d again when the
1960: 20 70 61 67 65 20 63 6f 6e 74 65 6e 74 20 69 73   page content is
1970: 20 77 72 69 74 74 65 6e 20 62 61 63 6b 20 74 6f   written back to
1980: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a   the original.**
1990: 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a   database file..
19a0: 2a 2a 0a 2a 2a 20 44 65 74 61 69 6c 73 20 6f 66  **.** Details of
19b0: 20 69 6d 70 6f 72 74 61 6e 74 20 73 74 72 75 63   important struc
19c0: 74 75 72 65 20 65 6c 65 6d 65 6e 74 73 3a 0a 2a  ture elements:.*
19d0: 2a 0a 2a 2a 20 6e 65 65 64 53 79 6e 63 0a 2a 2a  *.** needSync.**
19e0: 0a 2a 2a 20 20 20 20 20 49 66 20 74 68 69 73 20  .**     If this 
19f0: 69 73 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65  is true, this me
1a00: 61 6e 73 20 74 68 61 74 20 69 74 20 69 73 20 6e  ans that it is n
1a10: 6f 74 20 73 61 66 65 20 74 6f 20 77 72 69 74 65  ot safe to write
1a20: 20 74 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20   the page.**    
1a30: 20 63 6f 6e 74 65 6e 74 20 74 6f 20 74 68 65 20   content to the 
1a40: 64 61 74 61 62 61 73 65 20 62 65 63 61 75 73 65  database because
1a50: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 6f   the original co
1a60: 6e 74 65 6e 74 20 6e 65 65 64 65 64 0a 2a 2a 20  ntent needed.** 
1a70: 20 20 20 20 66 6f 72 20 72 6f 6c 6c 62 61 63 6b      for rollback
1a80: 20 68 61 73 20 6e 6f 74 20 62 79 20 73 79 6e 63   has not by sync
1a90: 65 64 20 74 6f 20 74 68 65 20 6d 61 69 6e 20 72  ed to the main r
1aa0: 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e  ollback journal.
1ab0: 0a 2a 2a 20 20 20 20 20 54 68 65 20 6f 72 69 67  .**     The orig
1ac0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 6d 61 79  inal content may
1ad0: 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74 74   have been writt
1ae0: 65 6e 20 74 6f 20 74 68 65 20 72 6f 6c 6c 62 61  en to the rollba
1af0: 63 6b 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20  ck journal.**   
1b00: 20 20 62 75 74 20 69 74 20 68 61 73 20 6e 6f 74    but it has not
1b10: 20 79 65 74 20 62 65 65 6e 20 73 79 6e 63 65 64   yet been synced
1b20: 2e 20 20 53 6f 20 77 65 20 63 61 6e 6e 6f 74 20  .  So we cannot 
1b30: 77 72 69 74 65 20 74 6f 20 74 68 65 20 64 61 74  write to the dat
1b40: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 66 69 6c  abase.**     fil
1b50: 65 20 62 65 63 61 75 73 65 20 70 6f 77 65 72 20  e because power 
1b60: 66 61 69 6c 75 72 65 20 6d 69 67 68 74 20 63 61  failure might ca
1b70: 75 73 65 20 74 68 65 20 70 61 67 65 20 69 6e 20  use the page in 
1b80: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1b90: 0a 2a 2a 20 20 20 20 20 74 6f 20 6e 65 76 65 72  .**     to never
1ba0: 20 72 65 61 63 68 20 74 68 65 20 64 69 73 6b 2e   reach the disk.
1bb0: 20 20 49 74 20 69 73 20 61 73 20 69 66 20 74 68    It is as if th
1bc0: 65 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6a  e write to the j
1bd0: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 20  ournal file.**  
1be0: 20 20 20 64 6f 65 73 20 6e 6f 74 20 6f 63 63 75     does not occu
1bf0: 72 20 75 6e 74 69 6c 20 74 68 65 20 6a 6f 75 72  r until the jour
1c00: 6e 61 6c 20 66 69 6c 65 20 69 73 20 73 79 6e 63  nal file is sync
1c10: 65 64 2e 0a 2a 2a 20 20 20 20 20 0a 2a 2a 20 20  ed..**     .**  
1c20: 20 20 20 54 68 69 73 20 66 6c 61 67 20 69 73 20     This flag is 
1c30: 66 61 6c 73 65 20 69 66 20 74 68 65 20 70 61 67  false if the pag
1c40: 65 20 63 6f 6e 74 65 6e 74 20 65 78 61 63 74 6c  e content exactl
1c50: 79 20 6d 61 74 63 68 65 73 20 77 68 61 74 0a 2a  y matches what.*
1c60: 2a 20 20 20 20 20 63 75 72 72 65 6e 74 6c 79 20  *     currently 
1c70: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 64 61  exists in the da
1c80: 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 54 68  tabase file.  Th
1c90: 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
1ca0: 69 73 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20 66  is also.**     f
1cb0: 61 6c 73 65 20 69 66 20 74 68 65 20 6f 72 69 67  alse if the orig
1cc0: 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 68 61 73  inal content has
1cd0: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f   been written to
1ce0: 20 74 68 65 20 6d 61 69 6e 20 72 6f 6c 6c 62 61   the main rollba
1cf0: 63 6b 0a 2a 2a 20 20 20 20 20 6a 6f 75 72 6e 61  ck.**     journa
1d00: 6c 20 61 6e 64 20 73 79 6e 63 65 64 2e 20 20 49  l and synced.  I
1d10: 66 20 74 68 65 20 70 61 67 65 20 72 65 70 72 65  f the page repre
1d20: 73 65 6e 74 73 20 61 20 6e 65 77 20 70 61 67 65  sents a new page
1d30: 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 20 20 20   that has.**    
1d40: 20 62 65 65 6e 20 61 64 64 65 64 20 6f 6e 74 6f   been added onto
1d50: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
1d60: 64 61 74 61 62 61 73 65 20 64 75 72 69 6e 67 20  database during 
1d70: 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 20  the current.**  
1d80: 20 20 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20     transaction, 
1d90: 74 68 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61  the needSync fla
1da0: 67 20 69 73 20 74 72 75 65 20 75 6e 74 69 6c 20  g is true until 
1db0: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1dc0: 61 62 61 73 65 0a 2a 2a 20 20 20 20 20 73 69 7a  abase.**     siz
1dd0: 65 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  e in the journal
1de0: 20 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e   header has been
1df0: 20 73 79 6e 63 65 64 20 74 6f 20 64 69 73 6b 2e   synced to disk.
1e00: 0a 2a 2a 0a 2a 2a 20 69 6e 4a 6f 75 72 6e 61 6c  .**.** inJournal
1e10: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20  .**.**     This 
1e20: 69 73 20 74 72 75 65 20 69 66 20 74 68 65 20 6f  is true if the o
1e30: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 68 61 73  riginal page has
1e40: 20 62 65 65 6e 20 77 72 69 74 74 65 6e 20 69 6e   been written in
1e50: 74 6f 20 74 68 65 20 6d 61 69 6e 0a 2a 2a 20 20  to the main.**  
1e60: 20 20 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72     rollback jour
1e70: 6e 61 6c 2e 20 20 54 68 69 73 20 69 73 20 61 6c  nal.  This is al
1e80: 77 61 79 73 20 66 61 6c 73 65 20 66 6f 72 20 6e  ways false for n
1e90: 65 77 20 70 61 67 65 73 20 61 64 64 65 64 20 74  ew pages added t
1ea0: 6f 0a 2a 2a 20 20 20 20 20 74 68 65 20 65 6e 64  o.**     the end
1eb0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
1ec0: 20 66 69 6c 65 20 64 75 72 69 6e 67 20 74 68 65   file during the
1ed0: 20 63 75 72 72 65 6e 74 20 74 72 61 6e 73 61 63   current transac
1ee0: 74 69 6f 6e 2e 0a 2a 2a 20 20 20 20 20 41 6e 64  tion..**     And
1ef0: 20 74 68 69 73 20 66 6c 61 67 20 73 61 79 73 20   this flag says 
1f00: 6e 6f 74 68 69 6e 67 20 61 62 6f 75 74 20 77 68  nothing about wh
1f10: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68 65  ether or not the
1f20: 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20   journal.**     
1f30: 68 61 73 20 62 65 65 6e 20 73 79 6e 63 65 64 20  has been synced 
1f40: 74 6f 20 64 69 73 6b 2e 20 20 46 6f 72 20 70 61  to disk.  For pa
1f50: 67 65 73 20 74 68 61 74 20 61 72 65 20 69 6e 20  ges that are in 
1f60: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20  the original.** 
1f70: 20 20 20 20 64 61 74 61 62 61 73 65 20 66 69 6c      database fil
1f80: 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  e, the following
1f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 68 6f 75   expression shou
1fa0: 6c 64 20 61 6c 77 61 79 73 20 62 65 20 74 72 75  ld always be tru
1fb0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 69  e:.**.**       i
1fc0: 6e 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67  nJournal = (pPag
1fd0: 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 28  er->aInJournal[(
1fe0: 70 67 6e 6f 2d 31 29 2f 38 5d 20 26 20 28 31 3c  pgno-1)/8] & (1<
1ff0: 3c 28 28 70 67 6e 6f 2d 31 29 25 38 29 29 21 3d  <((pgno-1)%8))!=
2000: 30 0a 2a 2a 0a 2a 2a 20 20 20 20 20 54 68 65 20  0.**.**     The 
2010: 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
2020: 61 6c 5b 5d 20 61 72 72 61 79 20 69 73 20 6f 6e  al[] array is on
2030: 6c 79 20 76 61 6c 69 64 20 66 6f 72 20 74 68 65  ly valid for the
2040: 20 6f 72 69 67 69 6e 61 6c 0a 2a 2a 20 20 20 20   original.**    
2050: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 64 61   pages of the da
2060: 74 61 62 61 73 65 2c 20 6e 6f 74 20 6e 65 77 20  tabase, not new 
2070: 70 61 67 65 73 20 74 68 61 74 20 61 72 65 20 61  pages that are a
2080: 64 64 65 64 20 74 6f 20 74 68 65 20 65 6e 64 0a  dded to the end.
2090: 2a 2a 20 20 20 20 20 6f 66 20 74 68 65 20 64 61  **     of the da
20a0: 74 61 62 61 73 65 2c 20 73 6f 20 6f 62 76 69 6f  tabase, so obvio
20b0: 75 73 6c 79 20 74 68 65 20 61 62 6f 76 65 20 65  usly the above e
20c0: 78 70 72 65 73 73 69 6f 6e 20 63 61 6e 6e 6f 74  xpression cannot
20d0: 20 62 65 0a 2a 2a 20 20 20 20 20 76 61 6c 69 64   be.**     valid
20e0: 20 66 6f 72 20 6e 65 77 20 70 61 67 65 73 2e 20   for new pages. 
20f0: 20 46 6f 72 20 6e 65 77 20 70 61 67 65 73 20 69   For new pages i
2100: 6e 4a 6f 75 72 6e 61 6c 20 69 73 20 61 6c 77 61  nJournal is alwa
2110: 79 73 20 30 2e 0a 2a 2a 0a 2a 2a 20 64 69 72 74  ys 0..**.** dirt
2120: 79 0a 2a 2a 0a 2a 2a 20 20 20 20 20 57 68 65 6e  y.**.**     When
2130: 20 74 72 75 65 2c 20 74 68 69 73 20 6d 65 61 6e   true, this mean
2140: 73 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65  s that the conte
2150: 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68  nt of the page h
2160: 61 73 20 62 65 65 6e 0a 2a 2a 20 20 20 20 20 6d  as been.**     m
2170: 6f 64 69 66 69 65 64 20 61 6e 64 20 6e 65 65 64  odified and need
2180: 73 20 74 6f 20 62 65 20 77 72 69 74 74 65 6e 20  s to be written 
2190: 62 61 63 6b 20 74 6f 20 74 68 65 20 64 61 74 61  back to the data
21a0: 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  base file..**   
21b0: 20 20 49 66 20 66 61 6c 73 65 2c 20 69 74 20 6d    If false, it m
21c0: 65 61 6e 73 20 74 68 61 74 20 65 69 74 68 65 72  eans that either
21d0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
21e0: 74 68 65 20 70 61 67 65 20 69 73 0a 2a 2a 20 20  the page is.**  
21f0: 20 20 20 75 6e 63 68 61 6e 67 65 64 20 6f 72 20     unchanged or 
2200: 65 6c 73 65 20 74 68 65 20 63 6f 6e 74 65 6e 74  else the content
2210: 20 69 73 20 75 6e 69 6d 70 6f 72 74 61 6e 74 20   is unimportant 
2220: 61 6e 64 20 77 65 20 64 6f 20 6e 6f 74 0a 2a 2a  and we do not.**
2230: 20 20 20 20 20 63 61 72 65 20 77 68 65 74 68 65       care whethe
2240: 72 20 6f 72 20 6e 6f 74 20 69 74 20 69 73 20 70  r or not it is p
2250: 72 65 73 65 72 76 65 64 2e 0a 2a 2a 0a 2a 2a 20  reserved..**.** 
2260: 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 0a 2a  alwaysRollback.*
2270: 2a 0a 2a 2a 20 20 20 20 20 54 68 69 73 20 6d 65  *.**     This me
2280: 61 6e 73 20 74 68 61 74 20 74 68 65 20 73 71 6c  ans that the sql
2290: 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c  ite3PagerDontRol
22a0: 6c 62 61 63 6b 28 29 20 41 50 49 20 73 68 6f 75  lback() API shou
22b0: 6c 64 20 62 65 0a 2a 2a 20 20 20 20 20 69 67 6e  ld be.**     ign
22c0: 6f 72 65 64 20 66 6f 72 20 74 68 69 73 20 70 61  ored for this pa
22d0: 67 65 2e 20 20 54 68 65 20 44 6f 6e 74 52 6f 6c  ge.  The DontRol
22e0: 6c 62 61 63 6b 28 29 20 41 50 49 20 61 74 74 65  lback() API atte
22f0: 6d 70 74 73 20 74 6f 20 73 61 79 0a 2a 2a 20 20  mpts to say.**  
2300: 20 20 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74     that the cont
2310: 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65 20  ent of the page 
2320: 6f 6e 20 64 69 73 6b 20 69 73 20 75 6e 69 6d 70  on disk is unimp
2330: 6f 72 74 61 6e 74 20 28 69 74 20 69 73 20 61 6e  ortant (it is an
2340: 0a 2a 2a 20 20 20 20 20 75 6e 75 73 65 64 20 70  .**     unused p
2350: 61 67 65 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  age on the freel
2360: 69 73 74 29 20 73 6f 20 74 68 61 74 20 69 74 20  ist) so that it 
2370: 69 73 20 75 6e 6e 65 63 65 73 73 61 72 79 20 74  is unnecessary t
2380: 6f 20 0a 2a 2a 20 20 20 20 20 72 6f 6c 6c 62 61  o .**     rollba
2390: 63 6b 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ck changes to th
23a0: 69 73 20 70 61 67 65 20 62 65 63 61 75 73 65 20  is page because 
23b0: 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 74  the content of t
23c0: 68 65 20 70 61 67 65 0a 2a 2a 20 20 20 20 20 63  he page.**     c
23d0: 61 6e 20 63 68 61 6e 67 65 20 77 69 74 68 6f 75  an change withou
23e0: 74 20 63 68 61 6e 67 69 6e 67 20 74 68 65 20 6d  t changing the m
23f0: 65 61 6e 69 6e 67 20 6f 66 20 74 68 65 20 64 61  eaning of the da
2400: 74 61 62 61 73 65 2e 20 20 54 68 69 73 0a 2a 2a  tabase.  This.**
2410: 20 20 20 20 20 66 6c 61 67 20 6f 76 65 72 72 69       flag overri
2420: 64 65 73 20 61 6e 79 20 44 6f 6e 74 52 6f 6c 6c  des any DontRoll
2430: 62 61 63 6b 28 29 20 61 74 74 65 6d 70 74 2e 20  back() attempt. 
2440: 20 54 68 69 73 20 66 6c 61 67 20 69 73 20 73 65   This flag is se
2450: 74 0a 2a 2a 20 20 20 20 20 77 68 65 6e 20 61 20  t.**     when a 
2460: 70 61 67 65 20 74 68 61 74 20 6f 72 69 67 69 6e  page that origin
2470: 61 6c 6c 79 20 63 6f 6e 74 61 69 6e 65 64 20 76  ally contained v
2480: 61 6c 69 64 20 64 61 74 61 20 69 73 20 61 64 64  alid data is add
2490: 65 64 20 74 6f 0a 2a 2a 20 20 20 20 20 74 68 65  ed to.**     the
24a0: 20 66 72 65 65 6c 69 73 74 2e 20 20 4c 61 74 65   freelist.  Late
24b0: 72 20 69 6e 20 74 68 65 20 73 61 6d 65 20 74 72  r in the same tr
24c0: 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 69 73 20  ansaction, this 
24d0: 70 61 67 65 20 6d 69 67 68 74 0a 2a 2a 20 20 20  page might.**   
24e0: 20 20 62 65 20 70 75 6c 6c 65 64 20 66 72 6f 6d    be pulled from
24f0: 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 61 6e   the freelist an
2500: 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
2510: 65 74 68 69 6e 67 20 64 69 66 66 65 72 65 6e 74  ething different
2520: 0a 2a 2a 20 20 20 20 20 61 6e 64 20 61 74 20 74  .**     and at t
2530: 68 61 74 20 70 6f 69 6e 74 20 74 68 65 20 44 6f  hat point the Do
2540: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 41 50 49  ntRollback() API
2550: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
2560: 62 65 63 61 75 73 65 0a 2a 2a 20 20 20 20 20 70  because.**     p
2570: 61 67 65 73 20 74 61 6b 65 6e 20 66 72 6f 6d 20  ages taken from 
2580: 74 68 65 20 66 72 65 65 6c 69 73 74 20 64 6f 20  the freelist do 
2590: 6e 6f 74 20 6e 65 65 64 20 74 6f 20 62 65 20 70  not need to be p
25a0: 72 6f 74 65 63 74 65 64 20 62 79 0a 2a 2a 20 20  rotected by.**  
25b0: 20 20 20 74 68 65 20 72 6f 6c 6c 62 61 63 6b 20     the rollback 
25c0: 6a 6f 75 72 6e 61 6c 2e 20 20 42 75 74 20 74 68  journal.  But th
25d0: 69 73 20 66 6c 61 67 20 73 61 79 73 20 74 68 61  is flag says tha
25e0: 74 20 74 68 65 20 70 61 67 65 20 77 61 73 0a 2a  t the page was.*
25f0: 2a 20 20 20 20 20 6e 6f 74 20 6f 72 69 67 69 6e  *     not origin
2600: 61 6c 6c 79 20 70 61 72 74 20 6f 66 20 74 68 65  ally part of the
2610: 20 66 72 65 65 6c 69 73 74 20 73 6f 20 74 68 61   freelist so tha
2620: 74 20 69 74 20 73 74 69 6c 6c 20 6e 65 65 64 73  t it still needs
2630: 20 74 6f 0a 2a 2a 20 20 20 20 20 62 65 20 72 6f   to.**     be ro
2640: 6c 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69  lled back in spi
2650: 74 65 20 6f 66 20 61 6e 79 20 73 75 62 73 65 71  te of any subseq
2660: 75 65 6e 74 20 44 6f 6e 74 52 6f 6c 6c 62 61 63  uent DontRollbac
2670: 6b 28 29 20 63 61 6c 6c 73 2e 0a 2a 2a 0a 2a 2a  k() calls..**.**
2680: 20 6e 65 65 64 52 65 61 64 20 0a 2a 2a 0a 2a 2a   needRead .**.**
2690: 20 20 20 20 20 54 68 69 73 20 66 6c 61 67 20 6d       This flag m
26a0: 65 61 6e 73 20 28 77 68 65 6e 20 74 72 75 65 29  eans (when true)
26b0: 20 74 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e   that the conten
26c0: 74 20 6f 66 20 74 68 65 20 70 61 67 65 20 68 61  t of the page ha
26d0: 73 0a 2a 2a 20 20 20 20 20 6e 6f 74 20 79 65 74  s.**     not yet
26e0: 20 62 65 65 6e 20 6c 6f 61 64 65 64 20 66 72 6f   been loaded fro
26f0: 6d 20 64 69 73 6b 2e 20 20 54 68 65 20 69 6e 2d  m disk.  The in-
2700: 6d 65 6d 6f 72 79 20 63 6f 6e 74 65 6e 74 20 69  memory content i
2710: 73 20 6a 75 73 74 0a 2a 2a 20 20 20 20 20 67 61  s just.**     ga
2720: 72 62 61 67 65 2e 20 20 28 41 63 74 75 61 6c 6c  rbage.  (Actuall
2730: 79 2c 20 77 65 20 7a 65 72 6f 20 74 68 65 20 63  y, we zero the c
2740: 6f 6e 74 65 6e 74 2c 20 62 75 74 20 79 6f 75 20  ontent, but you 
2750: 73 68 6f 75 6c 64 20 6e 6f 74 0a 2a 2a 20 20 20  should not.**   
2760: 20 20 6d 61 6b 65 20 61 6e 79 20 61 73 73 75 6d    make any assum
2770: 70 74 69 6f 6e 73 20 61 62 6f 75 74 20 74 68 65  ptions about the
2780: 20 63 6f 6e 74 65 6e 74 20 6e 65 76 65 72 74 68   content neverth
2790: 65 6c 65 73 73 2e 29 20 20 49 66 20 74 68 65 0a  eless.)  If the.
27a0: 2a 2a 20 20 20 20 20 63 6f 6e 74 65 6e 74 20 69  **     content i
27b0: 73 20 6e 65 65 64 65 64 20 69 6e 20 74 68 65 20  s needed in the 
27c0: 66 75 74 75 72 65 2c 20 69 74 20 73 68 6f 75 6c  future, it shoul
27d0: 64 20 62 65 20 72 65 61 64 20 66 72 6f 6d 20 74  d be read from t
27e0: 68 65 0a 2a 2a 20 20 20 20 20 6f 72 69 67 69 6e  he.**     origin
27f0: 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  al database file
2800: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
2810: 75 63 74 20 50 67 48 64 72 20 50 67 48 64 72 3b  uct PgHdr PgHdr;
2820: 0a 73 74 72 75 63 74 20 50 67 48 64 72 20 7b 0a  .struct PgHdr {.
2830: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b    Pager *pPager;
2840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2850: 20 2f 2a 20 54 68 65 20 70 61 67 65 72 20 74 6f   /* The pager to
2860: 20 77 68 69 63 68 20 74 68 69 73 20 70 61 67 65   which this page
2870: 20 62 65 6c 6f 6e 67 73 20 2a 2f 0a 20 20 50 67   belongs */.  Pg
2880: 6e 6f 20 70 67 6e 6f 3b 20 20 20 20 20 20 20 20  no pgno;        
2890: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
28a0: 54 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  The page number 
28b0: 66 6f 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f  for this page */
28c0: 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78 74 48  .  PgHdr *pNextH
28d0: 61 73 68 2c 20 2a 70 50 72 65 76 48 61 73 68 3b  ash, *pPrevHash;
28e0: 20 20 2f 2a 20 48 61 73 68 20 63 6f 6c 6c 69 73    /* Hash collis
28f0: 69 6f 6e 20 63 68 61 69 6e 20 66 6f 72 20 50 67  ion chain for Pg
2900: 48 64 72 2e 70 67 6e 6f 20 2a 2f 0a 20 20 50 67  Hdr.pgno */.  Pg
2910: 48 64 72 20 2a 70 4e 65 78 74 46 72 65 65 2c 20  Hdr *pNextFree, 
2920: 2a 70 50 72 65 76 46 72 65 65 3b 20 20 2f 2a 20  *pPrevFree;  /* 
2930: 46 72 65 65 6c 69 73 74 20 6f 66 20 70 61 67 65  Freelist of page
2940: 73 20 77 68 65 72 65 20 6e 52 65 66 3d 3d 30 20  s where nRef==0 
2950: 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 4e 65 78  */.  PgHdr *pNex
2960: 74 41 6c 6c 3b 20 20 20 20 20 20 20 20 20 20 20  tAll;           
2970: 20 20 20 20 2f 2a 20 41 20 6c 69 73 74 20 6f 66      /* A list of
2980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
2990: 75 38 20 69 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20  u8 inJournal;   
29a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29b0: 2a 20 54 52 55 45 20 69 66 20 68 61 73 20 62 65  * TRUE if has be
29c0: 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20 6a 6f  en written to jo
29d0: 75 72 6e 61 6c 20 2a 2f 0a 20 20 75 38 20 64 69  urnal */.  u8 di
29e0: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
29f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 52 55            /* TRU
2a00: 45 20 69 66 20 77 65 20 6e 65 65 64 20 74 6f 20  E if we need to 
2a10: 77 72 69 74 65 20 62 61 63 6b 20 63 68 61 6e 67  write back chang
2a20: 65 73 20 2a 2f 0a 20 20 75 38 20 6e 65 65 64 53  es */.  u8 needS
2a30: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
2a40: 20 20 20 20 20 20 20 2f 2a 20 53 79 6e 63 20 6a         /* Sync j
2a50: 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20 77 72  ournal before wr
2a60: 69 74 69 6e 67 20 74 68 69 73 20 70 61 67 65 20  iting this page 
2a70: 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73 52 6f  */.  u8 alwaysRo
2a80: 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20 20 20  llback;         
2a90: 20 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44      /* Disable D
2aa0: 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f  ontRollback() fo
2ab0: 72 20 74 68 69 73 20 70 61 67 65 20 2a 2f 0a 20  r this page */. 
2ac0: 20 75 38 20 6e 65 65 64 52 65 61 64 3b 20 20 20   u8 needRead;   
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 2f 2a 20 52 65 61 64 20 63 6f 6e 74 65 6e 74 20  /* Read content 
2af0: 69 66 20 50 61 67 65 72 57 72 69 74 65 28 29 20  if PagerWrite() 
2b00: 69 73 20 63 61 6c 6c 65 64 20 2a 2f 0a 20 20 73  is called */.  s
2b10: 68 6f 72 74 20 69 6e 74 20 6e 52 65 66 3b 20 20  hort int nRef;  
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2b30: 20 4e 75 6d 62 65 72 20 6f 66 20 75 73 65 72 73   Number of users
2b40: 20 6f 66 20 74 68 69 73 20 70 61 67 65 20 2a 2f   of this page */
2b50: 0a 20 20 50 67 48 64 72 20 2a 70 44 69 72 74 79  .  PgHdr *pDirty
2b60: 2c 20 2a 70 50 72 65 76 44 69 72 74 79 3b 20 20  , *pPrevDirty;  
2b70: 20 20 2f 2a 20 44 69 72 74 79 20 70 61 67 65 73    /* Dirty pages
2b80: 20 2a 2f 0a 20 20 75 33 32 20 6e 6f 74 55 73 65   */.  u32 notUse
2b90: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
2ba0: 20 20 20 20 20 2f 2a 20 42 75 66 66 65 72 20 73       /* Buffer s
2bb0: 70 61 63 65 20 2a 2f 0a 23 69 66 64 65 66 20 53  pace */.#ifdef S
2bc0: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
2bd0: 53 0a 20 20 75 33 32 20 70 61 67 65 48 61 73 68  S.  u32 pageHash
2be0: 3b 0a 23 65 6e 64 69 66 0a 20 20 2f 2a 20 70 50  ;.#endif.  /* pP
2bf0: 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 62  ager->pageSize b
2c00: 79 74 65 73 20 6f 66 20 70 61 67 65 20 64 61 74  ytes of page dat
2c10: 61 20 66 6f 6c 6c 6f 77 20 74 68 69 73 20 68 65  a follow this he
2c20: 61 64 65 72 20 2a 2f 0a 20 20 2f 2a 20 50 61 67  ader */.  /* Pag
2c30: 65 72 2e 6e 45 78 74 72 61 20 62 79 74 65 73 20  er.nExtra bytes 
2c40: 6f 66 20 6c 6f 63 61 6c 20 64 61 74 61 20 66 6f  of local data fo
2c50: 6c 6c 6f 77 20 74 68 65 20 70 61 67 65 20 64 61  llow the page da
2c60: 74 61 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20  ta */.};../*.** 
2c70: 46 6f 72 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79  For an in-memory
2c80: 20 6f 6e 6c 79 20 64 61 74 61 62 61 73 65 2c 20   only database, 
2c90: 73 6f 6d 65 20 65 78 74 72 61 20 69 6e 66 6f 72  some extra infor
2ca0: 6d 61 74 69 6f 6e 20 69 73 20 72 65 63 6f 72 64  mation is record
2cb0: 65 64 20 61 62 6f 75 74 0a 2a 2a 20 65 61 63 68  ed about.** each
2cc0: 20 70 61 67 65 20 73 6f 20 74 68 61 74 20 63 68   page so that ch
2cd0: 61 6e 67 65 73 20 63 61 6e 20 62 65 20 72 6f 6c  anges can be rol
2ce0: 6c 65 64 20 62 61 63 6b 2e 20 20 28 4a 6f 75 72  led back.  (Jour
2cf0: 6e 61 6c 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  nal files are no
2d00: 74 0a 2a 2a 20 75 73 65 64 20 66 6f 72 20 69 6e  t.** used for in
2d10: 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65  -memory database
2d20: 73 2e 29 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  s.)  The followi
2d30: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69  ng information i
2d40: 73 20 61 64 64 65 64 20 74 6f 0a 2a 2a 20 74 68  s added to.** th
2d50: 65 20 65 6e 64 20 6f 66 20 65 76 65 72 79 20 45  e end of every E
2d60: 58 54 52 41 20 62 6c 6f 63 6b 20 66 6f 72 20 69  XTRA block for i
2d70: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
2d80: 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  es..**.** This i
2d90: 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 6f 75 6c 64  nformation could
2da0: 20 68 61 76 65 20 62 65 65 6e 20 61 64 64 65 64   have been added
2db0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
2dc0: 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72 65   PgHdr structure
2dd0: 2e 0a 2a 2a 20 42 75 74 20 74 68 65 6e 20 69 74  ..** But then it
2de0: 20 77 6f 75 6c 64 20 74 61 6b 65 20 75 70 20 61   would take up a
2df0: 6e 20 65 78 74 72 61 20 38 20 62 79 74 65 73 20  n extra 8 bytes 
2e00: 6f 66 20 73 74 6f 72 61 67 65 20 6f 6e 20 65 76  of storage on ev
2e10: 65 72 79 20 50 67 48 64 72 0a 2a 2a 20 65 76 65  ery PgHdr.** eve
2e20: 6e 20 66 6f 72 20 64 69 73 6b 2d 62 61 73 65 64  n for disk-based
2e30: 20 64 61 74 61 62 61 73 65 73 2e 20 20 53 70 6c   databases.  Spl
2e40: 69 74 74 69 6e 67 20 69 74 20 6f 75 74 20 73 61  itting it out sa
2e50: 76 65 73 20 38 20 62 79 74 65 73 2e 20 20 54 68  ves 8 bytes.  Th
2e60: 69 73 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 61 20  is.** is only a 
2e70: 73 61 76 69 6e 67 73 20 6f 66 20 30 2e 38 25 20  savings of 0.8% 
2e80: 62 75 74 20 74 68 6f 73 65 20 70 65 72 63 65 6e  but those percen
2e90: 74 61 67 65 73 20 61 64 64 20 75 70 2e 0a 2a 2f  tages add up..*/
2ea0: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
2eb0: 50 67 48 69 73 74 6f 72 79 20 50 67 48 69 73 74  PgHistory PgHist
2ec0: 6f 72 79 3b 0a 73 74 72 75 63 74 20 50 67 48 69  ory;.struct PgHi
2ed0: 73 74 6f 72 79 20 7b 0a 20 20 75 38 20 2a 70 4f  story {.  u8 *pO
2ee0: 72 69 67 3b 20 20 20 20 20 2f 2a 20 4f 72 69 67  rig;     /* Orig
2ef0: 69 6e 61 6c 20 70 61 67 65 20 74 65 78 74 2e 20  inal page text. 
2f00: 20 52 65 73 74 6f 72 65 20 74 6f 20 74 68 69 73   Restore to this
2f10: 20 6f 6e 20 61 20 66 75 6c 6c 20 72 6f 6c 6c 62   on a full rollb
2f20: 61 63 6b 20 2a 2f 0a 20 20 75 38 20 2a 70 53 74  ack */.  u8 *pSt
2f30: 6d 74 3b 20 20 20 20 20 2f 2a 20 54 65 78 74 20  mt;     /* Text 
2f40: 61 73 20 69 74 20 77 61 73 20 61 74 20 74 68 65  as it was at the
2f50: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2f60: 65 20 63 75 72 72 65 6e 74 20 73 74 61 74 65 6d  e current statem
2f70: 65 6e 74 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a  ent */.  PgHdr *
2f80: 70 4e 65 78 74 53 74 6d 74 2c 20 2a 70 50 72 65  pNextStmt, *pPre
2f90: 76 53 74 6d 74 3b 20 20 2f 2a 20 4c 69 73 74 20  vStmt;  /* List 
2fa0: 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68 65 20  of pages in the 
2fb0: 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61  statement journa
2fc0: 6c 20 2a 2f 0a 20 20 75 38 20 69 6e 53 74 6d 74  l */.  u8 inStmt
2fd0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2fe0: 20 20 20 20 20 20 2f 2a 20 54 52 55 45 20 69 66        /* TRUE if
2ff0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
3000: 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  t subjournal */.
3010: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 41 20 6d 61 63 72  };../*.** A macr
3020: 6f 20 75 73 65 64 20 66 6f 72 20 69 6e 76 6f 6b  o used for invok
3030: 69 6e 67 20 74 68 65 20 63 6f 64 65 63 20 69 66  ing the codec if
3040: 20 74 68 65 72 65 20 69 73 20 6f 6e 65 0a 2a 2f   there is one.*/
3050: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
3060: 41 53 5f 43 4f 44 45 43 0a 23 20 64 65 66 69 6e  AS_CODEC.# defin
3070: 65 20 43 4f 44 45 43 31 28 50 2c 44 2c 4e 2c 58  e CODEC1(P,D,N,X
3080: 29 20 69 66 28 20 50 2d 3e 78 43 6f 64 65 63 21  ) if( P->xCodec!
3090: 3d 30 20 29 7b 20 50 2d 3e 78 43 6f 64 65 63 28  =0 ){ P->xCodec(
30a0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
30b0: 2c 58 29 3b 20 7d 0a 23 20 64 65 66 69 6e 65 20  ,X); }.# define 
30c0: 43 4f 44 45 43 32 28 50 2c 44 2c 4e 2c 58 29 20  CODEC2(P,D,N,X) 
30d0: 28 28 63 68 61 72 2a 29 28 50 2d 3e 78 43 6f 64  ((char*)(P->xCod
30e0: 65 63 21 3d 30 3f 50 2d 3e 78 43 6f 64 65 63 28  ec!=0?P->xCodec(
30f0: 50 2d 3e 70 43 6f 64 65 63 41 72 67 2c 44 2c 4e  P->pCodecArg,D,N
3100: 2c 58 29 3a 44 29 29 0a 23 65 6c 73 65 0a 23 20  ,X):D)).#else.# 
3110: 64 65 66 69 6e 65 20 43 4f 44 45 43 31 28 50 2c  define CODEC1(P,
3120: 44 2c 4e 2c 58 29 20 2f 2a 20 4e 4f 2d 4f 50 20  D,N,X) /* NO-OP 
3130: 2a 2f 0a 23 20 64 65 66 69 6e 65 20 43 4f 44 45  */.# define CODE
3140: 43 32 28 50 2c 44 2c 4e 2c 58 29 20 28 28 63 68  C2(P,D,N,X) ((ch
3150: 61 72 2a 29 44 29 0a 23 65 6e 64 69 66 0a 0a 2f  ar*)D).#endif../
3160: 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 70  *.** Convert a p
3170: 6f 69 6e 74 65 72 20 74 6f 20 61 20 50 67 48 64  ointer to a PgHd
3180: 72 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  r into a pointer
3190: 20 74 6f 20 69 74 73 20 64 61 74 61 0a 2a 2a 20   to its data.** 
31a0: 61 6e 64 20 62 61 63 6b 20 61 67 61 69 6e 2e 0a  and back again..
31b0: 2a 2f 0a 23 64 65 66 69 6e 65 20 50 47 48 44 52  */.#define PGHDR
31c0: 5f 54 4f 5f 44 41 54 41 28 50 29 20 20 28 28 76  _TO_DATA(P)  ((v
31d0: 6f 69 64 2a 29 28 26 28 50 29 5b 31 5d 29 29 0a  oid*)(&(P)[1])).
31e0: 23 64 65 66 69 6e 65 20 44 41 54 41 5f 54 4f 5f  #define DATA_TO_
31f0: 50 47 48 44 52 28 44 29 20 20 28 26 28 28 50 67  PGHDR(D)  (&((Pg
3200: 48 64 72 2a 29 28 44 29 29 5b 2d 31 5d 29 0a 23  Hdr*)(D))[-1]).#
3210: 64 65 66 69 6e 65 20 50 47 48 44 52 5f 54 4f 5f  define PGHDR_TO_
3220: 45 58 54 52 41 28 47 2c 50 29 20 28 28 76 6f 69  EXTRA(G,P) ((voi
3230: 64 2a 29 26 28 28 63 68 61 72 2a 29 28 26 28 47  d*)&((char*)(&(G
3240: 29 5b 31 5d 29 29 5b 28 50 29 2d 3e 70 61 67 65  )[1]))[(P)->page
3250: 53 69 7a 65 5d 29 0a 23 64 65 66 69 6e 65 20 50  Size]).#define P
3260: 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 50 2c 50  GHDR_TO_HIST(P,P
3270: 47 52 29 20 20 5c 0a 20 20 20 20 20 20 20 20 20  GR)  \.         
3280: 20 20 20 28 28 50 67 48 69 73 74 6f 72 79 2a 29     ((PgHistory*)
3290: 26 28 28 63 68 61 72 2a 29 28 26 28 50 29 5b 31  &((char*)(&(P)[1
32a0: 5d 29 29 5b 28 50 47 52 29 2d 3e 70 61 67 65 53  ]))[(PGR)->pageS
32b0: 69 7a 65 2b 28 50 47 52 29 2d 3e 6e 45 78 74 72  ize+(PGR)->nExtr
32c0: 61 5d 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 6f 70 65  a])../*.** A ope
32d0: 6e 20 70 61 67 65 20 63 61 63 68 65 20 69 73 20  n page cache is 
32e0: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
32f0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
3300: 75 63 74 75 72 65 2e 0a 2a 2a 0a 2a 2a 20 50 61  ucture..**.** Pa
3310: 67 65 72 2e 65 72 72 43 6f 64 65 20 6d 61 79 20  ger.errCode may 
3320: 62 65 20 73 65 74 20 74 6f 20 53 51 4c 49 54 45  be set to SQLITE
3330: 5f 49 4f 45 52 52 2c 20 53 51 4c 49 54 45 5f 43  _IOERR, SQLITE_C
3340: 4f 52 52 55 50 54 2c 20 6f 72 0a 2a 2a 20 6f 72  ORRUPT, or.** or
3350: 20 53 51 4c 49 54 45 5f 46 55 4c 4c 2e 20 4f 6e   SQLITE_FULL. On
3360: 63 65 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 69  ce one of the fi
3370: 72 73 74 20 74 68 72 65 65 20 65 72 72 6f 72 73  rst three errors
3380: 20 6f 63 63 75 72 73 2c 20 69 74 20 70 65 72 73   occurs, it pers
3390: 69 73 74 73 0a 2a 2a 20 61 6e 64 20 69 73 20 72  ists.** and is r
33a0: 65 74 75 72 6e 65 64 20 61 73 20 74 68 65 20 72  eturned as the r
33b0: 65 73 75 6c 74 20 6f 66 20 65 76 65 72 79 20 6d  esult of every m
33c0: 61 6a 6f 72 20 70 61 67 65 72 20 41 50 49 20 63  ajor pager API c
33d0: 61 6c 6c 2e 20 20 54 68 65 0a 2a 2a 20 53 51 4c  all.  The.** SQL
33e0: 49 54 45 5f 46 55 4c 4c 20 72 65 74 75 72 6e 20  ITE_FULL return 
33f0: 63 6f 64 65 20 69 73 20 73 6c 69 67 68 74 6c 79  code is slightly
3400: 20 64 69 66 66 65 72 65 6e 74 2e 20 49 74 20 70   different. It p
3410: 65 72 73 69 73 74 73 20 6f 6e 6c 79 20 75 6e 74  ersists only unt
3420: 69 6c 20 74 68 65 0a 2a 2a 20 6e 65 78 74 20 73  il the.** next s
3430: 75 63 63 65 73 73 66 75 6c 20 72 6f 6c 6c 62 61  uccessful rollba
3440: 63 6b 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20  ck is performed 
3450: 6f 6e 20 74 68 65 20 70 61 67 65 72 20 63 61 63  on the pager cac
3460: 68 65 2e 20 41 6c 73 6f 2c 0a 2a 2a 20 53 51 4c  he. Also,.** SQL
3470: 49 54 45 5f 46 55 4c 4c 20 64 6f 65 73 20 6e 6f  ITE_FULL does no
3480: 74 20 61 66 66 65 63 74 20 74 68 65 20 73 71 6c  t affect the sql
3490: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
34a0: 6e 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c  nd sqlite3PagerL
34b0: 6f 6f 6b 75 70 28 29 0a 2a 2a 20 41 50 49 73 2c  ookup().** APIs,
34c0: 20 74 68 65 79 20 6d 61 79 20 73 74 69 6c 6c 20   they may still 
34d0: 62 65 20 75 73 65 64 20 73 75 63 63 65 73 73 66  be used successf
34e0: 75 6c 6c 79 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  ully..*/.struct 
34f0: 50 61 67 65 72 20 7b 0a 20 20 75 38 20 6a 6f 75  Pager {.  u8 jou
3500: 72 6e 61 6c 4f 70 65 6e 3b 20 20 20 20 20 20 20  rnalOpen;       
3510: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
3520: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 64 65   journal file de
3530: 73 63 72 69 70 74 6f 72 73 20 69 73 20 76 61 6c  scriptors is val
3540: 69 64 20 2a 2f 0a 20 20 75 38 20 6a 6f 75 72 6e  id */.  u8 journ
3550: 61 6c 53 74 61 72 74 65 64 3b 20 20 20 20 20 20  alStarted;      
3560: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 68      /* True if h
3570: 65 61 64 65 72 20 6f 66 20 6a 6f 75 72 6e 61 6c  eader of journal
3580: 20 69 73 20 73 79 6e 63 65 64 20 2a 2f 0a 20 20   is synced */.  
3590: 75 38 20 75 73 65 4a 6f 75 72 6e 61 6c 3b 20 20  u8 useJournal;  
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55              /* U
35b0: 73 65 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f  se a rollback jo
35c0: 75 72 6e 61 6c 20 6f 6e 20 74 68 69 73 20 66 69  urnal on this fi
35d0: 6c 65 20 2a 2f 0a 20 20 75 38 20 6e 6f 52 65 61  le */.  u8 noRea
35e0: 64 6c 6f 63 6b 3b 20 20 20 20 20 20 20 20 20 20  dlock;          
35f0: 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 62 6f      /* Do not bo
3600: 74 68 65 72 20 74 6f 20 6f 62 74 61 69 6e 20 72  ther to obtain r
3610: 65 61 64 6c 6f 63 6b 73 20 2a 2f 0a 20 20 75 38  eadlocks */.  u8
3620: 20 73 74 6d 74 4f 70 65 6e 3b 20 20 20 20 20 20   stmtOpen;      
3630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
3640: 65 20 69 66 20 74 68 65 20 73 74 61 74 65 6d 65  e if the stateme
3650: 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c 20 69 73  nt subjournal is
3660: 20 6f 70 65 6e 20 2a 2f 0a 20 20 75 38 20 73 74   open */.  u8 st
3670: 6d 74 49 6e 55 73 65 3b 20 20 20 20 20 20 20 20  mtInUse;        
3680: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 77         /* True w
3690: 65 20 61 72 65 20 69 6e 20 61 20 73 74 61 74 65  e are in a state
36a0: 6d 65 6e 74 20 73 75 62 74 72 61 6e 73 61 63 74  ment subtransact
36b0: 69 6f 6e 20 2a 2f 0a 20 20 75 38 20 73 74 6d 74  ion */.  u8 stmt
36c0: 41 75 74 6f 6f 70 65 6e 3b 20 20 20 20 20 20 20  Autoopen;       
36d0: 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 73 74 6d       /* Open stm
36e0: 74 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 6d  t journal when m
36f0: 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 69 73 20 6f  ain journal is o
3700: 70 65 6e 65 64 2a 2f 0a 20 20 75 38 20 6e 6f 53  pened*/.  u8 noS
3710: 79 6e 63 3b 20 20 20 20 20 20 20 20 20 20 20 20  ync;            
3720: 20 20 20 20 20 20 2f 2a 20 44 6f 20 6e 6f 74 20        /* Do not 
3730: 73 79 6e 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c  sync the journal
3740: 20 69 66 20 74 72 75 65 20 2a 2f 0a 20 20 75 38   if true */.  u8
3750: 20 66 75 6c 6c 53 79 6e 63 3b 20 20 20 20 20 20   fullSync;      
3760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20            /* Do 
3770: 65 78 74 72 61 20 73 79 6e 63 73 20 6f 66 20 74  extra syncs of t
3780: 68 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72  he journal for r
3790: 6f 62 75 73 74 6e 65 73 73 20 2a 2f 0a 20 20 75  obustness */.  u
37a0: 38 20 66 75 6c 6c 5f 66 73 79 6e 63 3b 20 20 20  8 full_fsync;   
37b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
37c0: 65 20 46 5f 46 55 4c 4c 46 53 59 4e 43 20 77 68  e F_FULLFSYNC wh
37d0: 65 6e 20 61 76 61 69 6c 61 62 6c 65 20 2a 2f 0a  en available */.
37e0: 20 20 75 38 20 73 74 61 74 65 3b 20 20 20 20 20    u8 state;     
37f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
3800: 20 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 2c 20 5f   PAGER_UNLOCK, _
3810: 53 48 41 52 45 44 2c 20 5f 52 45 53 45 52 56 45  SHARED, _RESERVE
3820: 44 2c 20 65 74 63 2e 20 2a 2f 0a 20 20 75 38 20  D, etc. */.  u8 
3830: 74 65 6d 70 46 69 6c 65 3b 20 20 20 20 20 20 20  tempFile;       
3840: 20 20 20 20 20 20 20 20 20 2f 2a 20 7a 46 69 6c           /* zFil
3850: 65 6e 61 6d 65 20 69 73 20 61 20 74 65 6d 70 6f  ename is a tempo
3860: 72 61 72 79 20 66 69 6c 65 20 2a 2f 0a 20 20 75  rary file */.  u
3870: 38 20 72 65 61 64 4f 6e 6c 79 3b 20 20 20 20 20  8 readOnly;     
3880: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
3890: 75 65 20 66 6f 72 20 61 20 72 65 61 64 2d 6f 6e  ue for a read-on
38a0: 6c 79 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  ly database */. 
38b0: 20 75 38 20 6e 65 65 64 53 79 6e 63 3b 20 20 20   u8 needSync;   
38c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
38d0: 54 72 75 65 20 69 66 20 61 6e 20 66 73 79 6e 63  True if an fsync
38e0: 28 29 20 69 73 20 6e 65 65 64 65 64 20 6f 6e 20  () is needed on 
38f0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20  the journal */. 
3900: 20 75 38 20 64 69 72 74 79 43 61 63 68 65 3b 20   u8 dirtyCache; 
3910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3920: 54 72 75 65 20 69 66 20 63 61 63 68 65 64 20 70  True if cached p
3930: 61 67 65 73 20 68 61 76 65 20 63 68 61 6e 67 65  ages have change
3940: 64 20 2a 2f 0a 20 20 75 38 20 61 6c 77 61 79 73  d */.  u8 always
3950: 52 6f 6c 6c 62 61 63 6b 3b 20 20 20 20 20 20 20  Rollback;       
3960: 20 20 20 2f 2a 20 44 69 73 61 62 6c 65 20 44 6f     /* Disable Do
3970: 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 66 6f 72  ntRollback() for
3980: 20 61 6c 6c 20 70 61 67 65 73 20 2a 2f 0a 20 20   all pages */.  
3990: 75 38 20 6d 65 6d 44 62 3b 20 20 20 20 20 20 20  u8 memDb;       
39a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
39b0: 72 75 65 20 74 6f 20 69 6e 68 69 62 69 74 20 61  rue to inhibit a
39c0: 6c 6c 20 66 69 6c 65 20 49 2f 4f 20 2a 2f 0a 20  ll file I/O */. 
39d0: 20 75 38 20 73 65 74 4d 61 73 74 65 72 3b 20 20   u8 setMaster;  
39e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
39f0: 54 72 75 65 20 69 66 20 61 20 6d 2d 6a 20 6e 61  True if a m-j na
3a00: 6d 65 20 68 61 73 20 62 65 65 6e 20 77 72 69 74  me has been writ
3a10: 74 65 6e 20 74 6f 20 6a 72 6e 6c 20 2a 2f 0a 20  ten to jrnl */. 
3a20: 20 75 38 20 64 6f 4e 6f 74 53 79 6e 63 3b 20 20   u8 doNotSync;  
3a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3a40: 42 6f 6f 6c 65 61 6e 2e 20 57 68 69 6c 65 20 74  Boolean. While t
3a50: 72 75 65 2c 20 64 6f 20 6e 6f 74 20 73 70 69 6c  rue, do not spil
3a60: 6c 20 74 68 65 20 63 61 63 68 65 20 2a 2f 0a 20  l the cache */. 
3a70: 20 75 38 20 65 78 63 6c 75 73 69 76 65 4d 6f 64   u8 exclusiveMod
3a80: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
3a90: 42 6f 6f 6c 65 61 6e 2e 20 54 72 75 65 20 69 66  Boolean. True if
3aa0: 20 6c 6f 63 6b 69 6e 67 5f 6d 6f 64 65 3d 3d 45   locking_mode==E
3ab0: 58 43 4c 55 53 49 56 45 20 2a 2f 0a 20 20 75 38  XCLUSIVE */.  u8
3ac0: 20 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65   changeCountDone
3ad0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  ;         /* Set
3ae0: 20 61 66 74 65 72 20 69 6e 63 72 65 6d 65 6e 74   after increment
3af0: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 2d 63  ing the change-c
3b00: 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 69 6e 74 20  ounter */.  int 
3b10: 65 72 72 43 6f 64 65 3b 20 20 20 20 20 20 20 20  errCode;        
3b20: 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
3b30: 66 20 73 65 76 65 72 61 6c 20 6b 69 6e 64 73 20  f several kinds 
3b40: 6f 66 20 65 72 72 6f 72 73 20 2a 2f 0a 20 20 69  of errors */.  i
3b50: 6e 74 20 64 62 53 69 7a 65 3b 20 20 20 20 20 20  nt dbSize;      
3b60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
3b70: 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 69 6e  mber of pages in
3b80: 20 74 68 65 20 66 69 6c 65 20 2a 2f 0a 20 20 69   the file */.  i
3b90: 6e 74 20 6f 72 69 67 44 62 53 69 7a 65 3b 20 20  nt origDbSize;  
3ba0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 64 62             /* db
3bb0: 53 69 7a 65 20 62 65 66 6f 72 65 20 74 68 65 20  Size before the 
3bc0: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 20 2a  current change *
3bd0: 2f 0a 20 20 69 6e 74 20 73 74 6d 74 53 69 7a 65  /.  int stmtSize
3be0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3bf0: 2f 2a 20 53 69 7a 65 20 6f 66 20 64 61 74 61 62  /* Size of datab
3c00: 61 73 65 20 28 69 6e 20 70 61 67 65 73 29 20 61  ase (in pages) a
3c10: 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29 20 2a  t stmt_begin() *
3c20: 2f 0a 20 20 69 6e 74 20 6e 52 65 63 3b 20 20 20  /.  int nRec;   
3c30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3c40: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 70 61 67  /* Number of pag
3c50: 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68  es written to th
3c60: 65 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 75  e journal */.  u
3c70: 33 32 20 63 6b 73 75 6d 49 6e 69 74 3b 20 20 20  32 cksumInit;   
3c80: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
3c90: 61 73 69 2d 72 61 6e 64 6f 6d 20 76 61 6c 75 65  asi-random value
3ca0: 20 61 64 64 65 64 20 74 6f 20 65 76 65 72 79 20   added to every 
3cb0: 63 68 65 63 6b 73 75 6d 20 2a 2f 0a 20 20 69 6e  checksum */.  in
3cc0: 74 20 73 74 6d 74 4e 52 65 63 3b 20 20 20 20 20  t stmtNRec;     
3cd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
3ce0: 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20 69  ber of records i
3cf0: 6e 20 73 74 6d 74 20 73 75 62 6a 6f 75 72 6e 61  n stmt subjourna
3d00: 6c 20 2a 2f 0a 20 20 69 6e 74 20 6e 45 78 74 72  l */.  int nExtr
3d10: 61 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  a;              
3d20: 20 20 20 2f 2a 20 41 64 64 20 74 68 69 73 20 6d     /* Add this m
3d30: 61 6e 79 20 62 79 74 65 73 20 74 6f 20 65 61 63  any bytes to eac
3d40: 68 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65  h in-memory page
3d50: 20 2a 2f 0a 20 20 69 6e 74 20 70 61 67 65 53 69   */.  int pageSi
3d60: 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ze;             
3d70: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
3d80: 79 74 65 73 20 69 6e 20 61 20 70 61 67 65 20 2a  ytes in a page *
3d90: 2f 0a 20 20 69 6e 74 20 6e 50 61 67 65 3b 20 20  /.  int nPage;  
3da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3db0: 2f 2a 20 54 6f 74 61 6c 20 6e 75 6d 62 65 72 20  /* Total number 
3dc0: 6f 66 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67  of in-memory pag
3dd0: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 66  es */.  int nRef
3de0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3df0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
3e00: 20 69 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73   in-memory pages
3e10: 20 77 69 74 68 20 50 67 48 64 72 2e 6e 52 65 66   with PgHdr.nRef
3e20: 3e 30 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 50 61  >0 */.  int mxPa
3e30: 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
3e40: 20 20 20 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 6e      /* Maximum n
3e50: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 74  umber of pages t
3e60: 6f 20 68 6f 6c 64 20 69 6e 20 63 61 63 68 65 20  o hold in cache 
3e70: 2a 2f 0a 20 20 50 67 6e 6f 20 6d 78 50 67 6e 6f  */.  Pgno mxPgno
3e80: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
3e90: 20 2f 2a 20 4d 61 78 69 6d 75 6d 20 61 6c 6c 6f   /* Maximum allo
3ea0: 77 65 64 20 73 69 7a 65 20 6f 66 20 74 68 65 20  wed size of the 
3eb0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 75 38  database */.  u8
3ec0: 20 2a 61 49 6e 4a 6f 75 72 6e 61 6c 3b 20 20 20   *aInJournal;   
3ed0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65            /* One
3ee0: 20 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61   bit for each pa
3ef0: 67 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  ge in the databa
3f00: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 75 38 20  se file */.  u8 
3f10: 2a 61 49 6e 53 74 6d 74 3b 20 20 20 20 20 20 20  *aInStmt;       
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20           /* One 
3f30: 62 69 74 20 66 6f 72 20 65 61 63 68 20 70 61 67  bit for each pag
3f40: 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
3f50: 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 69  e */.  char *zFi
3f60: 6c 65 6e 61 6d 65 3b 20 20 20 20 20 20 20 20 20  lename;         
3f70: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
3f80: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
3f90: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  */.  char *zJour
3fa0: 6e 61 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  nal;            
3fb0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
3fd0: 20 20 63 68 61 72 20 2a 7a 44 69 72 65 63 74 6f    char *zDirecto
3fe0: 72 79 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ry;           /*
3ff0: 20 44 69 72 65 63 74 6f 72 79 20 68 6f 6c 64 20   Directory hold 
4000: 64 61 74 61 62 61 73 65 20 61 6e 64 20 6a 6f 75  database and jou
4010: 72 6e 61 6c 20 66 69 6c 65 73 20 2a 2f 0a 20 20  rnal files */.  
4020: 4f 73 46 69 6c 65 20 2a 66 64 2c 20 2a 6a 66 64  OsFile *fd, *jfd
4030: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46  ;           /* F
4040: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 73 20  ile descriptors 
4050: 66 6f 72 20 64 61 74 61 62 61 73 65 20 61 6e 64  for database and
4060: 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a 20 20 4f 73   journal */.  Os
4070: 46 69 6c 65 20 2a 73 74 66 64 3b 20 20 20 20 20  File *stfd;     
4080: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c            /* Fil
4090: 65 20 64 65 73 63 72 69 70 74 6f 72 20 66 6f 72  e descriptor for
40a0: 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 73   the statement s
40b0: 75 62 6a 6f 75 72 6e 61 6c 2a 2f 0a 20 20 42 75  ubjournal*/.  Bu
40c0: 73 79 48 61 6e 64 6c 65 72 20 2a 70 42 75 73 79  syHandler *pBusy
40d0: 48 61 6e 64 6c 65 72 3b 20 20 2f 2a 20 50 6f 69  Handler;  /* Poi
40e0: 6e 74 65 72 20 74 6f 20 73 71 6c 69 74 65 2e 62  nter to sqlite.b
40f0: 75 73 79 48 61 6e 64 6c 65 72 20 2a 2f 0a 20 20  usyHandler */.  
4100: 50 67 48 64 72 20 2a 70 46 69 72 73 74 2c 20 2a  PgHdr *pFirst, *
4110: 70 4c 61 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  pLast;      /* L
4120: 69 73 74 20 6f 66 20 66 72 65 65 20 70 61 67 65  ist of free page
4130: 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 46  s */.  PgHdr *pF
4140: 69 72 73 74 53 79 6e 63 65 64 3b 20 20 20 20 20  irstSynced;     
4150: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 72 65 65     /* First free
4160: 20 70 61 67 65 20 77 69 74 68 20 50 67 48 64 72   page with PgHdr
4170: 2e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 2a 2f 0a  .needSync==0 */.
4180: 20 20 50 67 48 64 72 20 2a 70 41 6c 6c 3b 20 20    PgHdr *pAll;  
4190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
41a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 70 61 67   List of all pag
41b0: 65 73 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70  es */.  PgHdr *p
41c0: 53 74 6d 74 3b 20 20 20 20 20 20 20 20 20 20 20  Stmt;           
41d0: 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 70      /* List of p
41e0: 61 67 65 73 20 69 6e 20 74 68 65 20 73 74 61 74  ages in the stat
41f0: 65 6d 65 6e 74 20 73 75 62 6a 6f 75 72 6e 61 6c  ement subjournal
4200: 20 2a 2f 0a 20 20 50 67 48 64 72 20 2a 70 44 69   */.  PgHdr *pDi
4210: 72 74 79 3b 20 20 20 20 20 20 20 20 20 20 20 20  rty;            
4220: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 61 6c 6c    /* List of all
4230: 20 64 69 72 74 79 20 70 61 67 65 73 20 2a 2f 0a   dirty pages */.
4240: 20 20 69 36 34 20 6a 6f 75 72 6e 61 6c 4f 66 66    i64 journalOff
4250: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
4260: 20 43 75 72 72 65 6e 74 20 62 79 74 65 20 6f 66   Current byte of
4270: 66 73 65 74 20 69 6e 20 74 68 65 20 6a 6f 75 72  fset in the jour
4280: 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 20 20 69 36  nal file */.  i6
4290: 34 20 6a 6f 75 72 6e 61 6c 48 64 72 3b 20 20 20  4 journalHdr;   
42a0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 42 79 74            /* Byt
42b0: 65 20 6f 66 66 73 65 74 20 74 6f 20 70 72 65 76  e offset to prev
42c0: 69 6f 75 73 20 6a 6f 75 72 6e 61 6c 20 68 65 61  ious journal hea
42d0: 64 65 72 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  der */.  i64 stm
42e0: 74 48 64 72 4f 66 66 3b 20 20 20 20 20 20 20 20  tHdrOff;        
42f0: 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6a 6f       /* First jo
4300: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 77 72 69  urnal header wri
4310: 74 74 65 6e 20 74 68 69 73 20 73 74 61 74 65 6d  tten this statem
4320: 65 6e 74 20 2a 2f 0a 20 20 69 36 34 20 73 74 6d  ent */.  i64 stm
4330: 74 43 6b 73 75 6d 3b 20 20 20 20 20 20 20 20 20  tCksum;         
4340: 20 20 20 20 20 2f 2a 20 63 6b 73 75 6d 49 6e 69       /* cksumIni
4350: 74 20 77 68 65 6e 20 73 74 61 74 65 6d 65 6e 74  t when statement
4360: 20 77 61 73 20 73 74 61 72 74 65 64 20 2a 2f 0a   was started */.
4370: 20 20 69 36 34 20 73 74 6d 74 4a 53 69 7a 65 3b    i64 stmtJSize;
4380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
4390: 20 53 69 7a 65 20 6f 66 20 6a 6f 75 72 6e 61 6c   Size of journal
43a0: 20 61 74 20 73 74 6d 74 5f 62 65 67 69 6e 28 29   at stmt_begin()
43b0: 20 2a 2f 0a 20 20 69 6e 74 20 73 65 63 74 6f 72   */.  int sector
43c0: 53 69 7a 65 3b 20 20 20 20 20 20 20 20 20 20 20  Size;           
43d0: 20 20 2f 2a 20 41 73 73 75 6d 65 64 20 73 65 63    /* Assumed sec
43e0: 74 6f 72 20 73 69 7a 65 20 64 75 72 69 6e 67 20  tor size during 
43f0: 72 6f 6c 6c 62 61 63 6b 20 2a 2f 0a 23 69 66 64  rollback */.#ifd
4400: 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 20  ef SQLITE_TEST. 
4410: 20 69 6e 74 20 6e 48 69 74 2c 20 6e 4d 69 73 73   int nHit, nMiss
4420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
4430: 43 61 63 68 65 20 68 69 74 73 20 61 6e 64 20 6d  Cache hits and m
4440: 69 73 73 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  issing */.  int 
4450: 6e 52 65 61 64 2c 20 6e 57 72 69 74 65 3b 20 20  nRead, nWrite;  
4460: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
4470: 61 73 65 20 70 61 67 65 73 20 72 65 61 64 2f 77  ase pages read/w
4480: 72 69 74 74 65 6e 20 2a 2f 0a 23 65 6e 64 69 66  ritten */.#endif
4490: 0a 20 20 76 6f 69 64 20 28 2a 78 44 65 73 74 72  .  void (*xDestr
44a0: 75 63 74 6f 72 29 28 44 62 50 61 67 65 2a 2c 69  uctor)(DbPage*,i
44b0: 6e 74 29 3b 20 2f 2a 20 43 61 6c 6c 20 74 68 69  nt); /* Call thi
44c0: 73 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 66  s routine when f
44d0: 72 65 65 69 6e 67 20 70 61 67 65 73 20 2a 2f 0a  reeing pages */.
44e0: 20 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74    void (*xReinit
44f0: 65 72 29 28 44 62 50 61 67 65 2a 2c 69 6e 74 29  er)(DbPage*,int)
4500: 3b 20 20 20 2f 2a 20 43 61 6c 6c 20 74 68 69 73  ;   /* Call this
4510: 20 72 6f 75 74 69 6e 65 20 77 68 65 6e 20 72 65   routine when re
4520: 6c 6f 61 64 69 6e 67 20 70 61 67 65 73 20 2a 2f  loading pages */
4530: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
4540: 41 53 5f 43 4f 44 45 43 0a 20 20 76 6f 69 64 20  AS_CODEC.  void 
4550: 2a 28 2a 78 43 6f 64 65 63 29 28 76 6f 69 64 2a  *(*xCodec)(void*
4560: 2c 76 6f 69 64 2a 2c 50 67 6e 6f 2c 69 6e 74 29  ,void*,Pgno,int)
4570: 3b 20 2f 2a 20 52 6f 75 74 69 6e 65 20 66 6f 72  ; /* Routine for
4580: 20 65 6e 2f 64 65 63 6f 64 69 6e 67 20 64 61 74   en/decoding dat
4590: 61 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 43 6f  a */.  void *pCo
45a0: 64 65 63 41 72 67 3b 20 20 20 20 20 20 20 20 20  decArg;         
45b0: 20 20 20 2f 2a 20 46 69 72 73 74 20 61 72 67 75     /* First argu
45c0: 6d 65 6e 74 20 74 6f 20 78 43 6f 64 65 63 28 29  ment to xCodec()
45d0: 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 69 6e 74   */.#endif.  int
45e0: 20 6e 48 61 73 68 3b 20 20 20 20 20 20 20 20 20   nHash;         
45f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65           /* Size
4600: 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 68 61   of the pager ha
4610: 73 68 20 74 61 62 6c 65 20 2a 2f 0a 20 20 50 67  sh table */.  Pg
4620: 48 64 72 20 2a 2a 61 48 61 73 68 3b 20 20 20 20  Hdr **aHash;    
4630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73            /* Has
4640: 68 20 74 61 62 6c 65 20 74 6f 20 6d 61 70 20 70  h table to map p
4650: 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 50 67  age number to Pg
4660: 48 64 72 20 2a 2f 0a 23 69 66 64 65 66 20 53 51  Hdr */.#ifdef SQ
4670: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f  LITE_ENABLE_MEMO
4680: 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20  RY_MANAGEMENT.  
4690: 50 61 67 65 72 20 2a 70 4e 65 78 74 3b 20 20 20  Pager *pNext;   
46a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
46b0: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61  inked list of pa
46c0: 67 65 72 73 20 69 6e 20 74 68 69 73 20 74 68 72  gers in this thr
46d0: 65 61 64 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20  ead */.#endif.  
46e0: 63 68 61 72 20 2a 70 54 6d 70 53 70 61 63 65 3b  char *pTmpSpace;
46f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
4700: 61 67 65 72 2e 70 61 67 65 53 69 7a 65 20 62 79  ager.pageSize by
4710: 74 65 73 20 6f 66 20 73 70 61 63 65 20 66 6f 72  tes of space for
4720: 20 74 6d 70 20 75 73 65 20 2a 2f 0a 20 20 63 68   tmp use */.  ch
4730: 61 72 20 64 62 46 69 6c 65 56 65 72 73 5b 31 36  ar dbFileVers[16
4740: 5d 3b 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61  ];        /* Cha
4750: 6e 67 65 73 20 77 68 65 6e 65 76 65 72 20 64 61  nges whenever da
4760: 74 61 62 61 73 65 20 66 69 6c 65 20 63 68 61 6e  tabase file chan
4770: 67 65 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ges */.};../*.**
4780: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
4790: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20  lobal variables 
47a0: 68 6f 6c 64 20 63 6f 75 6e 74 65 72 73 20 75 73  hold counters us
47b0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
47c0: 67 20 70 75 72 70 6f 73 65 73 20 6f 6e 6c 79 2e  g purposes only.
47d0: 20 20 54 68 65 73 65 20 76 61 72 69 61 62 6c 65    These variable
47e0: 73 20 64 6f 20 6e 6f 74 20 65 78 69 73 74 20 69  s do not exist i
47f0: 6e 0a 2a 2a 20 61 20 6e 6f 6e 2d 74 65 73 74 69  n.** a non-testi
4800: 6e 67 20 62 75 69 6c 64 2e 20 20 54 68 65 73 65  ng build.  These
4810: 20 76 61 72 69 61 62 6c 65 73 20 61 72 65 20 6e   variables are n
4820: 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a  ot thread-safe..
4830: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
4840: 5f 54 45 53 54 0a 69 6e 74 20 73 71 6c 69 74 65  _TEST.int sqlite
4850: 33 5f 70 61 67 65 72 5f 72 65 61 64 64 62 5f 63  3_pager_readdb_c
4860: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20  ount = 0;    /* 
4870: 4e 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70  Number of full p
4880: 61 67 65 73 20 72 65 61 64 20 66 72 6f 6d 20 44  ages read from D
4890: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48a0: 5f 70 61 67 65 72 5f 77 72 69 74 65 64 62 5f 63  _pager_writedb_c
48b0: 6f 75 6e 74 20 3d 20 30 3b 20 20 20 2f 2a 20 4e  ount = 0;   /* N
48c0: 75 6d 62 65 72 20 6f 66 20 66 75 6c 6c 20 70 61  umber of full pa
48d0: 67 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 44  ges written to D
48e0: 42 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  B */.int sqlite3
48f0: 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
4900: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4910: 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73 20 77  umber of pages w
4920: 72 69 74 74 65 6e 20 74 6f 20 6a 6f 75 72 6e 61  ritten to journa
4930: 6c 20 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  l */.int sqlite3
4940: 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63 6f  _pager_pgfree_co
4950: 75 6e 74 20 3d 20 30 3b 20 20 20 20 2f 2a 20 4e  unt = 0;    /* N
4960: 75 6d 62 65 72 20 6f 66 20 63 61 63 68 65 20 70  umber of cache p
4970: 61 67 65 73 20 66 72 65 65 64 20 2a 2f 0a 23 20  ages freed */.# 
4980: 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49 4e 43  define PAGER_INC
4990: 52 28 76 29 20 20 76 2b 2b 0a 23 65 6c 73 65 0a  R(v)  v++.#else.
49a0: 23 20 64 65 66 69 6e 65 20 50 41 47 45 52 5f 49  # define PAGER_I
49b0: 4e 43 52 28 76 29 0a 23 65 6e 64 69 66 0a 0a 0a  NCR(v).#endif...
49c0: 0a 2f 2a 0a 2a 2a 20 4a 6f 75 72 6e 61 6c 20 66  ./*.** Journal f
49d0: 69 6c 65 73 20 62 65 67 69 6e 20 77 69 74 68 20  iles begin with 
49e0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61  the following ma
49f0: 67 69 63 20 73 74 72 69 6e 67 2e 20 20 54 68 65  gic string.  The
4a00: 20 64 61 74 61 0a 2a 2a 20 77 61 73 20 6f 62 74   data.** was obt
4a10: 61 69 6e 65 64 20 66 72 6f 6d 20 2f 64 65 76 2f  ained from /dev/
4a20: 72 61 6e 64 6f 6d 2e 20 20 49 74 20 69 73 20 75  random.  It is u
4a30: 73 65 64 20 6f 6e 6c 79 20 61 73 20 61 20 73 61  sed only as a sa
4a40: 6e 69 74 79 20 63 68 65 63 6b 2e 0a 2a 2a 0a 2a  nity check..**.*
4a50: 2a 20 53 69 6e 63 65 20 76 65 72 73 69 6f 6e 20  * Since version 
4a60: 32 2e 38 2e 30 2c 20 74 68 65 20 6a 6f 75 72 6e  2.8.0, the journ
4a70: 61 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 74 61 69  al format contai
4a80: 6e 73 20 61 64 64 69 74 69 6f 6e 61 6c 20 73 61  ns additional sa
4a90: 6e 69 74 79 0a 2a 2a 20 63 68 65 63 6b 69 6e 67  nity.** checking
4aa0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 20 20 49   information.  I
4ab0: 66 20 74 68 65 20 70 6f 77 65 72 20 66 61 69 6c  f the power fail
4ac0: 73 20 77 68 69 6c 65 20 74 68 65 20 6a 6f 75 72  s while the jour
4ad0: 6e 61 6c 20 69 73 20 62 65 67 69 6e 0a 2a 2a 20  nal is begin.** 
4ae0: 77 72 69 74 74 65 6e 2c 20 73 65 6d 69 2d 72 61  written, semi-ra
4af0: 6e 64 6f 6d 20 67 61 72 62 61 67 65 20 64 61 74  ndom garbage dat
4b00: 61 20 6d 69 67 68 74 20 61 70 70 65 61 72 20 69  a might appear i
4b10: 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a  n the journal.**
4b20: 20 66 69 6c 65 20 61 66 74 65 72 20 70 6f 77 65   file after powe
4b30: 72 20 69 73 20 72 65 73 74 6f 72 65 64 2e 20 20  r is restored.  
4b40: 49 66 20 61 6e 20 61 74 74 65 6d 70 74 20 69 73  If an attempt is
4b50: 20 74 68 65 6e 20 6d 61 64 65 0a 2a 2a 20 74 6f   then made.** to
4b60: 20 72 6f 6c 6c 20 74 68 65 20 6a 6f 75 72 6e 61   roll the journa
4b70: 6c 20 62 61 63 6b 2c 20 74 68 65 20 64 61 74 61  l back, the data
4b80: 62 61 73 65 20 63 6f 75 6c 64 20 62 65 20 63 6f  base could be co
4b90: 72 72 75 70 74 65 64 2e 20 20 54 68 65 20 61 64  rrupted.  The ad
4ba0: 64 69 74 69 6f 6e 61 6c 0a 2a 2a 20 73 61 6e 69  ditional.** sani
4bb0: 74 79 20 63 68 65 63 6b 69 6e 67 20 64 61 74 61  ty checking data
4bc0: 20 69 73 20 61 6e 20 61 74 74 65 6d 70 74 20 74   is an attempt t
4bd0: 6f 20 64 69 73 63 6f 76 65 72 20 74 68 65 20 67  o discover the g
4be0: 61 72 62 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  arbage in the.**
4bf0: 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20 69 67 6e   journal and ign
4c00: 6f 72 65 20 69 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  ore it..**.** Th
4c10: 65 20 73 61 6e 69 74 79 20 63 68 65 63 6b 69 6e  e sanity checkin
4c20: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  g information fo
4c30: 72 20 74 68 65 20 6e 65 77 20 6a 6f 75 72 6e 61  r the new journa
4c40: 6c 20 66 6f 72 6d 61 74 20 63 6f 6e 73 69 73 74  l format consist
4c50: 73 0a 2a 2a 20 6f 66 20 61 20 33 32 2d 62 69 74  s.** of a 32-bit
4c60: 20 63 68 65 63 6b 73 75 6d 20 6f 6e 20 65 61 63   checksum on eac
4c70: 68 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 20  h page of data. 
4c80: 20 54 68 65 20 63 68 65 63 6b 73 75 6d 20 63 6f   The checksum co
4c90: 76 65 72 73 20 62 6f 74 68 0a 2a 2a 20 74 68 65  vers both.** the
4ca0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 61 6e 64   page number and
4cb0: 20 74 68 65 20 70 50 61 67 65 72 2d 3e 70 61 67   the pPager->pag
4cc0: 65 53 69 7a 65 20 62 79 74 65 73 20 6f 66 20 64  eSize bytes of d
4cd0: 61 74 61 20 66 6f 72 20 74 68 65 20 70 61 67 65  ata for the page
4ce0: 2e 0a 2a 2a 20 54 68 69 73 20 63 6b 73 75 6d 20  ..** This cksum 
4cf0: 69 73 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74  is initialized t
4d00: 6f 20 61 20 33 32 2d 62 69 74 20 72 61 6e 64 6f  o a 32-bit rando
4d10: 6d 20 76 61 6c 75 65 20 74 68 61 74 20 61 70 70  m value that app
4d20: 65 61 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 6a  ears in the.** j
4d30: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 72 69 67 68  ournal file righ
4d40: 74 20 61 66 74 65 72 20 74 68 65 20 68 65 61 64  t after the head
4d50: 65 72 2e 20 20 54 68 65 20 72 61 6e 64 6f 6d 20  er.  The random 
4d60: 69 6e 69 74 69 61 6c 69 7a 65 72 20 69 73 20 69  initializer is i
4d70: 6d 70 6f 72 74 61 6e 74 2c 0a 2a 2a 20 62 65 63  mportant,.** bec
4d80: 61 75 73 65 20 67 61 72 62 61 67 65 20 64 61 74  ause garbage dat
4d90: 61 20 74 68 61 74 20 61 70 70 65 61 72 73 20 61  a that appears a
4da0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20 6a  t the end of a j
4db0: 6f 75 72 6e 61 6c 20 69 73 20 6c 69 6b 65 6c 79  ournal is likely
4dc0: 0a 2a 2a 20 64 61 74 61 20 74 68 61 74 20 77 61  .** data that wa
4dd0: 73 20 6f 6e 63 65 20 69 6e 20 6f 74 68 65 72 20  s once in other 
4de0: 66 69 6c 65 73 20 74 68 61 74 20 68 61 76 65 20  files that have 
4df0: 6e 6f 77 20 62 65 65 6e 20 64 65 6c 65 74 65 64  now been deleted
4e00: 2e 20 20 49 66 20 74 68 65 0a 2a 2a 20 67 61 72  .  If the.** gar
4e10: 62 61 67 65 20 64 61 74 61 20 63 61 6d 65 20 66  bage data came f
4e20: 72 6f 6d 20 61 6e 20 6f 62 73 6f 6c 65 74 65 20  rom an obsolete 
4e30: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
4e40: 65 20 63 68 65 63 6b 73 75 6d 73 20 6d 69 67 68  e checksums migh
4e50: 74 0a 2a 2a 20 62 65 20 63 6f 72 72 65 63 74 2e  t.** be correct.
4e60: 20 20 42 75 74 20 62 79 20 69 6e 69 74 69 61 6c    But by initial
4e70: 69 7a 69 6e 67 20 74 68 65 20 63 68 65 63 6b 73  izing the checks
4e80: 75 6d 20 74 6f 20 72 61 6e 64 6f 6d 20 76 61 6c  um to random val
4e90: 75 65 20 77 68 69 63 68 0a 2a 2a 20 69 73 20 64  ue which.** is d
4ea0: 69 66 66 65 72 65 6e 74 20 66 6f 72 20 65 76 65  ifferent for eve
4eb0: 72 79 20 6a 6f 75 72 6e 61 6c 2c 20 77 65 20 6d  ry journal, we m
4ec0: 69 6e 69 6d 69 7a 65 20 74 68 61 74 20 72 69 73  inimize that ris
4ed0: 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  k..*/.static con
4ee0: 73 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  st unsigned char
4ef0: 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d   aJournalMagic[]
4f00: 20 3d 20 7b 0a 20 20 30 78 64 39 2c 20 30 78 64   = {.  0xd9, 0xd
4f10: 35 2c 20 30 78 30 35 2c 20 30 78 66 39 2c 20 30  5, 0x05, 0xf9, 0
4f20: 78 32 30 2c 20 30 78 61 31 2c 20 30 78 36 33 2c  x20, 0xa1, 0x63,
4f30: 20 30 78 64 37 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   0xd7,.};../*.**
4f40: 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65   The size of the
4f50: 20 68 65 61 64 65 72 20 61 6e 64 20 6f 66 20 65   header and of e
4f60: 61 63 68 20 70 61 67 65 20 69 6e 20 74 68 65 20  ach page in the 
4f70: 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 74 65 72  journal is deter
4f80: 6d 69 6e 65 64 0a 2a 2a 20 62 79 20 74 68 65 20  mined.** by the 
4f90: 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 63 72 6f 73  following macros
4fa0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 4a 4f 55  ..*/.#define JOU
4fb0: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
4fc0: 72 29 20 20 28 28 70 50 61 67 65 72 2d 3e 70 61  r)  ((pPager->pa
4fd0: 67 65 53 69 7a 65 29 20 2b 20 38 29 0a 0a 2f 2a  geSize) + 8)../*
4fe0: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
4ff0: 68 65 61 64 65 72 20 73 69 7a 65 20 66 6f 72 20  header size for 
5000: 74 68 69 73 20 70 61 67 65 72 2e 20 49 6e 20 74  this pager. In t
5010: 68 65 20 66 75 74 75 72 65 2c 20 74 68 69 73 20  he future, this 
5020: 63 6f 75 6c 64 20 62 65 0a 2a 2a 20 73 65 74 20  could be.** set 
5030: 74 6f 20 73 6f 6d 65 20 76 61 6c 75 65 20 72 65  to some value re
5040: 61 64 20 66 72 6f 6d 20 74 68 65 20 64 69 73 6b  ad from the disk
5050: 20 63 6f 6e 74 72 6f 6c 6c 65 72 2e 20 54 68 65   controller. The
5060: 20 69 6d 70 6f 72 74 61 6e 74 0a 2a 2a 20 63 68   important.** ch
5070: 61 72 61 63 74 65 72 69 73 74 69 63 20 69 73 20  aracteristic is 
5080: 74 68 61 74 20 69 74 20 69 73 20 74 68 65 20 73  that it is the s
5090: 61 6d 65 20 73 69 7a 65 20 61 73 20 61 20 64 69  ame size as a di
50a0: 73 6b 20 73 65 63 74 6f 72 2e 0a 2a 2f 0a 23 64  sk sector..*/.#d
50b0: 65 66 69 6e 65 20 4a 4f 55 52 4e 41 4c 5f 48 44  efine JOURNAL_HD
50c0: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 28 70 50  R_SZ(pPager) (pP
50d0: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
50e0: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 63  )../*.** The mac
50f0: 72 6f 20 4d 45 4d 44 42 20 69 73 20 74 72 75 65  ro MEMDB is true
5100: 20 69 66 20 77 65 20 61 72 65 20 64 65 61 6c 69   if we are deali
5110: 6e 67 20 77 69 74 68 20 61 6e 20 69 6e 2d 6d 65  ng with an in-me
5120: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 2e 0a 2a  mory database..*
5130: 2a 20 57 65 20 64 6f 20 74 68 69 73 20 61 73 20  * We do this as 
5140: 61 20 6d 61 63 72 6f 20 73 6f 20 74 68 61 74 20  a macro so that 
5150: 69 66 20 74 68 65 20 53 51 4c 49 54 45 5f 4f 4d  if the SQLITE_OM
5160: 49 54 5f 4d 45 4d 4f 52 59 44 42 20 6d 61 63 72  IT_MEMORYDB macr
5170: 6f 20 69 73 20 73 65 74 2c 0a 2a 2a 20 74 68 65  o is set,.** the
5180: 20 76 61 6c 75 65 20 6f 66 20 4d 45 4d 44 42 20   value of MEMDB 
5190: 77 69 6c 6c 20 62 65 20 61 20 63 6f 6e 73 74 61  will be a consta
51a0: 6e 74 20 61 6e 64 20 74 68 65 20 63 6f 6d 70 69  nt and the compi
51b0: 6c 65 72 20 77 69 6c 6c 20 6f 70 74 69 6d 69 7a  ler will optimiz
51c0: 65 0a 2a 2a 20 6f 75 74 20 63 6f 64 65 20 74 68  e.** out code th
51d0: 61 74 20 77 6f 75 6c 64 20 6e 65 76 65 72 20 65  at would never e
51e0: 78 65 63 75 74 65 2e 0a 2a 2f 0a 23 69 66 64 65  xecute..*/.#ifde
51f0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
5200: 4d 4f 52 59 44 42 0a 23 20 64 65 66 69 6e 65 20  MORYDB.# define 
5210: 4d 45 4d 44 42 20 30 0a 23 65 6c 73 65 0a 23 20  MEMDB 0.#else.# 
5220: 64 65 66 69 6e 65 20 4d 45 4d 44 42 20 70 50 61  define MEMDB pPa
5230: 67 65 72 2d 3e 6d 65 6d 44 62 0a 23 65 6e 64 69  ger->memDb.#endi
5240: 66 0a 0a 2f 2a 0a 2a 2a 20 50 61 67 65 20 6e 75  f../*.** Page nu
5250: 6d 62 65 72 20 50 41 47 45 52 5f 4d 4a 5f 50 47  mber PAGER_MJ_PG
5260: 4e 4f 20 69 73 20 6e 65 76 65 72 20 75 73 65 64  NO is never used
5270: 20 69 6e 20 61 6e 20 53 51 4c 69 74 65 20 64 61   in an SQLite da
5280: 74 61 62 61 73 65 20 28 69 74 20 69 73 0a 2a 2a  tabase (it is.**
5290: 20 72 65 73 65 72 76 65 64 20 66 6f 72 20 77 6f   reserved for wo
52a0: 72 6b 69 6e 67 20 61 72 6f 75 6e 64 20 61 20 77  rking around a w
52b0: 69 6e 64 6f 77 73 2f 70 6f 73 69 78 20 69 6e 63  indows/posix inc
52c0: 6f 6d 70 61 74 69 62 69 6c 69 74 79 29 2e 20 49  ompatibility). I
52d0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 20 69 6e 20  t is.** used in 
52e0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 74 6f 20 73  the journal to s
52f0: 69 67 6e 69 66 79 20 74 68 61 74 20 74 68 65 20  ignify that the 
5300: 72 65 6d 61 69 6e 64 65 72 20 6f 66 20 74 68 65  remainder of the
5310: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 0a 2a   journal file .*
5320: 2a 20 69 73 20 64 65 76 6f 74 65 64 20 74 6f 20  * is devoted to 
5330: 73 74 6f 72 69 6e 67 20 61 20 6d 61 73 74 65 72  storing a master
5340: 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 2d 20   journal name - 
5350: 74 68 65 72 65 20 61 72 65 20 6e 6f 20 6d 6f 72  there are no mor
5360: 65 20 70 61 67 65 73 20 74 6f 0a 2a 2a 20 72 6f  e pages to.** ro
5370: 6c 6c 20 62 61 63 6b 2e 20 53 65 65 20 63 6f 6d  ll back. See com
5380: 6d 65 6e 74 73 20 66 6f 72 20 66 75 6e 63 74 69  ments for functi
5390: 6f 6e 20 77 72 69 74 65 4d 61 73 74 65 72 4a 6f  on writeMasterJo
53a0: 75 72 6e 61 6c 28 29 20 66 6f 72 20 64 65 74 61  urnal() for deta
53b0: 69 6c 73 2e 0a 2a 2f 0a 2f 2a 20 23 64 65 66 69  ils..*/./* #defi
53c0: 6e 65 20 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  ne PAGER_MJ_PGNO
53d0: 28 78 29 20 28 50 45 4e 44 49 4e 47 5f 42 59 54  (x) (PENDING_BYT
53e0: 45 2f 28 28 78 29 2d 3e 70 61 67 65 53 69 7a 65  E/((x)->pageSize
53f0: 29 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 50 41  )) */.#define PA
5400: 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 78 29 20 28  GER_MJ_PGNO(x) (
5410: 28 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f 28 28  (PENDING_BYTE/((
5420: 78 29 2d 3e 70 61 67 65 53 69 7a 65 29 29 2b 31  x)->pageSize))+1
5430: 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6d 61 78  )../*.** The max
5440: 69 6d 75 6d 20 6c 65 67 61 6c 20 70 61 67 65 20  imum legal page 
5450: 6e 75 6d 62 65 72 20 69 73 20 28 32 5e 33 31 20  number is (2^31 
5460: 2d 20 31 29 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  - 1)..*/.#define
5470: 20 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20   PAGER_MAX_PGNO 
5480: 32 31 34 37 34 38 33 36 34 37 0a 0a 2f 2a 0a 2a  2147483647../*.*
5490: 2a 20 45 6e 61 62 6c 65 20 72 65 66 65 72 65 6e  * Enable referen
54a0: 63 65 20 63 6f 75 6e 74 20 74 72 61 63 6b 69 6e  ce count trackin
54b0: 67 20 28 66 6f 72 20 64 65 62 75 67 67 69 6e 67  g (for debugging
54c0: 29 20 68 65 72 65 3a 0a 2a 2f 0a 23 69 66 64 65  ) here:.*/.#ifde
54d0: 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
54e0: 20 69 6e 74 20 70 61 67 65 72 33 5f 72 65 66 69   int pager3_refi
54f0: 6e 66 6f 5f 65 6e 61 62 6c 65 20 3d 20 30 3b 0a  nfo_enable = 0;.
5500: 20 20 73 74 61 74 69 63 20 76 6f 69 64 20 70 61    static void pa
5510: 67 65 72 5f 72 65 66 69 6e 66 6f 28 50 67 48 64  ger_refinfo(PgHd
5520: 72 20 2a 70 29 7b 0a 20 20 20 20 73 74 61 74 69  r *p){.    stati
5530: 63 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 0a 20  c int cnt = 0;. 
5540: 20 20 20 69 66 28 20 21 70 61 67 65 72 33 5f 72     if( !pager3_r
5550: 65 66 69 6e 66 6f 5f 65 6e 61 62 6c 65 20 29 20  efinfo_enable ) 
5560: 72 65 74 75 72 6e 3b 0a 20 20 20 20 73 71 6c 69  return;.    sqli
5570: 74 65 33 44 65 62 75 67 50 72 69 6e 74 66 28 0a  te3DebugPrintf(.
5580: 20 20 20 20 20 20 20 22 52 45 46 43 4e 54 3a 20         "REFCNT: 
5590: 25 34 64 20 61 64 64 72 3d 25 70 20 6e 52 65 66  %4d addr=%p nRef
55a0: 3d 25 2d 33 64 20 74 6f 74 61 6c 3d 25 64 5c 6e  =%-3d total=%d\n
55b0: 22 2c 0a 20 20 20 20 20 20 20 70 2d 3e 70 67 6e  ",.       p->pgn
55c0: 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41 54 41  o, PGHDR_TO_DATA
55d0: 28 70 29 2c 20 70 2d 3e 6e 52 65 66 2c 20 70 2d  (p), p->nRef, p-
55e0: 3e 70 50 61 67 65 72 2d 3e 6e 52 65 66 0a 20 20  >pPager->nRef.  
55f0: 20 20 29 3b 0a 20 20 20 20 63 6e 74 2b 2b 3b 20    );.    cnt++; 
5600: 20 20 2f 2a 20 53 6f 6d 65 74 68 69 6e 67 20 74    /* Something t
5610: 6f 20 73 65 74 20 61 20 62 72 65 61 6b 70 6f 69  o set a breakpoi
5620: 6e 74 20 6f 6e 20 2a 2f 0a 20 20 7d 0a 23 20 64  nt on */.  }.# d
5630: 65 66 69 6e 65 20 52 45 46 49 4e 46 4f 28 58 29  efine REFINFO(X)
5640: 20 20 70 61 67 65 72 5f 72 65 66 69 6e 66 6f 28    pager_refinfo(
5650: 58 29 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  X).#else.# defin
5660: 65 20 52 45 46 49 4e 46 4f 28 58 29 0a 23 65 6e  e REFINFO(X).#en
5670: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  dif../*.** Retur
5680: 6e 20 74 72 75 65 20 69 66 20 70 61 67 65 20 2a  n true if page *
5690: 70 50 67 20 68 61 73 20 61 6c 72 65 61 64 79 20  pPg has already 
56a0: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
56b0: 74 68 65 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2a  the statement.**
56c0: 20 6a 6f 75 72 6e 61 6c 20 28 6f 72 20 73 74 61   journal (or sta
56d0: 74 65 6d 65 6e 74 20 73 6e 61 70 73 68 6f 74 20  tement snapshot 
56e0: 68 61 73 20 62 65 65 6e 20 63 72 65 61 74 65 64  has been created
56f0: 2c 20 69 66 20 2a 70 50 67 20 69 73 20 70 61 72  , if *pPg is par
5700: 74 0a 2a 2a 20 6f 66 20 61 6e 20 69 6e 2d 6d 65  t.** of an in-me
5710: 6d 6f 72 79 20 64 61 74 61 62 61 73 65 29 2e 0a  mory database)..
5720: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
5730: 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 50 67  geInStatement(Pg
5740: 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67  Hdr *pPg){.  Pag
5750: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67  er *pPager = pPg
5760: 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 66 28 20  ->pPager;.  if( 
5770: 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 72 65 74  MEMDB ){.    ret
5780: 75 72 6e 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  urn PGHDR_TO_HIS
5790: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 2d 3e  T(pPg, pPager)->
57a0: 69 6e 53 74 6d 74 3b 0a 20 20 7d 65 6c 73 65 7b  inStmt;.  }else{
57b0: 0a 20 20 20 20 50 67 6e 6f 20 70 67 6e 6f 20 3d  .    Pgno pgno =
57c0: 20 70 50 67 2d 3e 70 67 6e 6f 3b 0a 20 20 20 20   pPg->pgno;.    
57d0: 75 38 20 2a 61 20 3d 20 70 50 61 67 65 72 2d 3e  u8 *a = pPager->
57e0: 61 49 6e 53 74 6d 74 3b 0a 20 20 20 20 72 65 74  aInStmt;.    ret
57f0: 75 72 6e 20 28 61 20 26 26 20 28 69 6e 74 29 70  urn (a && (int)p
5800: 67 6e 6f 3c 3d 70 50 61 67 65 72 2d 3e 73 74 6d  gno<=pPager->stm
5810: 74 53 69 7a 65 20 26 26 20 28 61 5b 70 67 6e 6f  tSize && (a[pgno
5820: 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e 6f 26  /8] & (1<<(pgno&
5830: 37 29 29 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  7))));.  }.}../*
5840: 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20 73  .** Change the s
5850: 69 7a 65 20 6f 66 20 74 68 65 20 70 61 67 65 72  ize of the pager
5860: 20 68 61 73 68 20 74 61 62 6c 65 20 74 6f 20 4e   hash table to N
5870: 2e 20 20 4e 20 6d 75 73 74 20 62 65 20 61 20 70  .  N must be a p
5880: 6f 77 65 72 0a 2a 2a 20 6f 66 20 74 77 6f 2e 0a  ower.** of two..
5890: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
58a0: 61 67 65 72 5f 72 65 73 69 7a 65 5f 68 61 73 68  ager_resize_hash
58b0: 5f 74 61 62 6c 65 28 50 61 67 65 72 20 2a 70 50  _table(Pager *pP
58c0: 61 67 65 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  ager, int N){.  
58d0: 50 67 48 64 72 20 2a 2a 61 48 61 73 68 2c 20 2a  PgHdr **aHash, *
58e0: 70 50 67 3b 0a 20 20 61 73 73 65 72 74 28 20 4e  pPg;.  assert( N
58f0: 3e 30 20 26 26 20 28 4e 26 28 4e 2d 31 29 29 3d  >0 && (N&(N-1))=
5900: 3d 30 20 29 3b 0a 20 20 61 48 61 73 68 20 3d 20  =0 );.  aHash = 
5910: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
5920: 7a 65 6f 66 28 61 48 61 73 68 5b 30 5d 29 2a 4e  zeof(aHash[0])*N
5930: 20 29 3b 0a 20 20 69 66 28 20 61 48 61 73 68 3d   );.  if( aHash=
5940: 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 46 61 69  =0 ){.    /* Fai
5950: 6c 75 72 65 20 74 6f 20 72 65 68 61 73 68 20 69  lure to rehash i
5960: 73 20 6e 6f 74 20 61 6e 20 65 72 72 6f 72 2e 20  s not an error. 
5970: 20 49 74 20 69 73 20 6f 6e 6c 79 20 61 20 70 65   It is only a pe
5980: 72 66 6f 72 6d 61 6e 63 65 20 68 69 74 2e 20 2a  rformance hit. *
5990: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
59a0: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
59b0: 50 61 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20  Pager->aHash);. 
59c0: 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 20 3d   pPager->nHash =
59d0: 20 4e 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48   N;.  pPager->aH
59e0: 61 73 68 20 3d 20 61 48 61 73 68 3b 0a 20 20 66  ash = aHash;.  f
59f0: 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70  or(pPg=pPager->p
5a00: 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50  All; pPg; pPg=pP
5a10: 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20  g->pNextAll){.  
5a20: 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 69 66 28    int h;.    if(
5a30: 20 70 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 7b   pPg->pgno==0 ){
5a40: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
5a50: 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3d 3d 30  Pg->pNextHash==0
5a60: 20 26 26 20 70 50 67 2d 3e 70 50 72 65 76 48 61   && pPg->pPrevHa
5a70: 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 63  sh==0 );.      c
5a80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
5a90: 20 20 20 68 20 3d 20 70 50 67 2d 3e 70 67 6e 6f     h = pPg->pgno
5aa0: 20 26 20 28 4e 2d 31 29 3b 0a 20 20 20 20 70 50   & (N-1);.    pP
5ab0: 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d 20 61  g->pNextHash = a
5ac0: 48 61 73 68 5b 68 5d 3b 0a 20 20 20 20 69 66 28  Hash[h];.    if(
5ad0: 20 61 48 61 73 68 5b 68 5d 20 29 7b 0a 20 20 20   aHash[h] ){.   
5ae0: 20 20 20 61 48 61 73 68 5b 68 5d 2d 3e 70 50 72     aHash[h]->pPr
5af0: 65 76 48 61 73 68 20 3d 20 70 50 67 3b 0a 20 20  evHash = pPg;.  
5b00: 20 20 7d 0a 20 20 20 20 61 48 61 73 68 5b 68 5d    }.    aHash[h]
5b10: 20 3d 20 70 50 67 3b 0a 20 20 20 20 70 50 67 2d   = pPg;.    pPg-
5b20: 3e 70 50 72 65 76 48 61 73 68 20 3d 20 30 3b 0a  >pPrevHash = 0;.
5b30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 61    }.}../*.** Rea
5b40: 64 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  d a 32-bit integ
5b50: 65 72 20 66 72 6f 6d 20 74 68 65 20 67 69 76 65  er from the give
5b60: 6e 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f  n file descripto
5b70: 72 2e 20 20 53 74 6f 72 65 20 74 68 65 20 69 6e  r.  Store the in
5b80: 74 65 67 65 72 0a 2a 2a 20 74 68 61 74 20 69 73  teger.** that is
5b90: 20 72 65 61 64 20 69 6e 20 2a 70 52 65 73 2e 20   read in *pRes. 
5ba0: 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   Return SQLITE_O
5bb0: 4b 20 69 66 20 65 76 65 72 79 74 68 69 6e 67 20  K if everything 
5bc0: 77 6f 72 6b 65 64 2c 20 6f 72 20 61 6e 0a 2a 2a  worked, or an.**
5bd0: 20 65 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73   error code is s
5be0: 6f 6d 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72  omething goes wr
5bf0: 6f 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 76  ong..**.** All v
5c00: 61 6c 75 65 73 20 61 72 65 20 73 74 6f 72 65 64  alues are stored
5c10: 20 6f 6e 20 64 69 73 6b 20 61 73 20 62 69 67 2d   on disk as big-
5c20: 65 6e 64 69 61 6e 2e 0a 2a 2f 0a 73 74 61 74 69  endian..*/.stati
5c30: 63 20 69 6e 74 20 72 65 61 64 33 32 62 69 74 73  c int read32bits
5c40: 28 4f 73 46 69 6c 65 20 2a 66 64 2c 20 75 33 32  (OsFile *fd, u32
5c50: 20 2a 70 52 65 73 29 7b 0a 20 20 75 6e 73 69 67   *pRes){.  unsig
5c60: 6e 65 64 20 63 68 61 72 20 61 63 5b 34 5d 3b 0a  ned char ac[4];.
5c70: 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74    int rc = sqlit
5c80: 65 33 4f 73 52 65 61 64 28 66 64 2c 20 61 63 2c  e3OsRead(fd, ac,
5c90: 20 73 69 7a 65 6f 66 28 61 63 29 29 3b 0a 20 20   sizeof(ac));.  
5ca0: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
5cb0: 4b 20 29 7b 0a 20 20 20 20 2a 70 52 65 73 20 3d  K ){.    *pRes =
5cc0: 20 73 71 6c 69 74 65 33 47 65 74 34 62 79 74 65   sqlite3Get4byte
5cd0: 28 61 63 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  (ac);.  }.  retu
5ce0: 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
5cf0: 57 72 69 74 65 20 61 20 33 32 2d 62 69 74 20 69  Write a 32-bit i
5d00: 6e 74 65 67 65 72 20 69 6e 74 6f 20 61 20 73 74  nteger into a st
5d10: 72 69 6e 67 20 62 75 66 66 65 72 20 69 6e 20 62  ring buffer in b
5d20: 69 67 2d 65 6e 64 69 61 6e 20 62 79 74 65 20 6f  ig-endian byte o
5d30: 72 64 65 72 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  rder..*/.#define
5d40: 20 70 75 74 33 32 62 69 74 73 28 41 2c 42 29 20   put32bits(A,B) 
5d50: 20 73 71 6c 69 74 65 33 50 75 74 34 62 79 74 65   sqlite3Put4byte
5d60: 28 28 75 38 2a 29 41 2c 42 29 0a 0a 2f 2a 0a 2a  ((u8*)A,B)../*.*
5d70: 2a 20 57 72 69 74 65 20 61 20 33 32 2d 62 69 74  * Write a 32-bit
5d80: 20 69 6e 74 65 67 65 72 20 69 6e 74 6f 20 74 68   integer into th
5d90: 65 20 67 69 76 65 6e 20 66 69 6c 65 20 64 65 73  e given file des
5da0: 63 72 69 70 74 6f 72 2e 20 20 52 65 74 75 72 6e  criptor.  Return
5db0: 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a 2a 20 6f 6e   SQLITE_OK.** on
5dc0: 20 73 75 63 63 65 73 73 20 6f 72 20 61 6e 20 65   success or an e
5dd0: 72 72 6f 72 20 63 6f 64 65 20 69 73 20 73 6f 6d  rror code is som
5de0: 65 74 68 69 6e 67 20 67 6f 65 73 20 77 72 6f 6e  ething goes wron
5df0: 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
5e00: 20 77 72 69 74 65 33 32 62 69 74 73 28 4f 73 46   write32bits(OsF
5e10: 69 6c 65 20 2a 66 64 2c 20 75 33 32 20 76 61 6c  ile *fd, u32 val
5e20: 29 7b 0a 20 20 63 68 61 72 20 61 63 5b 34 5d 3b  ){.  char ac[4];
5e30: 0a 20 20 70 75 74 33 32 62 69 74 73 28 61 63 2c  .  put32bits(ac,
5e40: 20 76 61 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20   val);.  return 
5e50: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 66  sqlite3OsWrite(f
5e60: 64 2c 20 61 63 2c 20 34 29 3b 0a 7d 0a 0a 2f 2a  d, ac, 4);.}../*
5e70: 0a 2a 2a 20 52 65 61 64 20 61 20 33 32 2d 62 69  .** Read a 32-bi
5e80: 74 20 69 6e 74 65 67 65 72 20 61 74 20 6f 66 66  t integer at off
5e90: 73 65 74 20 27 6f 66 66 73 65 74 27 20 66 72 6f  set 'offset' fro
5ea0: 6d 20 74 68 65 20 70 61 67 65 20 69 64 65 6e 74  m the page ident
5eb0: 69 66 69 65 64 20 62 79 0a 2a 2a 20 70 61 67 65  ified by.** page
5ec0: 20 68 65 61 64 65 72 20 27 70 27 2e 0a 2a 2f 0a   header 'p'..*/.
5ed0: 73 74 61 74 69 63 20 75 33 32 20 72 65 74 72 69  static u32 retri
5ee0: 65 76 65 33 32 62 69 74 73 28 50 67 48 64 72 20  eve32bits(PgHdr 
5ef0: 2a 70 2c 20 69 6e 74 20 6f 66 66 73 65 74 29 7b  *p, int offset){
5f00: 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72  .  unsigned char
5f10: 20 2a 61 63 3b 0a 20 20 61 63 20 3d 20 26 28 28   *ac;.  ac = &((
5f20: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a 29 50  unsigned char*)P
5f30: 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 29 29  GHDR_TO_DATA(p))
5f40: 5b 6f 66 66 73 65 74 5d 3b 0a 20 20 72 65 74 75  [offset];.  retu
5f50: 72 6e 20 73 71 6c 69 74 65 33 47 65 74 34 62 79  rn sqlite3Get4by
5f60: 74 65 28 61 63 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  te(ac);.}.../*.*
5f70: 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
5f80: 73 68 6f 75 6c 64 20 62 65 20 63 61 6c 6c 65 64  should be called
5f90: 20 77 68 65 6e 20 61 6e 20 65 72 72 6f 72 20 6f   when an error o
5fa0: 63 63 75 72 73 20 77 69 74 68 69 6e 20 74 68 65  ccurs within the
5fb0: 20 70 61 67 65 72 0a 2a 2a 20 63 6f 64 65 2e 20   pager.** code. 
5fc0: 54 68 65 20 66 69 72 73 74 20 61 72 67 75 6d 65  The first argume
5fd0: 6e 74 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20  nt is a pointer 
5fe0: 74 6f 20 74 68 65 20 70 61 67 65 72 20 73 74 72  to the pager str
5ff0: 75 63 74 75 72 65 2c 20 74 68 65 0a 2a 2a 20 73  ucture, the.** s
6000: 65 63 6f 6e 64 20 74 68 65 20 65 72 72 6f 72 2d  econd the error-
6010: 63 6f 64 65 20 61 62 6f 75 74 20 74 6f 20 62 65  code about to be
6020: 20 72 65 74 75 72 6e 65 64 20 62 79 20 61 20 70   returned by a p
6030: 61 67 65 72 20 41 50 49 20 66 75 6e 63 74 69 6f  ager API functio
6040: 6e 2e 20 0a 2a 2a 20 54 68 65 20 76 61 6c 75 65  n. .** The value
6050: 20 72 65 74 75 72 6e 65 64 20 69 73 20 61 20 63   returned is a c
6060: 6f 70 79 20 6f 66 20 74 68 65 20 73 65 63 6f 6e  opy of the secon
6070: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
6080: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 0a 2a 2a  is function. .**
6090: 0a 2a 2a 20 49 66 20 74 68 65 20 73 65 63 6f 6e  .** If the secon
60a0: 64 20 61 72 67 75 6d 65 6e 74 20 69 73 20 53 51  d argument is SQ
60b0: 4c 49 54 45 5f 49 4f 45 52 52 2c 20 53 51 4c 49  LITE_IOERR, SQLI
60c0: 54 45 5f 43 4f 52 52 55 50 54 2c 20 6f 72 20 53  TE_CORRUPT, or S
60d0: 51 4c 49 54 45 5f 46 55 4c 4c 0a 2a 2a 20 74 68  QLITE_FULL.** th
60e0: 65 20 65 72 72 6f 72 20 62 65 63 6f 6d 65 73 20  e error becomes 
60f0: 70 65 72 73 69 73 74 65 6e 74 2e 20 41 6c 6c 20  persistent. All 
6100: 73 75 62 73 65 71 75 65 6e 74 20 41 50 49 20 63  subsequent API c
6110: 61 6c 6c 73 20 6f 6e 20 74 68 69 73 20 50 61 67  alls on this Pag
6120: 65 72 0a 2a 2a 20 77 69 6c 6c 20 69 6d 6d 65 64  er.** will immed
6130: 69 61 74 65 6c 79 20 72 65 74 75 72 6e 20 74 68  iately return th
6140: 65 20 73 61 6d 65 20 65 72 72 6f 72 20 63 6f 64  e same error cod
6150: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
6160: 20 70 61 67 65 72 5f 65 72 72 6f 72 28 50 61 67   pager_error(Pag
6170: 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
6180: 72 63 29 7b 0a 20 20 69 6e 74 20 72 63 32 20 3d  rc){.  int rc2 =
6190: 20 72 63 20 26 20 30 78 66 66 3b 0a 20 20 61 73   rc & 0xff;.  as
61a0: 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72  sert( pPager->er
61b0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 46 55  rCode==SQLITE_FU
61c0: 4c 4c 20 7c 7c 20 70 50 61 67 65 72 2d 3e 65 72  LL || pPager->er
61d0: 72 43 6f 64 65 3d 3d 53 51 4c 49 54 45 5f 4f 4b  rCode==SQLITE_OK
61e0: 20 29 3b 0a 20 20 69 66 28 0a 20 20 20 20 72 63   );.  if(.    rc
61f0: 32 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c 20 7c  2==SQLITE_FULL |
6200: 7c 0a 20 20 20 20 72 63 32 3d 3d 53 51 4c 49 54  |.    rc2==SQLIT
6210: 45 5f 49 4f 45 52 52 20 7c 7c 0a 20 20 20 20 72  E_IOERR ||.    r
6220: 63 32 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  c2==SQLITE_CORRU
6230: 50 54 0a 20 20 29 7b 0a 20 20 20 20 70 50 61 67  PT.  ){.    pPag
6240: 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d 20 72 63  er->errCode = rc
6250: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
6260: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 53  c;.}../*.** If S
6270: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6280: 53 20 69 73 20 64 65 66 69 6e 65 64 20 74 68 65  S is defined the
6290: 6e 20 77 65 20 64 6f 20 73 6f 6d 65 20 73 61 6e  n we do some san
62a0: 69 74 79 20 63 68 65 63 6b 69 6e 67 0a 2a 2a 20  ity checking.** 
62b0: 6f 6e 20 74 68 65 20 63 61 63 68 65 20 75 73 69  on the cache usi
62c0: 6e 67 20 61 20 68 61 73 68 20 66 75 6e 63 74 69  ng a hash functi
62d0: 6f 6e 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  on.  This is use
62e0: 64 20 66 6f 72 20 74 65 73 74 69 6e 67 0a 2a 2a  d for testing.**
62f0: 20 61 6e 64 20 64 65 62 75 67 67 69 6e 67 20 6f   and debugging o
6300: 6e 6c 79 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53  nly..*/.#ifdef S
6310: 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45  QLITE_CHECK_PAGE
6320: 53 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61  S./*.** Return a
6330: 20 33 32 2d 62 69 74 20 68 61 73 68 20 6f 66 20   32-bit hash of 
6340: 74 68 65 20 70 61 67 65 20 64 61 74 61 20 66 6f  the page data fo
6350: 72 20 70 50 61 67 65 2e 0a 2a 2f 0a 73 74 61 74  r pPage..*/.stat
6360: 69 63 20 75 33 32 20 70 61 67 65 72 5f 64 61 74  ic u32 pager_dat
6370: 61 68 61 73 68 28 69 6e 74 20 6e 42 79 74 65 2c  ahash(int nByte,
6380: 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
6390: 70 44 61 74 61 29 7b 0a 20 20 75 33 32 20 68 61  pData){.  u32 ha
63a0: 73 68 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  sh = 0;.  int i;
63b0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 42  .  for(i=0; i<nB
63c0: 79 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 68  yte; i++){.    h
63d0: 61 73 68 20 3d 20 28 68 61 73 68 2a 31 30 33 39  ash = (hash*1039
63e0: 29 20 2b 20 70 44 61 74 61 5b 69 5d 3b 0a 20 20  ) + pData[i];.  
63f0: 7d 0a 20 20 72 65 74 75 72 6e 20 68 61 73 68 3b  }.  return hash;
6400: 0a 7d 0a 73 74 61 74 69 63 20 75 33 32 20 70 61  .}.static u32 pa
6410: 67 65 72 5f 70 61 67 65 68 61 73 68 28 50 67 48  ger_pagehash(PgH
6420: 64 72 20 2a 70 50 61 67 65 29 7b 0a 20 20 72 65  dr *pPage){.  re
6430: 74 75 72 6e 20 70 61 67 65 72 5f 64 61 74 61 68  turn pager_datah
6440: 61 73 68 28 70 50 61 67 65 2d 3e 70 50 61 67 65  ash(pPage->pPage
6450: 72 2d 3e 70 61 67 65 53 69 7a 65 2c 20 0a 20 20  r->pageSize, .  
6460: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6470: 20 20 20 20 20 20 28 75 6e 73 69 67 6e 65 64 20        (unsigned 
6480: 63 68 61 72 20 2a 29 50 47 48 44 52 5f 54 4f 5f  char *)PGHDR_TO_
6490: 44 41 54 41 28 70 50 61 67 65 29 29 3b 0a 7d 0a  DATA(pPage));.}.
64a0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 43 48 45 43 4b  ./*.** The CHECK
64b0: 5f 50 41 47 45 20 6d 61 63 72 6f 20 74 61 6b 65  _PAGE macro take
64c0: 73 20 61 20 50 67 48 64 72 2a 20 61 73 20 61 6e  s a PgHdr* as an
64d0: 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 53 51   argument. If SQ
64e0: 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53  LITE_CHECK_PAGES
64f0: 0a 2a 2a 20 69 73 20 64 65 66 69 6e 65 64 2c 20  .** is defined, 
6500: 61 6e 64 20 4e 44 45 42 55 47 20 69 73 20 6e 6f  and NDEBUG is no
6510: 74 20 64 65 66 69 6e 65 64 2c 20 61 6e 20 61 73  t defined, an as
6520: 73 65 72 74 28 29 20 73 74 61 74 65 6d 65 6e 74  sert() statement
6530: 20 63 68 65 63 6b 73 0a 2a 2a 20 74 68 61 74 20   checks.** that 
6540: 74 68 65 20 70 61 67 65 20 69 73 20 65 69 74 68  the page is eith
6550: 65 72 20 64 69 72 74 79 20 6f 72 20 73 74 69 6c  er dirty or stil
6560: 6c 20 6d 61 74 63 68 65 73 20 74 68 65 20 63 61  l matches the ca
6570: 6c 63 75 6c 61 74 65 64 20 70 61 67 65 2d 68 61  lculated page-ha
6580: 73 68 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 43  sh..*/.#define C
6590: 48 45 43 4b 5f 50 41 47 45 28 78 29 20 63 68 65  HECK_PAGE(x) che
65a0: 63 6b 50 61 67 65 28 78 29 0a 73 74 61 74 69 63  ckPage(x).static
65b0: 20 76 6f 69 64 20 63 68 65 63 6b 50 61 67 65 28   void checkPage(
65c0: 50 67 48 64 72 20 2a 70 50 67 29 7b 0a 20 20 50  PgHdr *pPg){.  P
65d0: 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70  ager *pPager = p
65e0: 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 61 73  Pg->pPager;.  as
65f0: 73 65 72 74 28 20 21 70 50 67 2d 3e 70 61 67 65  sert( !pPg->page
6600: 48 61 73 68 20 7c 7c 20 70 50 61 67 65 72 2d 3e  Hash || pPager->
6610: 65 72 72 43 6f 64 65 20 7c 7c 20 4d 45 4d 44 42  errCode || MEMDB
6620: 20 7c 7c 20 70 50 67 2d 3e 64 69 72 74 79 20 7c   || pPg->dirty |
6630: 7c 20 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 61  | .      pPg->pa
6640: 67 65 48 61 73 68 3d 3d 70 61 67 65 72 5f 70 61  geHash==pager_pa
6650: 67 65 68 61 73 68 28 70 50 67 29 20 29 3b 0a 7d  gehash(pPg) );.}
6660: 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20  ..#else.#define 
6670: 70 61 67 65 72 5f 64 61 74 61 68 61 73 68 28 58  pager_datahash(X
6680: 2c 59 29 20 20 30 0a 23 64 65 66 69 6e 65 20 70  ,Y)  0.#define p
6690: 61 67 65 72 5f 70 61 67 65 68 61 73 68 28 58 29  ager_pagehash(X)
66a0: 20 20 30 0a 23 64 65 66 69 6e 65 20 43 48 45 43    0.#define CHEC
66b0: 4b 5f 50 41 47 45 28 78 29 0a 23 65 6e 64 69 66  K_PAGE(x).#endif
66c0: 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ../*.** When thi
66d0: 73 20 69 73 20 63 61 6c 6c 65 64 20 74 68 65 20  s is called the 
66e0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
66f0: 20 70 61 67 65 72 20 70 50 61 67 65 72 20 6d 75   pager pPager mu
6700: 73 74 20 62 65 20 6f 70 65 6e 2e 0a 2a 2a 20 54  st be open..** T
6710: 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61  he master journa
6720: 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 72  l file name is r
6730: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 65 6e 64  ead from the end
6740: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 61 6e 64   of the file and
6750: 20 0a 2a 2a 20 77 72 69 74 74 65 6e 20 69 6e 74   .** written int
6760: 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
6770: 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c  d from sqliteMal
6780: 6c 6f 63 28 29 2e 20 2a 70 7a 4d 61 73 74 65 72  loc(). *pzMaster
6790: 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 70 6f   is.** set to po
67a0: 69 6e 74 20 61 74 20 74 68 65 20 6d 65 6d 6f 72  int at the memor
67b0: 79 20 61 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20  y and SQLITE_OK 
67c0: 72 65 74 75 72 6e 65 64 2e 20 54 68 65 20 63 61  returned. The ca
67d0: 6c 6c 65 72 20 6d 75 73 74 0a 2a 2a 20 73 71 6c  ller must.** sql
67e0: 69 74 65 46 72 65 65 28 29 20 2a 70 7a 4d 61 73  iteFree() *pzMas
67f0: 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 6e 6f  ter..**.** If no
6800: 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20   master journal 
6810: 66 69 6c 65 20 6e 61 6d 65 20 69 73 20 70 72 65  file name is pre
6820: 73 65 6e 74 20 2a 70 7a 4d 61 73 74 65 72 20 69  sent *pzMaster i
6830: 73 20 73 65 74 20 74 6f 20 30 20 61 6e 64 0a 2a  s set to 0 and.*
6840: 2a 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74 75  * SQLITE_OK retu
6850: 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
6860: 69 6e 74 20 72 65 61 64 4d 61 73 74 65 72 4a 6f  int readMasterJo
6870: 75 72 6e 61 6c 28 4f 73 46 69 6c 65 20 2a 70 4a  urnal(OsFile *pJ
6880: 72 6e 6c 2c 20 63 68 61 72 20 2a 2a 70 7a 4d 61  rnl, char **pzMa
6890: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
68a0: 0a 20 20 75 33 32 20 6c 65 6e 3b 0a 20 20 69 36  .  u32 len;.  i6
68b0: 34 20 73 7a 4a 3b 0a 20 20 75 33 32 20 63 6b 73  4 szJ;.  u32 cks
68c0: 75 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 75  um;.  int i;.  u
68d0: 6e 73 69 67 6e 65 64 20 63 68 61 72 20 61 4d 61  nsigned char aMa
68e0: 67 69 63 5b 38 5d 3b 20 2f 2a 20 41 20 62 75 66  gic[8]; /* A buf
68f0: 66 65 72 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  fer to hold the 
6900: 6d 61 67 69 63 20 68 65 61 64 65 72 20 2a 2f 0a  magic header */.
6910: 0a 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d 20 30  .  *pzMaster = 0
6920: 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  ;..  rc = sqlite
6930: 33 4f 73 46 69 6c 65 53 69 7a 65 28 70 4a 72 6e  3OsFileSize(pJrn
6940: 6c 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20  l, &szJ);.  if( 
6950: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
6960: 20 73 7a 4a 3c 31 36 20 29 20 72 65 74 75 72 6e   szJ<16 ) return
6970: 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c   rc;..  rc = sql
6980: 69 74 65 33 4f 73 53 65 65 6b 28 70 4a 72 6e 6c  ite3OsSeek(pJrnl
6990: 2c 20 73 7a 4a 2d 31 36 29 3b 0a 20 20 69 66 28  , szJ-16);.  if(
69a0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
69b0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 0a 20 20   return rc;. .  
69c0: 72 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28  rc = read32bits(
69d0: 70 4a 72 6e 6c 2c 20 26 6c 65 6e 29 3b 0a 20 20  pJrnl, &len);.  
69e0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
69f0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a  K ) return rc;..
6a00: 20 20 72 63 20 3d 20 72 65 61 64 33 32 62 69 74    rc = read32bit
6a10: 73 28 70 4a 72 6e 6c 2c 20 26 63 6b 73 75 6d 29  s(pJrnl, &cksum)
6a20: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
6a30: 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
6a40: 63 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  c;..  rc = sqlit
6a50: 65 33 4f 73 52 65 61 64 28 70 4a 72 6e 6c 2c 20  e3OsRead(pJrnl, 
6a60: 61 4d 61 67 69 63 2c 20 38 29 3b 0a 20 20 69 66  aMagic, 8);.  if
6a70: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
6a80: 7c 7c 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  || memcmp(aMagic
6a90: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
6aa0: 20 38 29 20 29 20 72 65 74 75 72 6e 20 72 63 3b   8) ) return rc;
6ab0: 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
6ac0: 4f 73 53 65 65 6b 28 70 4a 72 6e 6c 2c 20 73 7a  OsSeek(pJrnl, sz
6ad0: 4a 2d 31 36 2d 6c 65 6e 29 3b 0a 20 20 69 66 28  J-16-len);.  if(
6ae0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
6af0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2a   return rc;..  *
6b00: 70 7a 4d 61 73 74 65 72 20 3d 20 28 63 68 61 72  pzMaster = (char
6b10: 20 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   *)sqliteMalloc(
6b20: 6c 65 6e 2b 31 29 3b 0a 20 20 69 66 28 20 21 2a  len+1);.  if( !*
6b30: 70 7a 4d 61 73 74 65 72 20 29 7b 0a 20 20 20 20  pzMaster ){.    
6b40: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4e 4f  return SQLITE_NO
6b50: 4d 45 4d 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  MEM;.  }.  rc = 
6b60: 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 4a  sqlite3OsRead(pJ
6b70: 72 6e 6c 2c 20 2a 70 7a 4d 61 73 74 65 72 2c 20  rnl, *pzMaster, 
6b80: 6c 65 6e 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  len);.  if( rc!=
6b90: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6ba0: 20 73 71 6c 69 74 65 46 72 65 65 28 2a 70 7a 4d   sqliteFree(*pzM
6bb0: 61 73 74 65 72 29 3b 0a 20 20 20 20 2a 70 7a 4d  aster);.    *pzM
6bc0: 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 72  aster = 0;.    r
6bd0: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20  eturn rc;.  }.. 
6be0: 20 2f 2a 20 53 65 65 20 69 66 20 74 68 65 20 63   /* See if the c
6bf0: 68 65 63 6b 73 75 6d 20 6d 61 74 63 68 65 73 20  hecksum matches 
6c00: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
6c10: 61 6c 20 6e 61 6d 65 20 2a 2f 0a 20 20 66 6f 72  al name */.  for
6c20: 28 69 3d 30 3b 20 69 3c 6c 65 6e 3b 20 69 2b 2b  (i=0; i<len; i++
6c30: 29 7b 0a 20 20 20 20 63 6b 73 75 6d 20 2d 3d 20  ){.    cksum -= 
6c40: 28 2a 70 7a 4d 61 73 74 65 72 29 5b 69 5d 3b 0a  (*pzMaster)[i];.
6c50: 20 20 7d 0a 20 20 69 66 28 20 63 6b 73 75 6d 20    }.  if( cksum 
6c60: 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65  ){.    /* If the
6c70: 20 63 68 65 63 6b 73 75 6d 20 64 6f 65 73 6e 27   checksum doesn'
6c80: 74 20 61 64 64 20 75 70 2c 20 74 68 65 6e 20 6f  t add up, then o
6c90: 6e 65 20 6f 72 20 6d 6f 72 65 20 6f 66 20 74 68  ne or more of th
6ca0: 65 20 64 69 73 6b 20 73 65 63 74 6f 72 73 0a 20  e disk sectors. 
6cb0: 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 69 6e 67     ** containing
6cc0: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
6cd0: 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  nal filename is 
6ce0: 63 6f 72 72 75 70 74 65 64 2e 20 54 68 69 73 20  corrupted. This 
6cf0: 6d 65 61 6e 73 0a 20 20 20 20 2a 2a 20 64 65 66  means.    ** def
6d00: 69 6e 69 74 65 6c 79 20 72 6f 6c 6c 20 62 61 63  initely roll bac
6d10: 6b 2c 20 73 6f 20 6a 75 73 74 20 72 65 74 75 72  k, so just retur
6d20: 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 61 6e 64 20  n SQLITE_OK and 
6d30: 72 65 70 6f 72 74 20 61 20 28 6e 75 6c 29 0a 20  report a (nul). 
6d40: 20 20 20 2a 2a 20 6d 61 73 74 65 72 2d 6a 6f 75     ** master-jou
6d50: 72 6e 61 6c 20 66 69 6c 65 6e 61 6d 65 2e 0a 20  rnal filename.. 
6d60: 20 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65     */.    sqlite
6d70: 46 72 65 65 28 2a 70 7a 4d 61 73 74 65 72 29 3b  Free(*pzMaster);
6d80: 0a 20 20 20 20 2a 70 7a 4d 61 73 74 65 72 20 3d  .    *pzMaster =
6d90: 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
6da0: 20 28 2a 70 7a 4d 61 73 74 65 72 29 5b 6c 65 6e   (*pzMaster)[len
6db0: 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a 20 20  ] = '\0';.  }.  
6dc0: 20 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54   .  return SQLIT
6dd0: 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  E_OK;.}../*.** S
6de0: 65 65 6b 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  eek the journal 
6df0: 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 20  file descriptor 
6e00: 74 6f 20 74 68 65 20 6e 65 78 74 20 73 65 63 74  to the next sect
6e10: 6f 72 20 62 6f 75 6e 64 61 72 79 20 77 68 65 72  or boundary wher
6e20: 65 20 61 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 68  e a.** journal h
6e30: 65 61 64 65 72 20 6d 61 79 20 62 65 20 72 65 61  eader may be rea
6e40: 64 20 6f 72 20 77 72 69 74 74 65 6e 2e 20 50 61  d or written. Pa
6e50: 67 65 72 2e 6a 6f 75 72 6e 61 6c 4f 66 66 20 69  ger.journalOff i
6e60: 73 20 75 70 64 61 74 65 64 20 77 69 74 68 0a 2a  s updated with.*
6e70: 2a 20 74 68 65 20 6e 65 77 20 73 65 65 6b 20 6f  * the new seek o
6e80: 66 66 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ffset..**.** i.e
6e90: 20 66 6f 72 20 61 20 73 65 63 74 6f 72 20 73 69   for a sector si
6ea0: 7a 65 20 6f 66 20 35 31 32 3a 0a 2a 2a 0a 2a 2a  ze of 512:.**.**
6eb0: 20 49 6e 70 75 74 20 4f 66 66 73 65 74 20 20 20   Input Offset   
6ec0: 20 20 20 20 20 20 20 20 20 20 20 4f 75 74 70 75             Outpu
6ed0: 74 20 4f 66 66 73 65 74 0a 2a 2a 20 2d 2d 2d 2d  t Offset.** ----
6ee0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6ef0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
6f00: 2d 2d 2d 0a 2a 2a 20 30 20 20 20 20 20 20 20 20  ---.** 0        
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 20 30 0a 2a 2a 20 35 31 32 20 20 20 20 20 20 20   0.** 512       
6f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f40: 35 31 32 0a 2a 2a 20 31 30 30 20 20 20 20 20 20  512.** 100      
6f50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f60: 20 35 31 32 0a 2a 2a 20 32 30 30 30 20 20 20 20   512.** 2000    
6f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f80: 20 20 32 30 34 38 0a 2a 2a 20 0a 2a 2f 0a 73 74    2048.** .*/.st
6f90: 61 74 69 63 20 69 6e 74 20 73 65 65 6b 4a 6f 75  atic int seekJou
6fa0: 72 6e 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70  rnalHdr(Pager *p
6fb0: 50 61 67 65 72 29 7b 0a 20 20 69 36 34 20 6f 66  Pager){.  i64 of
6fc0: 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 36 34 20  fset = 0;.  i64 
6fd0: 63 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  c = pPager->jour
6fe0: 6e 61 6c 4f 66 66 3b 0a 20 20 69 66 28 20 63 20  nalOff;.  if( c 
6ff0: 29 7b 0a 20 20 20 20 6f 66 66 73 65 74 20 3d 20  ){.    offset = 
7000: 28 28 63 2d 31 29 2f 4a 4f 55 52 4e 41 4c 5f 48  ((c-1)/JOURNAL_H
7010: 44 52 5f 53 5a 28 70 50 61 67 65 72 29 20 2b 20  DR_SZ(pPager) + 
7020: 31 29 20 2a 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  1) * JOURNAL_HDR
7030: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 7d  _SZ(pPager);.  }
7040: 0a 20 20 61 73 73 65 72 74 28 20 6f 66 66 73 65  .  assert( offse
7050: 74 25 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  t%JOURNAL_HDR_SZ
7060: 28 70 50 61 67 65 72 29 3d 3d 30 20 29 3b 0a 20  (pPager)==0 );. 
7070: 20 61 73 73 65 72 74 28 20 6f 66 66 73 65 74 3e   assert( offset>
7080: 3d 63 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =c );.  assert( 
7090: 28 6f 66 66 73 65 74 2d 63 29 3c 4a 4f 55 52 4e  (offset-c)<JOURN
70a0: 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67 65 72  AL_HDR_SZ(pPager
70b0: 29 20 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a  ) );.  pPager->j
70c0: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 6f 66 66 73  ournalOff = offs
70d0: 65 74 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c  et;.  return sql
70e0: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
70f0: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
7100: 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a 7d 0a 0a  journalOff);.}..
7110: 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61  /*.** The journa
7120: 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20 6f  l file must be o
7130: 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 72 6f  pen when this ro
7140: 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
7150: 20 41 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 68 65   A journal.** he
7160: 61 64 65 72 20 28 4a 4f 55 52 4e 41 4c 5f 48 44  ader (JOURNAL_HD
7170: 52 5f 53 5a 20 62 79 74 65 73 29 20 69 73 20 77  R_SZ bytes) is w
7180: 72 69 74 74 65 6e 20 69 6e 74 6f 20 74 68 65 20  ritten into the 
7190: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 74 20  journal file at 
71a0: 74 68 65 0a 2a 2a 20 63 75 72 72 65 6e 74 20 6c  the.** current l
71b0: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  ocation..**.** T
71c0: 68 65 20 66 6f 72 6d 61 74 20 66 6f 72 20 74 68  he format for th
71d0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
71e0: 20 69 73 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a   is as follows:.
71f0: 2a 2a 20 2d 20 38 20 62 79 74 65 73 3a 20 4d 61  ** - 8 bytes: Ma
7200: 67 69 63 20 69 64 65 6e 74 69 66 79 69 6e 67 20  gic identifying 
7210: 6a 6f 75 72 6e 61 6c 20 66 6f 72 6d 61 74 2e 0a  journal format..
7220: 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 4e 75  ** - 4 bytes: Nu
7230: 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73 20  mber of records 
7240: 69 6e 20 6a 6f 75 72 6e 61 6c 2c 20 6f 72 20 2d  in journal, or -
7250: 31 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 20 69  1 no-sync mode i
7260: 73 20 6f 6e 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  s on..** - 4 byt
7270: 65 73 3a 20 52 61 6e 64 6f 6d 20 6e 75 6d 62 65  es: Random numbe
7280: 72 20 75 73 65 64 20 66 6f 72 20 70 61 67 65 20  r used for page 
7290: 68 61 73 68 2e 0a 2a 2a 20 2d 20 34 20 62 79 74  hash..** - 4 byt
72a0: 65 73 3a 20 49 6e 69 74 69 61 6c 20 64 61 74 61  es: Initial data
72b0: 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 2e  base page count.
72c0: 0a 2a 2a 20 2d 20 34 20 62 79 74 65 73 3a 20 53  .** - 4 bytes: S
72d0: 65 63 74 6f 72 20 73 69 7a 65 20 75 73 65 64 20  ector size used 
72e0: 62 79 20 74 68 65 20 70 72 6f 63 65 73 73 20 74  by the process t
72f0: 68 61 74 20 77 72 6f 74 65 20 74 68 69 73 20 6a  hat wrote this j
7300: 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 0a 2a 2a 20 46  ournal..** .** F
7310: 6f 6c 6c 6f 77 65 64 20 62 79 20 28 4a 4f 55 52  ollowed by (JOUR
7320: 4e 41 4c 5f 48 44 52 5f 53 5a 20 2d 20 32 34 29  NAL_HDR_SZ - 24)
7330: 20 62 79 74 65 73 20 6f 66 20 75 6e 75 73 65 64   bytes of unused
7340: 20 73 70 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69   space..*/.stati
7350: 63 20 69 6e 74 20 77 72 69 74 65 4a 6f 75 72 6e  c int writeJourn
7360: 61 6c 48 64 72 28 50 61 67 65 72 20 2a 70 50 61  alHdr(Pager *pPa
7370: 67 65 72 29 7b 0a 20 20 63 68 61 72 20 7a 48 65  ger){.  char zHe
7380: 61 64 65 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75  ader[sizeof(aJou
7390: 72 6e 61 6c 4d 61 67 69 63 29 2b 31 36 5d 3b 0a  rnalMagic)+16];.
73a0: 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 69 66 28    int rc;..  if(
73b0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72   pPager->stmtHdr
73c0: 4f 66 66 3d 3d 30 20 29 7b 0a 20 20 20 20 70 50  Off==0 ){.    pP
73d0: 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66 66  ager->stmtHdrOff
73e0: 20 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e   = pPager->journ
73f0: 61 6c 4f 66 66 3b 0a 20 20 7d 0a 0a 20 20 72 63  alOff;.  }..  rc
7400: 20 3d 20 73 65 65 6b 4a 6f 75 72 6e 61 6c 48 64   = seekJournalHd
7410: 72 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  r(pPager);.  if(
7420: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7430: 0a 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  ..  pPager->jour
7440: 6e 61 6c 48 64 72 20 3d 20 70 50 61 67 65 72 2d  nalHdr = pPager-
7450: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3b 0a 20 20 70  >journalOff;.  p
7460: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
7470: 66 20 2b 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52  f += JOURNAL_HDR
7480: 5f 53 5a 28 70 50 61 67 65 72 29 3b 0a 0a 20 20  _SZ(pPager);..  
7490: 2f 2a 20 46 49 58 20 4d 45 3a 20 0a 20 20 2a 2a  /* FIX ME: .  **
74a0: 0a 20 20 2a 2a 20 50 6f 73 73 69 62 6c 79 20 66  .  ** Possibly f
74b0: 6f 72 20 61 20 70 61 67 65 72 20 6e 6f 74 20 69  or a pager not i
74c0: 6e 20 6e 6f 2d 73 79 6e 63 20 6d 6f 64 65 2c 20  n no-sync mode, 
74d0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 6d 61 67 69  the journal magi
74e0: 63 20 73 68 6f 75 6c 64 20 6e 6f 74 0a 20 20 2a  c should not.  *
74f0: 2a 20 62 65 20 77 72 69 74 74 65 6e 20 75 6e 74  * be written unt
7500: 69 6c 20 6e 52 65 63 20 69 73 20 66 69 6c 6c 65  il nRec is fille
7510: 64 20 69 6e 20 61 73 20 70 61 72 74 20 6f 66 20  d in as part of 
7520: 6e 65 78 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c  next syncJournal
7530: 28 29 2e 20 0a 20 20 2a 2a 0a 20 20 2a 2a 20 41  (). .  **.  ** A
7540: 63 74 75 61 6c 6c 79 20 6d 61 79 62 65 20 74 68  ctually maybe th
7550: 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61 6c 20  e whole journal 
7560: 68 65 61 64 65 72 20 73 68 6f 75 6c 64 20 62 65  header should be
7570: 20 64 65 6c 61 79 65 64 20 75 6e 74 69 6c 20 74   delayed until t
7580: 68 61 74 0a 20 20 2a 2a 20 70 6f 69 6e 74 2e 20  hat.  ** point. 
7590: 54 68 69 6e 6b 20 61 62 6f 75 74 20 74 68 69 73  Think about this
75a0: 2e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 63 70 79 28  ..  */.  memcpy(
75b0: 7a 48 65 61 64 65 72 2c 20 61 4a 6f 75 72 6e 61  zHeader, aJourna
75c0: 6c 4d 61 67 69 63 2c 20 73 69 7a 65 6f 66 28 61  lMagic, sizeof(a
75d0: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
75e0: 20 20 2f 2a 20 54 68 65 20 6e 52 65 63 20 46 69    /* The nRec Fi
75f0: 65 6c 64 2e 20 30 78 46 46 46 46 46 46 46 46 20  eld. 0xFFFFFFFF 
7600: 66 6f 72 20 6e 6f 2d 73 79 6e 63 20 6a 6f 75 72  for no-sync jour
7610: 6e 61 6c 73 2e 20 2a 2f 0a 20 20 70 75 74 33 32  nals. */.  put32
7620: 62 69 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69  bits(&zHeader[si
7630: 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67  zeof(aJournalMag
7640: 69 63 29 5d 2c 20 70 50 61 67 65 72 2d 3e 6e 6f  ic)], pPager->no
7650: 53 79 6e 63 20 3f 20 30 78 66 66 66 66 66 66 66  Sync ? 0xfffffff
7660: 66 20 3a 20 30 29 3b 0a 20 20 2f 2a 20 54 68 65  f : 0);.  /* The
7670: 20 72 61 6e 64 6f 6d 20 63 68 65 63 6b 2d 68 61   random check-ha
7680: 73 68 20 69 6e 69 74 69 61 6c 69 73 65 72 20 2a  sh initialiser *
7690: 2f 20 0a 20 20 73 71 6c 69 74 65 33 52 61 6e 64  / .  sqlite3Rand
76a0: 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66 28 70 50  omness(sizeof(pP
76b0: 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 29  ager->cksumInit)
76c0: 2c 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  , &pPager->cksum
76d0: 49 6e 69 74 29 3b 0a 20 20 70 75 74 33 32 62 69  Init);.  put32bi
76e0: 74 73 28 26 7a 48 65 61 64 65 72 5b 73 69 7a 65  ts(&zHeader[size
76f0: 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63  of(aJournalMagic
7700: 29 2b 34 5d 2c 20 70 50 61 67 65 72 2d 3e 63 6b  )+4], pPager->ck
7710: 73 75 6d 49 6e 69 74 29 3b 0a 20 20 2f 2a 20 54  sumInit);.  /* T
7720: 68 65 20 69 6e 69 74 69 61 6c 20 64 61 74 61 62  he initial datab
7730: 61 73 65 20 73 69 7a 65 20 2a 2f 0a 20 20 70 75  ase size */.  pu
7740: 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65 72  t32bits(&zHeader
7750: 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61 6c  [sizeof(aJournal
7760: 4d 61 67 69 63 29 2b 38 5d 2c 20 70 50 61 67 65  Magic)+8], pPage
7770: 72 2d 3e 64 62 53 69 7a 65 29 3b 0a 20 20 2f 2a  r->dbSize);.  /*
7780: 20 54 68 65 20 61 73 73 75 6d 65 64 20 73 65 63   The assumed sec
7790: 74 6f 72 20 73 69 7a 65 20 66 6f 72 20 74 68 69  tor size for thi
77a0: 73 20 70 72 6f 63 65 73 73 20 2a 2f 0a 20 20 70  s process */.  p
77b0: 75 74 33 32 62 69 74 73 28 26 7a 48 65 61 64 65  ut32bits(&zHeade
77c0: 72 5b 73 69 7a 65 6f 66 28 61 4a 6f 75 72 6e 61  r[sizeof(aJourna
77d0: 6c 4d 61 67 69 63 29 2b 31 32 5d 2c 20 70 50 61  lMagic)+12], pPa
77e0: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 29  ger->sectorSize)
77f0: 3b 0a 20 20 49 4f 54 52 41 43 45 28 28 22 4a 48  ;.  IOTRACE(("JH
7800: 44 52 20 25 70 20 25 6c 6c 64 20 25 64 5c 6e 22  DR %p %lld %d\n"
7810: 2c 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  , pPager, pPager
7820: 2d 3e 6a 6f 75 72 6e 61 6c 48 64 72 2c 20 73 69  ->journalHdr, si
7830: 7a 65 6f 66 28 7a 48 65 61 64 65 72 29 29 29 0a  zeof(zHeader))).
7840: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
7850: 57 72 69 74 65 28 70 50 61 67 65 72 2d 3e 6a 66  Write(pPager->jf
7860: 64 2c 20 7a 48 65 61 64 65 72 2c 20 73 69 7a 65  d, zHeader, size
7870: 6f 66 28 7a 48 65 61 64 65 72 29 29 3b 0a 0a 20  of(zHeader));.. 
7880: 20 2f 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20   /* The journal 
7890: 68 65 61 64 65 72 20 68 61 73 20 62 65 65 6e 20  header has been 
78a0: 77 72 69 74 74 65 6e 20 73 75 63 63 65 73 73 66  written successf
78b0: 75 6c 6c 79 2e 20 53 65 65 6b 20 74 68 65 20 6a  ully. Seek the j
78c0: 6f 75 72 6e 61 6c 0a 20 20 2a 2a 20 66 69 6c 65  ournal.  ** file
78d0: 20 64 65 73 63 72 69 70 74 6f 72 20 74 6f 20 74   descriptor to t
78e0: 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20 6a 6f  he end of the jo
78f0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 73 65 63  urnal header sec
7900: 74 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  tor..  */.  if( 
7910: 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
7920: 0a 20 20 20 20 49 4f 54 52 41 43 45 28 28 22 4a  .    IOTRACE(("J
7930: 54 41 49 4c 20 25 70 20 25 6c 6c 64 5c 6e 22 2c  TAIL %p %lld\n",
7940: 20 70 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d   pPager, pPager-
7950: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 2d 31 29 29 0a  >journalOff-1)).
7960: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
7970: 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a  OsSeek(pPager->j
7980: 66 64 2c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  fd, pPager->jour
7990: 6e 61 6c 4f 66 66 2d 31 29 3b 0a 20 20 20 20 69  nalOff-1);.    i
79a0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
79b0: 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   ){.      rc = s
79c0: 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
79d0: 61 67 65 72 2d 3e 6a 66 64 2c 20 22 5c 30 30 30  ager->jfd, "\000
79e0: 22 2c 20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", 1);.    }.  }
79f0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
7a00: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e  ./*.** The journ
7a10: 61 6c 20 66 69 6c 65 20 6d 75 73 74 20 62 65 20  al file must be 
7a20: 6f 70 65 6e 20 77 68 65 6e 20 74 68 69 73 20 69  open when this i
7a30: 73 20 63 61 6c 6c 65 64 2e 20 41 20 6a 6f 75 72  s called. A jour
7a40: 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c 65 0a  nal header file.
7a50: 2a 2a 20 28 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f  ** (JOURNAL_HDR_
7a60: 53 5a 20 62 79 74 65 73 29 20 69 73 20 72 65 61  SZ bytes) is rea
7a70: 64 20 66 72 6f 6d 20 74 68 65 20 63 75 72 72 65  d from the curre
7a80: 6e 74 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74  nt location in t
7a90: 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69  he journal.** fi
7aa0: 6c 65 2e 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73  le. See comments
7ab0: 20 61 62 6f 76 65 20 66 75 6e 63 74 69 6f 6e 20   above function 
7ac0: 77 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28  writeJournalHdr(
7ad0: 29 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74  ) for a descript
7ae0: 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68 65 20 6a 6f  ion of.** the jo
7af0: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 6f 72  urnal header for
7b00: 6d 61 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  mat..**.** If th
7b10: 65 20 68 65 61 64 65 72 20 69 73 20 72 65 61 64  e header is read
7b20: 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 2a   successfully, *
7b30: 6e 52 65 63 20 69 73 20 73 65 74 20 74 6f 20 74  nRec is set to t
7b40: 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20  he number of.** 
7b50: 70 61 67 65 20 72 65 63 6f 72 64 73 20 66 6f 6c  page records fol
7b60: 6c 6f 77 69 6e 67 20 74 68 69 73 20 68 65 61 64  lowing this head
7b70: 65 72 20 61 6e 64 20 2a 64 62 53 69 7a 65 20 69  er and *dbSize i
7b80: 73 20 73 65 74 20 74 6f 20 74 68 65 20 73 69 7a  s set to the siz
7b90: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 61 74 61  e of the.** data
7ba0: 62 61 73 65 20 62 65 66 6f 72 65 20 74 68 65 20  base before the 
7bb0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 61  transaction bega
7bc0: 6e 2c 20 69 6e 20 70 61 67 65 73 2e 20 41 6c 73  n, in pages. Als
7bd0: 6f 2c 20 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d  o, pPager->cksum
7be0: 49 6e 69 74 0a 2a 2a 20 69 73 20 73 65 74 20 74  Init.** is set t
7bf0: 6f 20 74 68 65 20 76 61 6c 75 65 20 72 65 61 64  o the value read
7c00: 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61   from the journa
7c10: 6c 20 68 65 61 64 65 72 2e 20 53 51 4c 49 54 45  l header. SQLITE
7c20: 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 0a  _OK is returned.
7c30: 2a 2a 20 69 6e 20 74 68 69 73 20 63 61 73 65 2e  ** in this case.
7c40: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f  .**.** If the jo
7c50: 75 72 6e 61 6c 20 68 65 61 64 65 72 20 66 69 6c  urnal header fil
7c60: 65 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  e appears to be 
7c70: 63 6f 72 72 75 70 74 65 64 2c 20 53 51 4c 49 54  corrupted, SQLIT
7c80: 45 5f 44 4f 4e 45 20 69 73 0a 2a 2a 20 72 65 74  E_DONE is.** ret
7c90: 75 72 6e 65 64 20 61 6e 64 20 2a 6e 52 65 63 20  urned and *nRec 
7ca0: 61 6e 64 20 2a 64 62 53 69 7a 65 20 61 72 65 20  and *dbSize are 
7cb0: 6e 6f 74 20 73 65 74 2e 20 20 49 66 20 4a 4f 55  not set.  If JOU
7cc0: 52 4e 41 4c 5f 48 44 52 5f 53 5a 20 62 79 74 65  RNAL_HDR_SZ byte
7cd0: 73 0a 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 72  s.** cannot be r
7ce0: 65 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75  ead from the jou
7cf0: 72 6e 61 6c 20 66 69 6c 65 20 61 6e 20 65 72 72  rnal file an err
7d00: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
7d10: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
7d20: 6e 74 20 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64  nt readJournalHd
7d30: 72 28 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67  r(.  Pager *pPag
7d40: 65 72 2c 20 0a 20 20 69 36 34 20 6a 6f 75 72 6e  er, .  i64 journ
7d50: 61 6c 53 69 7a 65 2c 0a 20 20 75 33 32 20 2a 70  alSize,.  u32 *p
7d60: 4e 52 65 63 2c 20 0a 20 20 75 33 32 20 2a 70 44  NRec, .  u32 *pD
7d70: 62 53 69 7a 65 0a 29 7b 0a 20 20 69 6e 74 20 72  bSize.){.  int r
7d80: 63 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  c;.  unsigned ch
7d90: 61 72 20 61 4d 61 67 69 63 5b 38 5d 3b 20 2f 2a  ar aMagic[8]; /*
7da0: 20 41 20 62 75 66 66 65 72 20 74 6f 20 68 6f 6c   A buffer to hol
7db0: 64 20 74 68 65 20 6d 61 67 69 63 20 68 65 61 64  d the magic head
7dc0: 65 72 20 2a 2f 0a 0a 20 20 72 63 20 3d 20 73 65  er */..  rc = se
7dd0: 65 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61  ekJournalHdr(pPa
7de0: 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ger);.  if( rc )
7df0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
7e00: 66 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e  f( pPager->journ
7e10: 61 6c 4f 66 66 2b 4a 4f 55 52 4e 41 4c 5f 48 44  alOff+JOURNAL_HD
7e20: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 3e 20 6a  R_SZ(pPager) > j
7e30: 6f 75 72 6e 61 6c 53 69 7a 65 20 29 7b 0a 20 20  ournalSize ){.  
7e40: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
7e50: 44 4f 4e 45 3b 0a 20 20 7d 0a 0a 20 20 72 63 20  DONE;.  }..  rc 
7e60: 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28  = sqlite3OsRead(
7e70: 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 61 4d 61  pPager->jfd, aMa
7e80: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4d 61 67  gic, sizeof(aMag
7e90: 69 63 29 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ic));.  if( rc )
7ea0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69   return rc;..  i
7eb0: 66 28 20 6d 65 6d 63 6d 70 28 61 4d 61 67 69 63  f( memcmp(aMagic
7ec0: 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 2c  , aJournalMagic,
7ed0: 20 73 69 7a 65 6f 66 28 61 4d 61 67 69 63 29 29   sizeof(aMagic))
7ee0: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
7ef0: 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45 3b 0a 20  n SQLITE_DONE;. 
7f00: 20 7d 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33   }..  rc = read3
7f10: 32 62 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66  2bits(pPager->jf
7f20: 64 2c 20 70 4e 52 65 63 29 3b 0a 20 20 69 66 28  d, pNRec);.  if(
7f30: 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
7f40: 0a 0a 20 20 72 63 20 3d 20 72 65 61 64 33 32 62  ..  rc = read32b
7f50: 69 74 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  its(pPager->jfd,
7f60: 20 26 70 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49   &pPager->cksumI
7f70: 6e 69 74 29 3b 0a 20 20 69 66 28 20 72 63 20 29  nit);.  if( rc )
7f80: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 72   return rc;..  r
7f90: 63 20 3d 20 72 65 61 64 33 32 62 69 74 73 28 70  c = read32bits(p
7fa0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 44 62 53  Pager->jfd, pDbS
7fb0: 69 7a 65 29 3b 0a 20 20 69 66 28 20 72 63 20 29  ize);.  if( rc )
7fc0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 2f   return rc;..  /
7fd0: 2a 20 55 70 64 61 74 65 20 74 68 65 20 61 73 73  * Update the ass
7fe0: 75 6d 65 64 20 73 65 63 74 6f 72 2d 73 69 7a 65  umed sector-size
7ff0: 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 76 61   to match the va
8000: 6c 75 65 20 75 73 65 64 20 62 79 20 0a 20 20 2a  lue used by .  *
8010: 2a 20 74 68 65 20 70 72 6f 63 65 73 73 20 74 68  * the process th
8020: 61 74 20 63 72 65 61 74 65 64 20 74 68 69 73 20  at created this 
8030: 6a 6f 75 72 6e 61 6c 2e 20 49 66 20 74 68 69 73  journal. If this
8040: 20 6a 6f 75 72 6e 61 6c 20 77 61 73 0a 20 20 2a   journal was.  *
8050: 2a 20 63 72 65 61 74 65 64 20 62 79 20 61 20 70  * created by a p
8060: 72 6f 63 65 73 73 20 6f 74 68 65 72 20 74 68 61  rocess other tha
8070: 6e 20 74 68 69 73 20 6f 6e 65 2c 20 74 68 65 6e  n this one, then
8080: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
8090: 2a 2a 20 69 73 20 62 65 69 6e 67 20 63 61 6c 6c  ** is being call
80a0: 65 64 20 66 72 6f 6d 20 77 69 74 68 69 6e 20 70  ed from within p
80b0: 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29 2e  ager_playback().
80c0: 20 54 68 65 20 6c 6f 63 61 6c 20 76 61 6c 75 65   The local value
80d0: 0a 20 20 2a 2a 20 6f 66 20 50 61 67 65 72 2e 73  .  ** of Pager.s
80e0: 65 63 74 6f 72 53 69 7a 65 20 69 73 20 72 65 73  ectorSize is res
80f0: 74 6f 72 65 64 20 61 74 20 74 68 65 20 65 6e 64  tored at the end
8100: 20 6f 66 20 74 68 61 74 20 72 6f 75 74 69 6e 65   of that routine
8110: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 72 65  ..  */.  rc = re
8120: 61 64 33 32 62 69 74 73 28 70 50 61 67 65 72 2d  ad32bits(pPager-
8130: 3e 6a 66 64 2c 20 28 75 33 32 20 2a 29 26 70 50  >jfd, (u32 *)&pP
8140: 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65  ager->sectorSize
8150: 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  );.  if( rc ) re
8160: 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70 50 61 67  turn rc;..  pPag
8170: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 2b  er->journalOff +
8180: 3d 20 4a 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a  = JOURNAL_HDR_SZ
8190: 28 70 50 61 67 65 72 29 3b 0a 20 20 72 63 20 3d  (pPager);.  rc =
81a0: 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70   sqlite3OsSeek(p
81b0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
81c0: 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b  er->journalOff);
81d0: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
81e0: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 74 68  ../*.** Write th
81f0: 65 20 73 75 70 70 6c 69 65 64 20 6d 61 73 74 65  e supplied maste
8200: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20 69  r journal name i
8210: 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
8220: 66 69 6c 65 20 66 6f 72 20 70 61 67 65 72 0a 2a  file for pager.*
8230: 2a 20 70 50 61 67 65 72 20 61 74 20 74 68 65 20  * pPager at the 
8240: 63 75 72 72 65 6e 74 20 6c 6f 63 61 74 69 6f 6e  current location
8250: 2e 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75  . The master jou
8260: 72 6e 61 6c 20 6e 61 6d 65 20 6d 75 73 74 20 62  rnal name must b
8270: 65 20 74 68 65 20 6c 61 73 74 0a 2a 2a 20 74 68  e the last.** th
8280: 69 6e 67 20 77 72 69 74 74 65 6e 20 74 6f 20 61  ing written to a
8290: 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 49   journal file. I
82a0: 66 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69  f the pager is i
82b0: 6e 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65  n full-sync mode
82c0: 2c 20 74 68 65 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  , the.** journal
82d0: 20 66 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72   file descriptor
82e0: 20 69 73 20 61 64 76 61 6e 63 65 64 20 74 6f 20   is advanced to 
82f0: 74 68 65 20 6e 65 78 74 20 73 65 63 74 6f 72 20  the next sector 
8300: 62 6f 75 6e 64 61 72 79 20 62 65 66 6f 72 65 0a  boundary before.
8310: 2a 2a 20 61 6e 79 74 68 69 6e 67 20 69 73 20 77  ** anything is w
8320: 72 69 74 74 65 6e 2e 20 54 68 65 20 66 6f 72 6d  ritten. The form
8330: 61 74 20 69 73 3a 0a 2a 2a 0a 2a 2a 20 2b 20 34  at is:.**.** + 4
8340: 20 62 79 74 65 73 3a 20 50 41 47 45 52 5f 4d 4a   bytes: PAGER_MJ
8350: 5f 50 47 4e 4f 2e 0a 2a 2a 20 2b 20 4e 20 62 79  _PGNO..** + N by
8360: 74 65 73 3a 20 6c 65 6e 67 74 68 20 6f 66 20 6d  tes: length of m
8370: 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 6e 61  aster journal na
8380: 6d 65 2e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  me..** + 4 bytes
8390: 3a 20 4e 0a 2a 2a 20 2b 20 34 20 62 79 74 65 73  : N.** + 4 bytes
83a0: 3a 20 4d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  : Master journal
83b0: 20 6e 61 6d 65 20 63 68 65 63 6b 73 75 6d 2e 0a   name checksum..
83c0: 2a 2a 20 2b 20 38 20 62 79 74 65 73 3a 20 61 4a  ** + 8 bytes: aJ
83d0: 6f 75 72 6e 61 6c 4d 61 67 69 63 5b 5d 2e 0a 2a  ournalMagic[]..*
83e0: 2a 0a 2a 2a 20 54 68 65 20 6d 61 73 74 65 72 20  *.** The master 
83f0: 6a 6f 75 72 6e 61 6c 20 70 61 67 65 20 63 68 65  journal page che
8400: 63 6b 73 75 6d 20 69 73 20 74 68 65 20 73 75 6d  cksum is the sum
8410: 20 6f 66 20 74 68 65 20 62 79 74 65 73 20 69 6e   of the bytes in
8420: 20 74 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 6a   the master.** j
8430: 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 0a 2a 2a 0a  ournal name..**.
8440: 2a 2a 20 49 66 20 7a 4d 61 73 74 65 72 20 69 73  ** If zMaster is
8450: 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 20   a NULL pointer 
8460: 28 6f 63 63 75 72 73 20 66 6f 72 20 61 20 73 69  (occurs for a si
8470: 6e 67 6c 65 20 64 61 74 61 62 61 73 65 20 74 72  ngle database tr
8480: 61 6e 73 61 63 74 69 6f 6e 29 2c 20 0a 2a 2a 20  ansaction), .** 
8490: 74 68 69 73 20 63 61 6c 6c 20 69 73 20 61 20 6e  this call is a n
84a0: 6f 2d 6f 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  o-op..*/.static 
84b0: 69 6e 74 20 77 72 69 74 65 4d 61 73 74 65 72 4a  int writeMasterJ
84c0: 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
84d0: 61 67 65 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  ager, const char
84e0: 20 2a 7a 4d 61 73 74 65 72 29 7b 0a 20 20 69 6e   *zMaster){.  in
84f0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6c 65 6e 3b  t rc;.  int len;
8500: 20 0a 20 20 69 6e 74 20 69 3b 20 0a 20 20 75 33   .  int i; .  u3
8510: 32 20 63 6b 73 75 6d 20 3d 20 30 3b 0a 20 20 63  2 cksum = 0;.  c
8520: 68 61 72 20 7a 42 75 66 5b 73 69 7a 65 6f 66 28  har zBuf[sizeof(
8530: 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 2b 32  aJournalMagic)+2
8540: 2a 34 5d 3b 0a 0a 20 20 69 66 28 20 21 7a 4d 61  *4];..  if( !zMa
8550: 73 74 65 72 20 7c 7c 20 70 50 61 67 65 72 2d 3e  ster || pPager->
8560: 73 65 74 4d 61 73 74 65 72 29 20 72 65 74 75 72  setMaster) retur
8570: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 70  n SQLITE_OK;.  p
8580: 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72  Pager->setMaster
8590: 20 3d 20 31 3b 0a 0a 20 20 6c 65 6e 20 3d 20 73   = 1;..  len = s
85a0: 74 72 6c 65 6e 28 7a 4d 61 73 74 65 72 29 3b 0a  trlen(zMaster);.
85b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6c 65 6e    for(i=0; i<len
85c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 6b 73 75  ; i++){.    cksu
85d0: 6d 20 2b 3d 20 7a 4d 61 73 74 65 72 5b 69 5d 3b  m += zMaster[i];
85e0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 69 6e  .  }..  /* If in
85f0: 20 66 75 6c 6c 2d 73 79 6e 63 20 6d 6f 64 65 2c   full-sync mode,
8600: 20 61 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   advance to the 
8610: 6e 65 78 74 20 64 69 73 6b 20 73 65 63 74 6f 72  next disk sector
8620: 20 62 65 66 6f 72 65 20 77 72 69 74 69 6e 67 0a   before writing.
8630: 20 20 2a 2a 20 74 68 65 20 6d 61 73 74 65 72 20    ** the master 
8640: 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20 54 68  journal name. Th
8650: 69 73 20 69 73 20 69 6e 20 63 61 73 65 20 74 68  is is in case th
8660: 65 20 70 72 65 76 69 6f 75 73 20 70 61 67 65 20  e previous page 
8670: 77 72 69 74 74 65 6e 20 74 6f 0a 20 20 2a 2a 20  written to.  ** 
8680: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 61 73 20  the journal has 
8690: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 73 79 6e  already been syn
86a0: 63 65 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ced..  */.  if( 
86b0: 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63  pPager->fullSync
86c0: 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 65 65   ){.    rc = see
86d0: 6b 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67  kJournalHdr(pPag
86e0: 65 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  er);.    if( rc!
86f0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8700: 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 70 50  urn rc;.  }.  pP
8710: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
8720: 20 2b 3d 20 28 6c 65 6e 2b 32 30 29 3b 0a 0a 20   += (len+20);.. 
8730: 20 72 63 20 3d 20 77 72 69 74 65 33 32 62 69 74   rc = write32bit
8740: 73 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20 50  s(pPager->jfd, P
8750: 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61  AGER_MJ_PGNO(pPa
8760: 67 65 72 29 29 3b 0a 20 20 69 66 28 20 72 63 21  ger));.  if( rc!
8770: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
8780: 75 72 6e 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20  urn rc;..  rc = 
8790: 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70  sqlite3OsWrite(p
87a0: 50 61 67 65 72 2d 3e 6a 66 64 2c 20 7a 4d 61 73  Pager->jfd, zMas
87b0: 74 65 72 2c 20 6c 65 6e 29 3b 0a 20 20 69 66 28  ter, len);.  if(
87c0: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
87d0: 20 72 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 70   return rc;..  p
87e0: 75 74 33 32 62 69 74 73 28 7a 42 75 66 2c 20 6c  ut32bits(zBuf, l
87f0: 65 6e 29 3b 0a 20 20 70 75 74 33 32 62 69 74 73  en);.  put32bits
8800: 28 26 7a 42 75 66 5b 34 5d 2c 20 63 6b 73 75 6d  (&zBuf[4], cksum
8810: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 26 7a 42 75  );.  memcpy(&zBu
8820: 66 5b 38 5d 2c 20 61 4a 6f 75 72 6e 61 6c 4d 61  f[8], aJournalMa
8830: 67 69 63 2c 20 73 69 7a 65 6f 66 28 61 4a 6f 75  gic, sizeof(aJou
8840: 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a 20 20 72  rnalMagic));.  r
8850: 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 57 72 69  c = sqlite3OsWri
8860: 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c 20  te(pPager->jfd, 
8870: 7a 42 75 66 2c 20 38 2b 73 69 7a 65 6f 66 28 61  zBuf, 8+sizeof(a
8880: 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 29 29 3b 0a  JournalMagic));.
8890: 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64 53 79    pPager->needSy
88a0: 6e 63 20 3d 20 21 70 50 61 67 65 72 2d 3e 6e 6f  nc = !pPager->no
88b0: 53 79 6e 63 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sync;.  return r
88c0: 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  c;.}../*.** Add 
88d0: 6f 72 20 72 65 6d 6f 76 65 20 61 20 70 61 67 65  or remove a page
88e0: 20 66 72 6f 6d 20 74 68 65 20 6c 69 73 74 20 6f   from the list o
88f0: 66 20 61 6c 6c 20 70 61 67 65 73 20 74 68 61 74  f all pages that
8900: 20 61 72 65 20 69 6e 20 74 68 65 0a 2a 2a 20 73   are in the.** s
8910: 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c  tatement journal
8920: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 50 61 67 65  ..**.** The Page
8930: 72 20 6b 65 65 70 73 20 61 20 73 65 70 61 72 61  r keeps a separa
8940: 74 65 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73  te list of pages
8950: 20 74 68 61 74 20 61 72 65 20 63 75 72 72 65 6e   that are curren
8960: 74 6c 79 20 69 6e 0a 2a 2a 20 74 68 65 20 73 74  tly in.** the st
8970: 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e  atement journal.
8980: 20 20 54 68 69 73 20 68 65 6c 70 73 20 74 68 65    This helps the
8990: 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d   sqlite3PagerStm
89a0: 74 43 6f 6d 6d 69 74 28 29 0a 2a 2a 20 72 6f 75  tCommit().** rou
89b0: 74 69 6e 65 20 72 75 6e 20 4d 55 43 48 20 66 61  tine run MUCH fa
89c0: 73 74 65 72 20 66 6f 72 20 74 68 65 20 63 6f 6d  ster for the com
89d0: 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65 20 74  mon case where t
89e0: 68 65 72 65 20 61 72 65 20 6d 61 6e 79 0a 2a 2a  here are many.**
89f0: 20 70 61 67 65 73 20 69 6e 20 6d 65 6d 6f 72 79   pages in memory
8a00: 20 62 75 74 20 6f 6e 6c 79 20 61 20 66 65 77 20   but only a few 
8a10: 61 72 65 20 69 6e 20 74 68 65 20 73 74 61 74 65  are in the state
8a20: 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2f  ment journal..*/
8a30: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
8a40: 65 5f 61 64 64 5f 74 6f 5f 73 74 6d 74 5f 6c 69  e_add_to_stmt_li
8a50: 73 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  st(PgHdr *pPg){.
8a60: 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20    Pager *pPager 
8a70: 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20  = pPg->pPager;. 
8a80: 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
8a90: 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
8aa0: 54 28 70 50 67 2c 20 70 50 61 67 65 72 29 3b 0a  T(pPg, pPager);.
8ab0: 20 20 61 73 73 65 72 74 28 20 4d 45 4d 44 42 20    assert( MEMDB 
8ac0: 29 3b 0a 20 20 69 66 28 20 21 70 48 69 73 74 2d  );.  if( !pHist-
8ad0: 3e 69 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20 61  >inStmt ){.    a
8ae0: 73 73 65 72 74 28 20 70 48 69 73 74 2d 3e 70 50  ssert( pHist->pP
8af0: 72 65 76 53 74 6d 74 3d 3d 30 20 26 26 20 70 48  revStmt==0 && pH
8b00: 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 3d 3d  ist->pNextStmt==
8b10: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 50 61  0 );.    if( pPa
8b20: 67 65 72 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20  ger->pStmt ){.  
8b30: 20 20 20 20 50 47 48 44 52 5f 54 4f 5f 48 49 53      PGHDR_TO_HIS
8b40: 54 28 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 2c  T(pPager->pStmt,
8b50: 20 70 50 61 67 65 72 29 2d 3e 70 50 72 65 76 53   pPager)->pPrevS
8b60: 74 6d 74 20 3d 20 70 50 67 3b 0a 20 20 20 20 7d  tmt = pPg;.    }
8b70: 0a 20 20 20 20 70 48 69 73 74 2d 3e 70 4e 65 78  .    pHist->pNex
8b80: 74 53 74 6d 74 20 3d 20 70 50 61 67 65 72 2d 3e  tStmt = pPager->
8b90: 70 53 74 6d 74 3b 0a 20 20 20 20 70 50 61 67 65  pStmt;.    pPage
8ba0: 72 2d 3e 70 53 74 6d 74 20 3d 20 70 50 67 3b 0a  r->pStmt = pPg;.
8bb0: 20 20 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d      pHist->inStm
8bc0: 74 20 3d 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t = 1;.  }.}../*
8bd0: 0a 2a 2a 20 46 69 6e 64 20 61 20 70 61 67 65 20  .** Find a page 
8be0: 69 6e 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  in the hash tabl
8bf0: 65 20 67 69 76 65 6e 20 69 74 73 20 70 61 67 65  e given its page
8c00: 20 6e 75 6d 62 65 72 2e 20 20 52 65 74 75 72 6e   number.  Return
8c10: 0a 2a 2a 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  .** a pointer to
8c20: 20 74 68 65 20 70 61 67 65 20 6f 72 20 4e 55 4c   the page or NUL
8c30: 4c 20 69 66 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a  L if not found..
8c40: 2a 2f 0a 73 74 61 74 69 63 20 50 67 48 64 72 20  */.static PgHdr 
8c50: 2a 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 50 61  *pager_lookup(Pa
8c60: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e  ger *pPager, Pgn
8c70: 6f 20 70 67 6e 6f 29 7b 0a 20 20 50 67 48 64 72  o pgno){.  PgHdr
8c80: 20 2a 70 3b 0a 20 20 69 66 28 20 70 50 61 67 65   *p;.  if( pPage
8c90: 72 2d 3e 61 48 61 73 68 3d 3d 30 20 29 20 72 65  r->aHash==0 ) re
8ca0: 74 75 72 6e 20 30 3b 0a 20 20 70 20 3d 20 70 50  turn 0;.  p = pP
8cb0: 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 67 6e 6f  ager->aHash[pgno
8cc0: 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48 61 73   & (pPager->nHas
8cd0: 68 2d 31 29 5d 3b 0a 20 20 77 68 69 6c 65 28 20  h-1)];.  while( 
8ce0: 70 20 26 26 20 70 2d 3e 70 67 6e 6f 21 3d 70 67  p && p->pgno!=pg
8cf0: 6e 6f 20 29 7b 0a 20 20 20 20 70 20 3d 20 70 2d  no ){.    p = p-
8d00: 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20 20 7d 0a  >pNextHash;.  }.
8d10: 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f    return p;.}../
8d20: 2a 0a 2a 2a 20 55 6e 6c 6f 63 6b 20 74 68 65 20  *.** Unlock the 
8d30: 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a  database file..*
8d40: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61  /.static void pa
8d50: 67 65 72 5f 75 6e 6c 6f 63 6b 28 50 61 67 65 72  ger_unlock(Pager
8d60: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 66 28   *pPager){.  if(
8d70: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
8d80: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 69  iveMode ){.    i
8d90: 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
8da0: 20 20 20 73 71 6c 69 74 65 33 4f 73 55 6e 6c 6f     sqlite3OsUnlo
8db0: 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 4e  ck(pPager->fd, N
8dc0: 4f 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20 20 20 70  O_LOCK);.      p
8dd0: 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20  Pager->dbSize = 
8de0: 2d 31 3b 0a 20 20 20 20 20 20 49 4f 54 52 41 43  -1;.      IOTRAC
8df0: 45 28 28 22 55 4e 4c 4f 43 4b 20 25 70 5c 6e 22  E(("UNLOCK %p\n"
8e00: 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20 7d  , pPager)).    }
8e10: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61  .    pPager->sta
8e20: 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
8e30: 4b 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63  K;.    pPager->c
8e40: 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d  hangeCountDone =
8e50: 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   0;.  }.}../*.**
8e60: 20 45 78 65 63 75 74 65 20 61 20 72 6f 6c 6c 62   Execute a rollb
8e70: 61 63 6b 20 69 66 20 61 20 74 72 61 6e 73 61 63  ack if a transac
8e80: 74 69 6f 6e 20 69 73 20 61 63 74 69 76 65 20 61  tion is active a
8e90: 6e 64 20 75 6e 6c 6f 63 6b 20 74 68 65 20 0a 2a  nd unlock the .*
8ea0: 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  * database file.
8eb0: 20 54 68 69 73 20 69 73 20 61 20 6e 6f 2d 6f 70   This is a no-op
8ec0: 20 69 66 20 74 68 65 20 70 61 67 65 72 20 68 61   if the pager ha
8ed0: 73 20 61 6c 72 65 61 64 79 20 65 6e 74 65 72 65  s already entere
8ee0: 64 0a 2a 2a 20 74 68 65 20 65 72 72 6f 72 2d 73  d.** the error-s
8ef0: 74 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tate..*/.static 
8f00: 76 6f 69 64 20 70 61 67 65 72 55 6e 6c 6f 63 6b  void pagerUnlock
8f10: 41 6e 64 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65  AndRollback(Page
8f20: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  r *p){.  if( p->
8f30: 65 72 72 43 6f 64 65 20 29 20 72 65 74 75 72 6e  errCode ) return
8f40: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e 73  ;.  assert( p->s
8f50: 74 61 74 65 3e 3d 50 41 47 45 52 5f 52 45 53 45  tate>=PAGER_RESE
8f60: 52 56 45 44 20 7c 7c 20 70 2d 3e 6a 6f 75 72 6e  RVED || p->journ
8f70: 61 6c 4f 70 65 6e 3d 3d 30 20 29 3b 0a 20 20 69  alOpen==0 );.  i
8f80: 66 28 20 70 2d 3e 73 74 61 74 65 3e 3d 50 41 47  f( p->state>=PAG
8f90: 45 52 5f 52 45 53 45 52 56 45 44 20 29 7b 0a 20  ER_RESERVED ){. 
8fa0: 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 52     sqlite3PagerR
8fb0: 6f 6c 6c 62 61 63 6b 28 70 29 3b 0a 20 20 7d 0a  ollback(p);.  }.
8fc0: 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28 70    pager_unlock(p
8fd0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d 3e  );.  assert( p->
8fe0: 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e 6a  errCode || !p->j
8ff0: 6f 75 72 6e 61 6c 4f 70 65 6e 20 7c 7c 20 28 70  ournalOpen || (p
9000: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 26  ->exclusiveMode&
9010: 26 21 70 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29  &!p->journalOff)
9020: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 2d   );.  assert( p-
9030: 3e 65 72 72 43 6f 64 65 20 7c 7c 20 21 70 2d 3e  >errCode || !p->
9040: 73 74 6d 74 4f 70 65 6e 20 7c 7c 20 70 2d 3e 65  stmtOpen || p->e
9050: 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 29 3b 0a  xclusiveMode );.
9060: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20  }.../*.** Clear 
9070: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 63 61  the in-memory ca
9080: 63 68 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69  che.  This routi
9090: 6e 65 0a 2a 2a 20 73 65 74 73 20 74 68 65 20 73  ne.** sets the s
90a0: 74 61 74 65 20 6f 66 20 74 68 65 20 70 61 67 65  tate of the page
90b0: 72 20 62 61 63 6b 20 74 6f 20 77 68 61 74 20 69  r back to what i
90c0: 74 20 77 61 73 20 77 68 65 6e 20 69 74 20 77 61  t was when it wa
90d0: 73 20 66 69 72 73 74 0a 2a 2a 20 6f 70 65 6e 65  s first.** opene
90e0: 64 2e 20 20 41 6e 79 20 6f 75 74 73 74 61 6e 64  d.  Any outstand
90f0: 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69 6e  ing pages are in
9100: 76 61 6c 69 64 61 74 65 64 20 61 6e 64 20 73 75  validated and su
9110: 62 73 65 71 75 65 6e 74 20 61 74 74 65 6d 70 74  bsequent attempt
9120: 73 0a 2a 2a 20 74 6f 20 61 63 63 65 73 73 20 74  s.** to access t
9130: 68 6f 73 65 20 70 61 67 65 73 20 77 69 6c 6c 20  hose pages will 
9140: 6c 69 6b 65 6c 79 20 72 65 73 75 6c 74 20 69 6e  likely result in
9150: 20 61 20 63 6f 72 65 64 75 6d 70 2e 0a 2a 2f 0a   a coredump..*/.
9160: 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67 65  static void page
9170: 72 5f 72 65 73 65 74 28 50 61 67 65 72 20 2a 70  r_reset(Pager *p
9180: 50 61 67 65 72 29 7b 0a 20 20 50 67 48 64 72 20  Pager){.  PgHdr 
9190: 2a 70 50 67 2c 20 2a 70 4e 65 78 74 3b 0a 20 20  *pPg, *pNext;.  
91a0: 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  if( pPager->errC
91b0: 6f 64 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ode ) return;.  
91c0: 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e  for(pPg=pPager->
91d0: 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70  pAll; pPg; pPg=p
91e0: 4e 65 78 74 29 7b 0a 20 20 20 20 49 4f 54 52 41  Next){.    IOTRA
91f0: 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20 25  CE(("PGFREE %p %
9200: 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
9210: 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20 50  g->pgno));.    P
9220: 41 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65  AGER_INCR(sqlite
9230: 33 5f 70 61 67 65 72 5f 70 67 66 72 65 65 5f 63  3_pager_pgfree_c
9240: 6f 75 6e 74 29 3b 0a 20 20 20 20 70 4e 65 78 74  ount);.    pNext
9250: 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c   = pPg->pNextAll
9260: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
9270: 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 70 50 61  (pPg);.  }.  pPa
9280: 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
9290: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
92a0: 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
92b0: 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20 30  pFirstSynced = 0
92c0: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73  ;.  pPager->pLas
92d0: 74 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  t = 0;.  pPager-
92e0: 3e 70 41 6c 6c 20 3d 20 30 3b 0a 20 20 70 50 61  >pAll = 0;.  pPa
92f0: 67 65 72 2d 3e 6e 48 61 73 68 20 3d 20 30 3b 0a  ger->nHash = 0;.
9300: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61    sqliteFree(pPa
9310: 67 65 72 2d 3e 61 48 61 73 68 29 3b 0a 20 20 70  ger->aHash);.  p
9320: 50 61 67 65 72 2d 3e 6e 50 61 67 65 20 3d 20 30  Pager->nPage = 0
9330: 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61 73  ;.  pPager->aHas
9340: 68 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d  h = 0;.  pPager-
9350: 3e 6e 52 65 66 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  >nRef = 0;.}../*
9360: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9370: 20 65 6e 64 73 20 61 20 74 72 61 6e 73 61 63 74   ends a transact
9380: 69 6f 6e 2e 20 20 41 20 74 72 61 6e 73 61 63 74  ion.  A transact
9390: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 62 79 20  ion is ended by 
93a0: 65 69 74 68 65 72 0a 2a 2a 20 61 20 43 4f 4d 4d  either.** a COMM
93b0: 49 54 20 6f 72 20 61 20 52 4f 4c 4c 42 41 43 4b  IT or a ROLLBACK
93c0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 69  ..**.** When thi
93d0: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
93e0: 6c 65 64 2c 20 74 68 65 20 70 61 67 65 72 20 68  led, the pager h
93f0: 61 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  as the journal f
9400: 69 6c 65 20 6f 70 65 6e 20 61 6e 64 0a 2a 2a 20  ile open and.** 
9410: 61 20 52 45 53 45 52 56 45 44 20 6f 72 20 45 58  a RESERVED or EX
9420: 43 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20  CLUSIVE lock on 
9430: 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54  the database.  T
9440: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 69 6c 6c  his routine will
9450: 20 72 65 6c 65 61 73 65 0a 2a 2a 20 74 68 65 20   release.** the 
9460: 64 61 74 61 62 61 73 65 20 6c 6f 63 6b 20 61 6e  database lock an
9470: 64 20 61 63 71 75 69 72 65 73 20 61 20 53 48 41  d acquires a SHA
9480: 52 45 44 20 6c 6f 63 6b 20 69 6e 20 69 74 73 20  RED lock in its 
9490: 70 6c 61 63 65 20 69 66 20 74 68 61 74 20 69 73  place if that is
94a0: 0a 2a 2a 20 74 68 65 20 61 70 70 72 6f 70 72 69  .** the appropri
94b0: 61 74 65 20 74 68 69 6e 67 20 74 6f 20 64 6f 2e  ate thing to do.
94c0: 20 20 52 65 6c 65 61 73 65 20 6c 6f 63 6b 73 20    Release locks 
94d0: 75 73 75 61 6c 6c 79 20 69 73 20 61 70 70 72 6f  usually is appro
94e0: 70 72 69 61 74 65 2c 0a 2a 2a 20 75 6e 6c 65 73  priate,.** unles
94f0: 73 20 77 65 20 61 72 65 20 69 6e 20 65 78 63 6c  s we are in excl
9500: 75 73 69 76 65 20 61 63 63 65 73 73 20 6d 6f 64  usive access mod
9510: 65 20 6f 72 20 75 6e 6c 65 73 73 20 74 68 69 73  e or unless this
9520: 20 69 73 20 61 20 0a 2a 2a 20 43 4f 4d 4d 49 54   is a .** COMMIT
9530: 20 41 4e 44 20 42 45 47 49 4e 20 6f 72 20 52 4f   AND BEGIN or RO
9540: 4c 4c 42 41 43 4b 20 41 4e 44 20 42 45 47 49 4e  LLBACK AND BEGIN
9550: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a   operation..**.*
9560: 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  * The journal fi
9570: 6c 65 20 69 73 20 65 69 74 68 65 72 20 64 65 6c  le is either del
9580: 65 74 65 64 20 6f 72 20 74 72 75 6e 63 61 74 65  eted or truncate
9590: 64 2e 0a 2a 2a 0a 2a 2a 20 54 4f 44 4f 3a 20 43  d..**.** TODO: C
95a0: 6f 6e 73 69 64 65 72 20 6b 65 65 70 69 6e 67 20  onsider keeping 
95b0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
95c0: 20 6f 70 65 6e 20 66 6f 72 20 74 65 6d 70 6f 72   open for tempor
95d0: 61 72 79 20 64 61 74 61 62 61 73 65 73 2e 0a 2a  ary databases..*
95e0: 2a 20 54 68 69 73 20 6d 69 67 68 74 20 67 69 76  * This might giv
95f0: 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65 20  e a performance 
9600: 69 6d 70 72 6f 76 65 6d 65 6e 74 20 6f 6e 20 77  improvement on w
9610: 69 6e 64 6f 77 73 20 77 68 65 72 65 20 6f 70 65  indows where ope
9620: 6e 69 6e 67 0a 2a 2a 20 61 20 66 69 6c 65 20 69  ning.** a file i
9630: 73 20 61 6e 20 65 78 70 65 6e 73 69 76 65 20 6f  s an expensive o
9640: 70 65 72 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61  peration..*/.sta
9650: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 65 6e  tic int pager_en
9660: 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e 28 50 61  d_transaction(Pa
9670: 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
9680: 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
9690: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
96a0: 3b 0a 20 20 69 6e 74 20 72 63 32 20 3d 20 53 51  ;.  int rc2 = SQ
96b0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 61 73 73 65 72  LITE_OK;.  asser
96c0: 74 28 20 21 4d 45 4d 44 42 20 29 3b 0a 20 20 69  t( !MEMDB );.  i
96d0: 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65  f( pPager->state
96e0: 3c 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 20  <PAGER_RESERVED 
96f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
9700: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 73  LITE_OK;.  }.  s
9710: 71 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 43  qlite3PagerStmtC
9720: 6f 6d 6d 69 74 28 70 50 61 67 65 72 29 3b 0a 20  ommit(pPager);. 
9730: 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
9740: 74 4f 70 65 6e 20 26 26 20 21 70 50 61 67 65 72  tOpen && !pPager
9750: 2d 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20  ->exclusiveMode 
9760: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  ){.    sqlite3Os
9770: 43 6c 6f 73 65 28 26 70 50 61 67 65 72 2d 3e 73  Close(&pPager->s
9780: 74 66 64 29 3b 0a 20 20 20 20 70 50 61 67 65 72  tfd);.    pPager
9790: 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30 3b 0a  ->stmtOpen = 0;.
97a0: 20 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72    }.  if( pPager
97b0: 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29 7b  ->journalOpen ){
97c0: 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
97d0: 3e 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 0a  >exclusiveMode .
97e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 72 63            && (rc
97f0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 54 72 75 6e   = sqlite3OsTrun
9800: 63 61 74 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  cate(pPager->jfd
9810: 2c 20 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  , 0))==SQLITE_OK
9820: 20 29 7b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   ){;.      sqlit
9830: 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
9840: 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
9850: 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
9860: 66 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50  ff = 0;.      pP
9870: 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61  ager->journalSta
9880: 72 74 65 64 20 3d 20 30 3b 0a 20 20 20 20 7d 65  rted = 0;.    }e
9890: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
98a0: 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
98b0: 72 2d 3e 6a 66 64 29 3b 0a 20 20 20 20 20 20 70  r->jfd);.      p
98c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
98d0: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  en = 0;.      if
98e0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
98f0: 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
9900: 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28  sqlite3OsDelete(
9910: 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c  pPager->zJournal
9920: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
9930: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
9940: 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
9950: 6e 61 6c 20 29 3b 0a 20 20 20 20 70 50 61 67 65  nal );.    pPage
9960: 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
9970: 30 3b 0a 20 20 20 20 66 6f 72 28 70 50 67 3d 70  0;.    for(pPg=p
9980: 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70 50 67  Pager->pAll; pPg
9990: 3b 20 70 50 67 3d 70 50 67 2d 3e 70 4e 65 78 74  ; pPg=pPg->pNext
99a0: 41 6c 6c 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  All){.      pPg-
99b0: 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a  >inJournal = 0;.
99c0: 20 20 20 20 20 20 70 50 67 2d 3e 64 69 72 74 79        pPg->dirty
99d0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 70 50 67 2d   = 0;.      pPg-
99e0: 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20  >needSync = 0;. 
99f0: 20 20 20 20 20 70 50 67 2d 3e 61 6c 77 61 79 73       pPg->always
9a00: 52 6f 6c 6c 62 61 63 6b 20 3d 20 30 3b 0a 23 69  Rollback = 0;.#i
9a10: 66 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43  fdef SQLITE_CHEC
9a20: 4b 5f 50 41 47 45 53 0a 20 20 20 20 20 20 70 50  K_PAGES.      pP
9a30: 67 2d 3e 70 61 67 65 48 61 73 68 20 3d 20 70 61  g->pageHash = pa
9a40: 67 65 72 5f 70 61 67 65 68 61 73 68 28 70 50 67  ger_pagehash(pPg
9a50: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
9a60: 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
9a70: 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67  ty = 0;.    pPag
9a80: 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20 3d  er->dirtyCache =
9a90: 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   0;.    pPager->
9aa0: 6e 52 65 63 20 3d 20 30 3b 0a 20 20 7d 65 6c 73  nRec = 0;.  }els
9ab0: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e{.    assert( p
9ac0: 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
9ad0: 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65  l==0 );.    asse
9ae0: 72 74 28 20 70 50 61 67 65 72 2d 3e 64 69 72 74  rt( pPager->dirt
9af0: 79 43 61 63 68 65 3d 3d 30 20 7c 7c 20 70 50 61  yCache==0 || pPa
9b00: 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 3d  ger->useJournal=
9b10: 3d 30 20 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  =0 );.  }..  if(
9b20: 20 21 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73   !pPager->exclus
9b30: 69 76 65 4d 6f 64 65 20 29 7b 0a 20 20 20 20 72  iveMode ){.    r
9b40: 63 32 20 3d 20 73 71 6c 69 74 65 33 4f 73 55 6e  c2 = sqlite3OsUn
9b50: 6c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  lock(pPager->fd,
9b60: 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
9b70: 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65     pPager->state
9b80: 20 3d 20 50 41 47 45 52 5f 53 48 41 52 45 44 3b   = PAGER_SHARED;
9b90: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 61  .  }else if( pPa
9ba0: 67 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45  ger->state==PAGE
9bb0: 52 5f 53 59 4e 43 45 44 20 29 7b 0a 20 20 20 20  R_SYNCED ){.    
9bc0: 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
9bd0: 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45 3b  PAGER_EXCLUSIVE;
9be0: 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6f  .  }.  pPager->o
9bf0: 72 69 67 44 62 53 69 7a 65 20 3d 20 30 3b 0a 20  rigDbSize = 0;. 
9c00: 20 70 50 61 67 65 72 2d 3e 73 65 74 4d 61 73 74   pPager->setMast
9c10: 65 72 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72  er = 0;.  pPager
9c20: 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
9c30: 20 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74    pPager->pFirst
9c40: 53 79 6e 63 65 64 20 3d 20 70 50 61 67 65 72 2d  Synced = pPager-
9c50: 3e 70 46 69 72 73 74 3b 0a 20 20 70 50 61 67 65  >pFirst;.  pPage
9c60: 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d 31 3b 0a  r->dbSize = -1;.
9c70: 0a 20 20 72 65 74 75 72 6e 20 28 72 63 3d 3d 53  .  return (rc==S
9c80: 51 4c 49 54 45 5f 4f 4b 3f 72 63 32 3a 72 63 29  QLITE_OK?rc2:rc)
9c90: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 75  ;.}../*.** Compu
9ca0: 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  te and return a 
9cb0: 63 68 65 63 6b 73 75 6d 20 66 6f 72 20 74 68 65  checksum for the
9cc0: 20 70 61 67 65 20 6f 66 20 64 61 74 61 2e 0a 2a   page of data..*
9cd0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6e 6f 74  *.** This is not
9ce0: 20 61 20 72 65 61 6c 20 63 68 65 63 6b 73 75 6d   a real checksum
9cf0: 2e 20 20 49 74 20 69 73 20 72 65 61 6c 6c 79 20  .  It is really 
9d00: 6a 75 73 74 20 74 68 65 20 73 75 6d 20 6f 66 20  just the sum of 
9d10: 74 68 65 20 0a 2a 2a 20 72 61 6e 64 6f 6d 20 69  the .** random i
9d20: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 61 6e 64  nitial value and
9d30: 20 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72   the page number
9d40: 2e 20 20 57 65 20 65 78 70 65 72 69 6d 65 6e 74  .  We experiment
9d50: 65 64 20 77 69 74 68 0a 2a 2a 20 61 20 63 68 65  ed with.** a che
9d60: 63 6b 73 75 6d 20 6f 66 20 74 68 65 20 65 6e 74  cksum of the ent
9d70: 69 72 65 20 64 61 74 61 2c 20 62 75 74 20 74 68  ire data, but th
9d80: 61 74 20 77 61 73 20 66 6f 75 6e 64 20 74 6f 20  at was found to 
9d90: 62 65 20 74 6f 6f 20 73 6c 6f 77 2e 0a 2a 2a 0a  be too slow..**.
9da0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
9db0: 20 70 61 67 65 20 6e 75 6d 62 65 72 20 69 73 20   page number is 
9dc0: 73 74 6f 72 65 64 20 61 74 20 74 68 65 20 62 65  stored at the be
9dd0: 67 69 6e 6e 69 6e 67 20 6f 66 20 64 61 74 61 20  ginning of data 
9de0: 61 6e 64 0a 2a 2a 20 74 68 65 20 63 68 65 63 6b  and.** the check
9df0: 73 75 6d 20 69 73 20 73 74 6f 72 65 64 20 61 74  sum is stored at
9e00: 20 74 68 65 20 65 6e 64 2e 20 20 54 68 69 73 20   the end.  This 
9e10: 69 73 20 69 6d 70 6f 72 74 61 6e 74 2e 20 20 49  is important.  I
9e20: 66 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 63 6f 72  f journal.** cor
9e30: 72 75 70 74 69 6f 6e 20 6f 63 63 75 72 73 20 64  ruption occurs d
9e40: 75 65 20 74 6f 20 61 20 70 6f 77 65 72 20 66 61  ue to a power fa
9e50: 69 6c 75 72 65 2c 20 74 68 65 20 6d 6f 73 74 20  ilure, the most 
9e60: 6c 69 6b 65 6c 79 20 73 63 65 6e 61 72 69 6f 0a  likely scenario.
9e70: 2a 2a 20 69 73 20 74 68 61 74 20 6f 6e 65 20 65  ** is that one e
9e80: 6e 64 20 6f 72 20 74 68 65 20 6f 74 68 65 72 20  nd or the other 
9e90: 6f 66 20 74 68 65 20 72 65 63 6f 72 64 20 77 69  of the record wi
9ea0: 6c 6c 20 62 65 20 63 68 61 6e 67 65 64 2e 20 20  ll be changed.  
9eb0: 49 74 20 69 73 0a 2a 2a 20 6d 75 63 68 20 6c 65  It is.** much le
9ec0: 73 73 20 6c 69 6b 65 6c 79 20 74 68 61 74 20 74  ss likely that t
9ed0: 68 65 20 74 77 6f 20 65 6e 64 73 20 6f 66 20 74  he two ends of t
9ee0: 68 65 20 6a 6f 75 72 6e 61 6c 20 72 65 63 6f 72  he journal recor
9ef0: 64 20 77 69 6c 6c 20 62 65 0a 2a 2a 20 63 6f 72  d will be.** cor
9f00: 72 65 63 74 20 61 6e 64 20 74 68 65 20 6d 69 64  rect and the mid
9f10: 64 6c 65 20 62 65 20 63 6f 72 72 75 70 74 2e 20  dle be corrupt. 
9f20: 20 54 68 75 73 2c 20 74 68 69 73 20 22 63 68 65   Thus, this "che
9f30: 63 6b 73 75 6d 22 20 73 63 68 65 6d 65 2c 0a 2a  cksum" scheme,.*
9f40: 2a 20 74 68 6f 75 67 68 20 66 61 73 74 20 61 6e  * though fast an
9f50: 64 20 73 69 6d 70 6c 65 2c 20 63 61 74 63 68 65  d simple, catche
9f60: 73 20 74 68 65 20 6d 6f 73 74 6c 79 20 6c 69 6b  s the mostly lik
9f70: 65 6c 79 20 6b 69 6e 64 20 6f 66 20 63 6f 72 72  ely kind of corr
9f80: 75 70 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 46 49  uption..**.** FI
9f90: 58 20 4d 45 3a 20 20 43 6f 6e 73 69 64 65 72 20  X ME:  Consider 
9fa0: 61 64 64 69 6e 67 20 65 76 65 72 79 20 32 30 30  adding every 200
9fb0: 74 68 20 28 6f 72 20 73 6f 29 20 62 79 74 65 20  th (or so) byte 
9fc0: 6f 66 20 74 68 65 20 64 61 74 61 20 74 6f 20 74  of the data to t
9fd0: 68 65 0a 2a 2a 20 63 68 65 63 6b 73 75 6d 2e 20  he.** checksum. 
9fe0: 20 54 68 61 74 20 77 61 79 20 69 66 20 61 20 73   That way if a s
9ff0: 69 6e 67 6c 65 20 70 61 67 65 20 73 70 61 6e 73  ingle page spans
a000: 20 33 20 6f 72 20 6d 6f 72 65 20 64 69 73 6b 20   3 or more disk 
a010: 73 65 63 74 6f 72 73 20 61 6e 64 0a 2a 2a 20 6f  sectors and.** o
a020: 6e 6c 79 20 74 68 65 20 6d 69 64 64 6c 65 20 73  nly the middle s
a030: 65 63 74 6f 72 20 69 73 20 63 6f 72 72 75 70 74  ector is corrupt
a040: 2c 20 77 65 20 77 69 6c 6c 20 73 74 69 6c 6c 20  , we will still 
a050: 68 61 76 65 20 61 20 72 65 61 73 6f 6e 61 62 6c  have a reasonabl
a060: 65 0a 2a 2a 20 63 68 61 6e 63 65 20 6f 66 20 66  e.** chance of f
a070: 61 69 6c 69 6e 67 20 74 68 65 20 63 68 65 63 6b  ailing the check
a080: 73 75 6d 20 61 6e 64 20 74 68 75 73 20 64 65 74  sum and thus det
a090: 65 63 74 69 6e 67 20 74 68 65 20 70 72 6f 62 6c  ecting the probl
a0a0: 65 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 33  em..*/.static u3
a0b0: 32 20 70 61 67 65 72 5f 63 6b 73 75 6d 28 50 61  2 pager_cksum(Pa
a0c0: 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63 6f 6e  ger *pPager, con
a0d0: 73 74 20 75 38 20 2a 61 44 61 74 61 29 7b 0a 20  st u8 *aData){. 
a0e0: 20 75 33 32 20 63 6b 73 75 6d 20 3d 20 70 50 61   u32 cksum = pPa
a0f0: 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74 3b 0a  ger->cksumInit;.
a100: 20 20 69 6e 74 20 69 20 3d 20 70 50 61 67 65 72    int i = pPager
a110: 2d 3e 70 61 67 65 53 69 7a 65 2d 32 30 30 3b 0a  ->pageSize-200;.
a120: 20 20 77 68 69 6c 65 28 20 69 3e 30 20 29 7b 0a    while( i>0 ){.
a130: 20 20 20 20 63 6b 73 75 6d 20 2b 3d 20 61 44 61      cksum += aDa
a140: 74 61 5b 69 5d 3b 0a 20 20 20 20 69 20 2d 3d 20  ta[i];.    i -= 
a150: 32 30 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  200;.  }.  retur
a160: 6e 20 63 6b 73 75 6d 3b 0a 7d 0a 0a 2f 2a 20 46  n cksum;.}../* F
a170: 6f 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69  orward declarati
a180: 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on */.static voi
a190: 64 20 6d 61 6b 65 43 6c 65 61 6e 28 50 67 48 64  d makeClean(PgHd
a1a0: 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64  r*);../*.** Read
a1b0: 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20 66   a single page f
a1c0: 72 6f 6d 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  rom the journal 
a1d0: 66 69 6c 65 20 6f 70 65 6e 65 64 20 6f 6e 20 66  file opened on f
a1e0: 69 6c 65 20 64 65 73 63 72 69 70 74 6f 72 0a 2a  ile descriptor.*
a1f0: 2a 20 6a 66 64 2e 20 20 50 6c 61 79 62 61 63 6b  * jfd.  Playback
a200: 20 74 68 69 73 20 6f 6e 65 20 70 61 67 65 2e 0a   this one page..
a210: 2a 2a 0a 2a 2a 20 49 66 20 75 73 65 43 6b 73 75  **.** If useCksu
a220: 6d 3d 3d 30 20 69 74 20 6d 65 61 6e 73 20 74 68  m==0 it means th
a230: 69 73 20 6a 6f 75 72 6e 61 6c 20 64 6f 65 73 20  is journal does 
a240: 6e 6f 74 20 75 73 65 20 63 68 65 63 6b 73 75 6d  not use checksum
a250: 73 2e 20 20 43 68 65 63 6b 73 75 6d 73 0a 2a 2a  s.  Checksums.**
a260: 20 61 72 65 20 6e 6f 74 20 75 73 65 64 20 69 6e   are not used in
a270: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
a280: 61 6c 73 20 62 65 63 61 75 73 65 20 73 74 61 74  als because stat
a290: 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 73 20 64  ement journals d
a2a0: 6f 20 6e 6f 74 0a 2a 2a 20 6e 65 65 64 20 74 6f  o not.** need to
a2b0: 20 73 75 72 76 69 76 65 20 70 6f 77 65 72 20 66   survive power f
a2c0: 61 69 6c 75 72 65 73 2e 0a 2a 2f 0a 73 74 61 74  ailures..*/.stat
a2d0: 69 63 20 69 6e 74 20 70 61 67 65 72 5f 70 6c 61  ic int pager_pla
a2e0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 50  yback_one_page(P
a2f0: 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 4f 73  ager *pPager, Os
a300: 46 69 6c 65 20 2a 6a 66 64 2c 20 69 6e 74 20 75  File *jfd, int u
a310: 73 65 43 6b 73 75 6d 29 7b 0a 20 20 69 6e 74 20  seCksum){.  int 
a320: 72 63 3b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  rc;.  PgHdr *pPg
a330: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a340: 20 20 20 20 2f 2a 20 41 6e 20 65 78 69 73 74 69      /* An existi
a350: 6e 67 20 70 61 67 65 20 69 6e 20 74 68 65 20 63  ng page in the c
a360: 61 63 68 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70  ache */.  Pgno p
a370: 67 6e 6f 3b 20 20 20 20 20 20 20 20 20 20 20 20  gno;            
a380: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70          /* The p
a390: 61 67 65 20 6e 75 6d 62 65 72 20 6f 66 20 61 20  age number of a 
a3a0: 70 61 67 65 20 69 6e 20 6a 6f 75 72 6e 61 6c 20  page in journal 
a3b0: 2a 2f 0a 20 20 75 33 32 20 63 6b 73 75 6d 3b 20  */.  u32 cksum; 
a3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3d0: 20 20 20 2f 2a 20 43 68 65 63 6b 73 75 6d 20 75     /* Checksum u
a3e0: 73 65 64 20 66 6f 72 20 73 61 6e 69 74 79 20 63  sed for sanity c
a3f0: 68 65 63 6b 69 6e 67 20 2a 2f 0a 20 20 75 38 20  hecking */.  u8 
a400: 2a 61 44 61 74 61 20 3d 20 28 75 38 20 2a 29 70  *aData = (u8 *)p
a410: 50 61 67 65 72 2d 3e 70 54 6d 70 53 70 61 63 65  Pager->pTmpSpace
a420: 3b 20 20 20 2f 2a 20 54 65 6d 70 20 73 74 6f 72  ;   /* Temp stor
a430: 61 67 65 20 66 6f 72 20 61 20 70 61 67 65 20 2a  age for a page *
a440: 2f 0a 0a 20 20 2f 2a 20 75 73 65 43 6b 73 75 6d  /..  /* useCksum
a450: 20 73 68 6f 75 6c 64 20 62 65 20 74 72 75 65 20   should be true 
a460: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 6a 6f 75  for the main jou
a470: 72 6e 61 6c 20 61 6e 64 20 66 61 6c 73 65 20 66  rnal and false f
a480: 6f 72 0a 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e  or.  ** statemen
a490: 74 20 6a 6f 75 72 6e 61 6c 73 2e 20 20 56 65 72  t journals.  Ver
a4a0: 69 66 79 20 74 68 61 74 20 74 68 69 73 20 69 73  ify that this is
a4b0: 20 61 6c 77 61 79 73 20 74 68 65 20 63 61 73 65   always the case
a4c0: 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
a4d0: 6a 66 64 20 3d 3d 20 28 75 73 65 43 6b 73 75 6d  jfd == (useCksum
a4e0: 20 3f 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 3a   ? pPager->jfd :
a4f0: 20 70 50 61 67 65 72 2d 3e 73 74 66 64 29 20 29   pPager->stfd) )
a500: 3b 0a 20 20 61 73 73 65 72 74 28 20 61 44 61 74  ;.  assert( aDat
a510: 61 20 29 3b 0a 0a 20 20 72 63 20 3d 20 72 65 61  a );..  rc = rea
a520: 64 33 32 62 69 74 73 28 6a 66 64 2c 20 26 70 67  d32bits(jfd, &pg
a530: 6e 6f 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  no);.  if( rc!=S
a540: 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72  QLITE_OK ) retur
a550: 6e 20 72 63 3b 0a 20 20 72 63 20 3d 20 73 71 6c  n rc;.  rc = sql
a560: 69 74 65 33 4f 73 52 65 61 64 28 6a 66 64 2c 20  ite3OsRead(jfd, 
a570: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
a580: 61 67 65 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  ageSize);.  if( 
a590: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
a5a0: 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 70 50 61  return rc;.  pPa
a5b0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
a5c0: 2b 3d 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  += pPager->pageS
a5d0: 69 7a 65 20 2b 20 34 3b 0a 0a 20 20 2f 2a 20 53  ize + 4;..  /* S
a5e0: 61 6e 69 74 79 20 63 68 65 63 6b 69 6e 67 20 6f  anity checking o
a5f0: 6e 20 74 68 65 20 70 61 67 65 2e 20 20 54 68 69  n the page.  Thi
a600: 73 20 69 73 20 6d 6f 72 65 20 69 6d 70 6f 72 74  s is more import
a610: 61 6e 74 20 74 68 61 74 20 49 20 6f 72 69 67 69  ant that I origi
a620: 6e 61 6c 6c 79 0a 20 20 2a 2a 20 74 68 6f 75 67  nally.  ** thoug
a630: 68 74 2e 20 20 49 66 20 61 20 70 6f 77 65 72 20  ht.  If a power 
a640: 66 61 69 6c 75 72 65 20 6f 63 63 75 72 73 20 77  failure occurs w
a650: 68 69 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c  hile the journal
a660: 20 69 73 20 62 65 69 6e 67 20 77 72 69 74 74 65   is being writte
a670: 6e 2c 0a 20 20 2a 2a 20 69 74 20 63 6f 75 6c 64  n,.  ** it could
a680: 20 63 61 75 73 65 20 69 6e 76 61 6c 69 64 20 64   cause invalid d
a690: 61 74 61 20 74 6f 20 62 65 20 77 72 69 74 74 65  ata to be writte
a6a0: 6e 20 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e  n into the journ
a6b0: 61 6c 2e 20 20 57 65 20 6e 65 65 64 20 74 6f 0a  al.  We need to.
a6c0: 20 20 2a 2a 20 64 65 74 65 63 74 20 74 68 69 73    ** detect this
a6d0: 20 69 6e 76 61 6c 69 64 20 64 61 74 61 20 28 77   invalid data (w
a6e0: 69 74 68 20 68 69 67 68 20 70 72 6f 62 61 62 69  ith high probabi
a6f0: 6c 69 74 79 29 20 61 6e 64 20 69 67 6e 6f 72 65  lity) and ignore
a700: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
a710: 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e 6f 3d  pgno==0 || pgno=
a720: 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f 28 70  =PAGER_MJ_PGNO(p
a730: 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20 72 65  Pager) ){.    re
a740: 74 75 72 6e 20 53 51 4c 49 54 45 5f 44 4f 4e 45  turn SQLITE_DONE
a750: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 67 6e 6f  ;.  }.  if( pgno
a760: 3e 28 75 6e 73 69 67 6e 65 64 29 70 50 61 67 65  >(unsigned)pPage
a770: 72 2d 3e 64 62 53 69 7a 65 20 29 7b 0a 20 20 20  r->dbSize ){.   
a780: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
a790: 4b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 75 73 65  K;.  }.  if( use
a7a0: 43 6b 73 75 6d 20 29 7b 0a 20 20 20 20 72 63 20  Cksum ){.    rc 
a7b0: 3d 20 72 65 61 64 33 32 62 69 74 73 28 6a 66 64  = read32bits(jfd
a7c0: 2c 20 26 63 6b 73 75 6d 29 3b 0a 20 20 20 20 69  , &cksum);.    i
a7d0: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72  f( rc ) return r
a7e0: 63 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6a  c;.    pPager->j
a7f0: 6f 75 72 6e 61 6c 4f 66 66 20 2b 3d 20 34 3b 0a  ournalOff += 4;.
a800: 20 20 20 20 69 66 28 20 70 61 67 65 72 5f 63 6b      if( pager_ck
a810: 73 75 6d 28 70 50 61 67 65 72 2c 20 61 44 61 74  sum(pPager, aDat
a820: 61 29 21 3d 63 6b 73 75 6d 20 29 7b 0a 20 20 20  a)!=cksum ){.   
a830: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
a840: 5f 44 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d  _DONE;.    }.  }
a850: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ..  assert( pPag
a860: 65 72 2d 3e 73 74 61 74 65 3d 3d 50 41 47 45 52  er->state==PAGER
a870: 5f 52 45 53 45 52 56 45 44 20 7c 7c 20 70 50 61  _RESERVED || pPa
a880: 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
a890: 52 5f 45 58 43 4c 55 53 49 56 45 20 29 3b 0a 0a  R_EXCLUSIVE );..
a8a0: 20 20 2f 2a 20 49 66 20 74 68 65 20 70 61 67 65    /* If the page
a8b0: 72 20 69 73 20 69 6e 20 52 45 53 45 52 56 45 44  r is in RESERVED
a8c0: 20 73 74 61 74 65 2c 20 74 68 65 6e 20 74 68 65   state, then the
a8d0: 72 65 20 6d 75 73 74 20 62 65 20 61 20 63 6f 70  re must be a cop
a8e0: 79 20 6f 66 20 74 68 69 73 0a 20 20 2a 2a 20 70  y of this.  ** p
a8f0: 61 67 65 20 69 6e 20 74 68 65 20 70 61 67 65 72  age in the pager
a900: 20 63 61 63 68 65 2e 20 49 6e 20 74 68 69 73 20   cache. In this 
a910: 63 61 73 65 20 6a 75 73 74 20 75 70 64 61 74 65  case just update
a920: 20 74 68 65 20 70 61 67 65 72 20 63 61 63 68 65   the pager cache
a930: 2c 0a 20 20 2a 2a 20 6e 6f 74 20 74 68 65 20 64  ,.  ** not the d
a940: 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 54 68  atabase file. Th
a950: 65 20 70 61 67 65 20 69 73 20 6c 65 66 74 20 6d  e page is left m
a960: 61 72 6b 65 64 20 64 69 72 74 79 20 69 6e 20 74  arked dirty in t
a970: 68 69 73 20 63 61 73 65 2e 0a 20 20 2a 2a 0a 20  his case..  **. 
a980: 20 2a 2a 20 41 6e 20 65 78 63 65 70 74 69 6f 6e   ** An exception
a990: 20 74 6f 20 74 68 65 20 61 62 6f 76 65 20 72 75   to the above ru
a9a0: 6c 65 3a 20 49 66 20 74 68 65 20 64 61 74 61 62  le: If the datab
a9b0: 61 73 65 20 69 73 20 69 6e 20 6e 6f 2d 73 79 6e  ase is in no-syn
a9c0: 63 20 6d 6f 64 65 0a 20 20 2a 2a 20 61 6e 64 20  c mode.  ** and 
a9d0: 61 20 70 61 67 65 20 69 73 20 6d 6f 76 65 64 20  a page is moved 
a9e0: 64 75 72 69 6e 67 20 61 6e 20 69 6e 63 72 65 6d  during an increm
a9f0: 65 6e 74 61 6c 20 76 61 63 75 75 6d 20 74 68 65  ental vacuum the
aa00: 6e 20 74 68 65 20 70 61 67 65 20 6d 61 79 0a 20  n the page may. 
aa10: 20 2a 2a 20 6e 6f 74 20 62 65 20 69 6e 20 74 68   ** not be in th
aa20: 65 20 70 61 67 65 72 20 63 61 63 68 65 2e 20 4c  e pager cache. L
aa30: 61 74 65 72 3a 20 69 66 20 61 20 6d 61 6c 6c 6f  ater: if a mallo
aa40: 63 28 29 20 6f 72 20 49 4f 20 65 72 72 6f 72 20  c() or IO error 
aa50: 6f 63 63 75 72 73 0a 20 20 2a 2a 20 64 75 72 69  occurs.  ** duri
aa60: 6e 67 20 61 20 4d 6f 76 65 70 61 67 65 28 29 20  ng a Movepage() 
aa70: 63 61 6c 6c 2c 20 74 68 65 6e 20 74 68 65 20 70  call, then the p
aa80: 61 67 65 20 6d 61 79 20 6e 6f 74 20 62 65 20 69  age may not be i
aa90: 6e 20 74 68 65 20 63 61 63 68 65 0a 20 20 2a 2a  n the cache.  **
aaa0: 20 65 69 74 68 65 72 2e 20 53 6f 20 74 68 65 20   either. So the 
aab0: 63 6f 6e 64 69 74 69 6f 6e 20 64 65 73 63 72 69  condition descri
aac0: 62 65 64 20 69 6e 20 74 68 65 20 61 62 6f 76 65  bed in the above
aad0: 20 70 61 72 61 67 72 61 70 68 20 69 73 20 6e 6f   paragraph is no
aae0: 74 0a 20 20 2a 2a 20 61 73 73 65 72 74 28 29 61  t.  ** assert()a
aaf0: 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49  ble..  **.  ** I
ab00: 66 20 69 6e 20 45 58 43 4c 55 53 49 56 45 20 73  f in EXCLUSIVE s
ab10: 74 61 74 65 2c 20 74 68 65 6e 20 77 65 20 75 70  tate, then we up
ab20: 64 61 74 65 20 74 68 65 20 70 61 67 65 72 20 63  date the pager c
ab30: 61 63 68 65 20 69 66 20 69 74 20 65 78 69 73 74  ache if it exist
ab40: 73 0a 20 20 2a 2a 20 61 6e 64 20 74 68 65 20 6d  s.  ** and the m
ab50: 61 69 6e 20 66 69 6c 65 2e 20 54 68 65 20 70 61  ain file. The pa
ab60: 67 65 20 69 73 20 74 68 65 6e 20 6d 61 72 6b 65  ge is then marke
ab70: 64 20 6e 6f 74 20 64 69 72 74 79 2e 0a 20 20 2a  d not dirty..  *
ab80: 2a 0a 20 20 2a 2a 20 54 69 63 6b 65 74 20 23 31  *.  ** Ticket #1
ab90: 31 37 31 3a 20 20 54 68 65 20 73 74 61 74 65 6d  171:  The statem
aba0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 6d 69 67 68  ent journal migh
abb0: 74 20 63 6f 6e 74 61 69 6e 20 70 61 67 65 20 63  t contain page c
abc0: 6f 6e 74 65 6e 74 20 74 68 61 74 20 69 73 0a 20  ontent that is. 
abd0: 20 2a 2a 20 64 69 66 66 65 72 65 6e 74 20 66 72   ** different fr
abe0: 6f 6d 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74  om the page cont
abf0: 65 6e 74 20 61 74 20 74 68 65 20 73 74 61 72 74  ent at the start
ac00: 20 6f 66 20 74 68 65 20 74 72 61 6e 73 61 63 74   of the transact
ac10: 69 6f 6e 2e 0a 20 20 2a 2a 20 54 68 69 73 20 6f  ion..  ** This o
ac20: 63 63 75 72 73 20 77 68 65 6e 20 61 20 70 61 67  ccurs when a pag
ac30: 65 20 69 73 20 63 68 61 6e 67 65 64 20 70 72 69  e is changed pri
ac40: 6f 72 20 74 6f 20 74 68 65 20 73 74 61 72 74 20  or to the start 
ac50: 6f 66 20 61 20 73 74 61 74 65 6d 65 6e 74 0a 20  of a statement. 
ac60: 20 2a 2a 20 74 68 65 6e 20 63 68 61 6e 67 65 64   ** then changed
ac70: 20 61 67 61 69 6e 20 77 69 74 68 69 6e 20 74 68   again within th
ac80: 65 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 57 68  e statement.  Wh
ac90: 65 6e 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b 20  en rolling back 
aca0: 73 75 63 68 20 61 0a 20 20 2a 2a 20 73 74 61 74  such a.  ** stat
acb0: 65 6d 65 6e 74 20 77 65 20 6d 75 73 74 20 6e 6f  ement we must no
acc0: 74 20 77 72 69 74 65 20 74 6f 20 74 68 65 20 6f  t write to the o
acd0: 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61 73 65  riginal database
ace0: 20 75 6e 6c 65 73 73 20 77 65 20 6b 6e 6f 77 0a   unless we know.
acf0: 20 20 2a 2a 20 66 6f 72 20 63 65 72 74 61 69 6e    ** for certain
ad00: 20 74 68 61 74 20 6f 72 69 67 69 6e 61 6c 20 70   that original p
ad10: 61 67 65 20 63 6f 6e 74 65 6e 74 73 20 61 72 65  age contents are
ad20: 20 73 79 6e 63 65 64 20 69 6e 74 6f 20 74 68 65   synced into the
ad30: 20 6d 61 69 6e 20 72 6f 6c 6c 62 61 63 6b 0a 20   main rollback. 
ad40: 20 2a 2a 20 6a 6f 75 72 6e 61 6c 2e 20 20 4f 74   ** journal.  Ot
ad50: 68 65 72 77 69 73 65 2c 20 61 20 70 6f 77 65 72  herwise, a power
ad60: 20 6c 6f 73 73 20 6d 69 67 68 74 20 6c 65 61 76   loss might leav
ad70: 65 20 6d 6f 64 69 66 69 65 64 20 64 61 74 61 20  e modified data 
ad80: 69 6e 20 74 68 65 0a 20 20 2a 2a 20 64 61 74 61  in the.  ** data
ad90: 62 61 73 65 20 66 69 6c 65 20 77 69 74 68 6f 75  base file withou
ada0: 74 20 61 6e 20 65 6e 74 72 79 20 69 6e 20 74 68  t an entry in th
adb0: 65 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e  e rollback journ
adc0: 61 6c 20 74 68 61 74 20 63 61 6e 0a 20 20 2a 2a  al that can.  **
add0: 20 72 65 73 74 6f 72 65 20 74 68 65 20 64 61 74   restore the dat
ade0: 61 62 61 73 65 20 74 6f 20 69 74 73 20 6f 72 69  abase to its ori
adf0: 67 69 6e 61 6c 20 66 6f 72 6d 2e 20 20 54 77 6f  ginal form.  Two
ae00: 20 63 6f 6e 64 69 74 69 6f 6e 73 20 6d 75 73 74   conditions must
ae10: 20 62 65 0a 20 20 2a 2a 20 6d 65 74 20 62 65 66   be.  ** met bef
ae20: 6f 72 65 20 77 72 69 74 69 6e 67 20 74 6f 20 74  ore writing to t
ae30: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
ae40: 73 2e 20 28 31 29 20 74 68 65 20 64 61 74 61 62  s. (1) the datab
ae50: 61 73 65 20 6d 75 73 74 20 62 65 0a 20 20 2a 2a  ase must be.  **
ae60: 20 6c 6f 63 6b 65 64 2e 20 20 28 32 29 20 77 65   locked.  (2) we
ae70: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 20 6f   know that the o
ae80: 72 69 67 69 6e 61 6c 20 70 61 67 65 20 63 6f 6e  riginal page con
ae90: 74 65 6e 74 20 69 73 20 66 75 6c 6c 79 20 73 79  tent is fully sy
aea0: 6e 63 65 64 0a 20 20 2a 2a 20 69 6e 20 74 68 65  nced.  ** in the
aeb0: 20 6d 61 69 6e 20 6a 6f 75 72 6e 61 6c 20 65 69   main journal ei
aec0: 74 68 65 72 20 62 65 63 61 75 73 65 20 74 68 65  ther because the
aed0: 20 70 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20   page is not in 
aee0: 63 61 63 68 65 20 6f 72 20 65 6c 73 65 0a 20 20  cache or else.  
aef0: 2a 2a 20 74 68 65 20 70 61 67 65 20 69 73 20 6d  ** the page is m
af00: 61 72 6b 65 64 20 61 73 20 6e 65 65 64 53 79 6e  arked as needSyn
af10: 63 3d 3d 30 2e 0a 20 20 2a 2f 0a 20 20 70 50 67  c==0..  */.  pPg
af20: 20 3d 20 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28   = pager_lookup(
af30: 70 50 61 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20  pPager, pgno);. 
af40: 20 50 41 47 45 52 54 52 41 43 45 34 28 22 50 4c   PAGERTRACE4("PL
af50: 41 59 42 41 43 4b 20 25 64 20 70 61 67 65 20 25  AYBACK %d page %
af60: 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
af70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
af80: 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
af90: 20 70 67 6e 6f 2c 20 70 61 67 65 72 5f 64 61 74   pgno, pager_dat
afa0: 61 68 61 73 68 28 70 50 61 67 65 72 2d 3e 70 61  ahash(pPager->pa
afb0: 67 65 53 69 7a 65 2c 20 61 44 61 74 61 29 29 3b  geSize, aData));
afc0: 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73  .  if( pPager->s
afd0: 74 61 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c  tate>=PAGER_EXCL
afe0: 55 53 49 56 45 20 26 26 20 28 70 50 67 3d 3d 30  USIVE && (pPg==0
aff0: 20 7c 7c 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e   || pPg->needSyn
b000: 63 3d 3d 30 29 20 29 7b 0a 20 20 20 20 72 63 20  c==0) ){.    rc 
b010: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
b020: 70 50 61 67 65 72 2d 3e 66 64 2c 20 28 70 67 6e  pPager->fd, (pgn
b030: 6f 2d 31 29 2a 28 69 36 34 29 70 50 61 67 65 72  o-1)*(i64)pPager
b040: 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20  ->pageSize);.   
b050: 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
b060: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
b070: 20 73 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28   sqlite3OsWrite(
b080: 70 50 61 67 65 72 2d 3e 66 64 2c 20 61 44 61 74  pPager->fd, aDat
b090: 61 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  a, pPager->pageS
b0a0: 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ize);.    }.    
b0b0: 69 66 28 20 70 50 67 20 29 7b 0a 20 20 20 20 20  if( pPg ){.     
b0c0: 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b   makeClean(pPg);
b0d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
b0e0: 20 70 50 67 20 29 7b 0a 20 20 20 20 2f 2a 20 4e   pPg ){.    /* N
b0f0: 6f 20 70 61 67 65 20 73 68 6f 75 6c 64 20 65 76  o page should ev
b100: 65 72 20 62 65 20 65 78 70 6c 69 63 69 74 6c 79  er be explicitly
b110: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 74 68 61   rolled back tha
b120: 74 20 69 73 20 69 6e 20 75 73 65 2c 20 65 78 63  t is in use, exc
b130: 65 70 74 0a 20 20 20 20 2a 2a 20 66 6f 72 20 70  ept.    ** for p
b140: 61 67 65 20 31 20 77 68 69 63 68 20 69 73 20 68  age 1 which is h
b150: 65 6c 64 20 69 6e 20 75 73 65 20 69 6e 20 6f 72  eld in use in or
b160: 64 65 72 20 74 6f 20 6b 65 65 70 20 74 68 65 20  der to keep the 
b170: 6c 6f 63 6b 20 6f 6e 20 74 68 65 0a 20 20 20 20  lock on the.    
b180: 2a 2a 20 64 61 74 61 62 61 73 65 20 61 63 74 69  ** database acti
b190: 76 65 2e 20 48 6f 77 65 76 65 72 20 73 75 63 68  ve. However such
b1a0: 20 61 20 70 61 67 65 20 6d 61 79 20 62 65 20 72   a page may be r
b1b0: 6f 6c 6c 65 64 20 62 61 63 6b 20 61 73 20 61 20  olled back as a 
b1c0: 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 6f 66  result.    ** of
b1d0: 20 61 6e 20 69 6e 74 65 72 6e 61 6c 20 65 72 72   an internal err
b1e0: 6f 72 20 72 65 73 75 6c 74 69 6e 67 20 69 6e 20  or resulting in 
b1f0: 61 6e 20 61 75 74 6f 6d 61 74 69 63 20 63 61 6c  an automatic cal
b200: 6c 20 74 6f 0a 20 20 20 20 2a 2a 20 73 71 6c 69  l to.    ** sqli
b210: 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b  te3PagerRollback
b220: 28 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 76  ()..    */.    v
b230: 6f 69 64 20 2a 70 44 61 74 61 3b 0a 20 20 20 20  oid *pData;.    
b240: 2f 2a 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  /* assert( pPg->
b250: 6e 52 65 66 3d 3d 30 20 7c 7c 20 70 50 67 2d 3e  nRef==0 || pPg->
b260: 70 67 6e 6f 3d 3d 31 20 29 3b 20 2a 2f 0a 20 20  pgno==1 ); */.  
b270: 20 20 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f    pData = PGHDR_
b280: 54 4f 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20  TO_DATA(pPg);.  
b290: 20 20 6d 65 6d 63 70 79 28 70 44 61 74 61 2c 20    memcpy(pData, 
b2a0: 61 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e 70  aData, pPager->p
b2b0: 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66  ageSize);.    if
b2c0: 28 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69  ( pPager->xReini
b2d0: 74 65 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  ter ){.      pPa
b2e0: 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70  ger->xReiniter(p
b2f0: 50 67 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  Pg, pPager->page
b300: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 23 69 66  Size);.    }.#if
b310: 64 65 66 20 53 51 4c 49 54 45 5f 43 48 45 43 4b  def SQLITE_CHECK
b320: 5f 50 41 47 45 53 0a 20 20 20 20 70 50 67 2d 3e  _PAGES.    pPg->
b330: 70 61 67 65 48 61 73 68 20 3d 20 70 61 67 65 72  pageHash = pager
b340: 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 3b 0a  _pagehash(pPg);.
b350: 23 65 6e 64 69 66 0a 20 20 20 20 2f 2a 20 49 66  #endif.    /* If
b360: 20 74 68 69 73 20 77 61 73 20 70 61 67 65 20 31   this was page 1
b370: 2c 20 74 68 65 6e 20 72 65 73 74 6f 72 65 20 74  , then restore t
b380: 68 65 20 76 61 6c 75 65 20 6f 66 20 50 61 67 65  he value of Page
b390: 72 2e 64 62 46 69 6c 65 56 65 72 73 2e 0a 20 20  r.dbFileVers..  
b3a0: 20 20 2a 2a 20 44 6f 20 74 68 69 73 20 62 65 66    ** Do this bef
b3b0: 6f 72 65 20 61 6e 79 20 64 65 63 6f 64 69 6e 67  ore any decoding
b3c0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 67 6e  . */.    if( pgn
b3d0: 6f 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  o==1 ){.      me
b3e0: 6d 63 70 79 28 26 70 50 61 67 65 72 2d 3e 64 62  mcpy(&pPager->db
b3f0: 46 69 6c 65 56 65 72 73 2c 20 26 28 28 75 38 2a  FileVers, &((u8*
b400: 29 70 44 61 74 61 29 5b 32 34 5d 2c 73 69 7a 65  )pData)[24],size
b410: 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46 69 6c  of(pPager->dbFil
b420: 65 56 65 72 73 29 29 3b 0a 20 20 20 20 7d 0a 0a  eVers));.    }..
b430: 20 20 20 20 2f 2a 20 44 65 63 6f 64 65 20 74 68      /* Decode th
b440: 65 20 70 61 67 65 20 6a 75 73 74 20 72 65 61 64  e page just read
b450: 20 66 72 6f 6d 20 64 69 73 6b 20 2a 2f 0a 20 20   from disk */.  
b460: 20 20 43 4f 44 45 43 31 28 70 50 61 67 65 72 2c    CODEC1(pPager,
b470: 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67 6e   pData, pPg->pgn
b480: 6f 2c 20 33 29 3b 0a 20 20 7d 0a 20 20 72 65 74  o, 3);.  }.  ret
b490: 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
b4a0: 20 50 61 72 61 6d 65 74 65 72 20 7a 4d 61 73 74   Parameter zMast
b4b0: 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  er is the name o
b4c0: 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  f a master journ
b4d0: 61 6c 20 66 69 6c 65 2e 20 41 20 73 69 6e 67 6c  al file. A singl
b4e0: 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 66 69 6c  e journal.** fil
b4f0: 65 20 74 68 61 74 20 72 65 66 65 72 72 65 64 20  e that referred 
b500: 74 6f 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f  to the master jo
b510: 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 73 20 6a  urnal file has j
b520: 75 73 74 20 62 65 65 6e 20 72 6f 6c 6c 65 64 20  ust been rolled 
b530: 62 61 63 6b 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  back..** This ro
b540: 75 74 69 6e 65 20 63 68 65 63 6b 73 20 69 66 20  utine checks if 
b550: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 74  it is possible t
b560: 6f 20 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73  o delete the mas
b570: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b580: 2c 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 73 6f  ,.** and does so
b590: 20 69 66 20 69 74 20 69 73 2e 0a 2a 2a 0a 2a 2a   if it is..**.**
b5a0: 20 54 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   The master jour
b5b0: 6e 61 6c 20 66 69 6c 65 20 63 6f 6e 74 61 69 6e  nal file contain
b5c0: 73 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61  s the names of a
b5d0: 6c 6c 20 63 68 69 6c 64 20 6a 6f 75 72 6e 61 6c  ll child journal
b5e0: 73 2e 0a 2a 2a 20 54 6f 20 74 65 6c 6c 20 69 66  s..** To tell if
b5f0: 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
b600: 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65 64  l can be deleted
b610: 2c 20 63 68 65 63 6b 20 74 6f 20 65 61 63 68 20  , check to each 
b620: 6f 66 20 74 68 65 0a 2a 2a 20 63 68 69 6c 64 72  of the.** childr
b630: 65 6e 2e 20 20 49 66 20 61 6c 6c 20 63 68 69 6c  en.  If all chil
b640: 64 72 65 6e 20 61 72 65 20 65 69 74 68 65 72 20  dren are either 
b650: 6d 69 73 73 69 6e 67 20 6f 72 20 64 6f 20 6e 6f  missing or do no
b660: 74 20 72 65 66 65 72 20 74 6f 0a 2a 2a 20 61 20  t refer to.** a 
b670: 64 69 66 66 65 72 65 6e 74 20 6d 61 73 74 65 72  different master
b680: 20 6a 6f 75 72 6e 61 6c 2c 20 74 68 65 6e 20 74   journal, then t
b690: 68 69 73 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  his master journ
b6a0: 61 6c 20 63 61 6e 20 62 65 20 64 65 6c 65 74 65  al can be delete
b6b0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
b6c0: 20 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72   pager_delmaster
b6d0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61  (const char *zMa
b6e0: 73 74 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ster){.  int rc;
b6f0: 0a 20 20 69 6e 74 20 6d 61 73 74 65 72 5f 6f 70  .  int master_op
b700: 65 6e 20 3d 20 30 3b 0a 20 20 4f 73 46 69 6c 65  en = 0;.  OsFile
b710: 20 2a 6d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20   *master = 0;.  
b720: 63 68 61 72 20 2a 7a 4d 61 73 74 65 72 4a 6f 75  char *zMasterJou
b730: 72 6e 61 6c 20 3d 20 30 3b 20 2f 2a 20 43 6f 6e  rnal = 0; /* Con
b740: 74 65 6e 74 73 20 6f 66 20 6d 61 73 74 65 72 20  tents of master 
b750: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a  journal file */.
b760: 20 20 69 36 34 20 6e 4d 61 73 74 65 72 4a 6f 75    i64 nMasterJou
b770: 72 6e 61 6c 3b 20 20 20 20 20 20 20 2f 2a 20 53  rnal;       /* S
b780: 69 7a 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ize of master jo
b790: 75 72 6e 61 6c 20 66 69 6c 65 20 2a 2f 0a 0a 20  urnal file */.. 
b7a0: 20 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6d 61 73   /* Open the mas
b7b0: 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  ter journal file
b7c0: 20 65 78 63 6c 75 73 69 76 65 6c 79 20 69 6e 20   exclusively in 
b7d0: 63 61 73 65 20 73 6f 6d 65 20 6f 74 68 65 72 20  case some other 
b7e0: 70 72 6f 63 65 73 73 0a 20 20 2a 2a 20 69 73 20  process.  ** is 
b7f0: 72 75 6e 6e 69 6e 67 20 74 68 69 73 20 72 6f 75  running this rou
b800: 74 69 6e 65 20 61 6c 73 6f 2e 20 4e 6f 74 20 74  tine also. Not t
b810: 68 61 74 20 69 74 20 6d 61 6b 65 73 20 74 6f 6f  hat it makes too
b820: 20 6d 75 63 68 20 64 69 66 66 65 72 65 6e 63 65   much difference
b830: 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
b840: 6c 69 74 65 33 4f 73 4f 70 65 6e 52 65 61 64 4f  lite3OsOpenReadO
b850: 6e 6c 79 28 7a 4d 61 73 74 65 72 2c 20 26 6d 61  nly(zMaster, &ma
b860: 73 74 65 72 29 3b 0a 20 20 61 73 73 65 72 74 28  ster);.  assert(
b870: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
b880: 7c 20 6d 61 73 74 65 72 20 29 3b 0a 20 20 69 66  | master );.  if
b890: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b8a0: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
b8b0: 5f 6f 75 74 3b 0a 20 20 6d 61 73 74 65 72 5f 6f  _out;.  master_o
b8c0: 70 65 6e 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20  pen = 1;.  rc = 
b8d0: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 53 69 7a  sqlite3OsFileSiz
b8e0: 65 28 6d 61 73 74 65 72 2c 20 26 6e 4d 61 73 74  e(master, &nMast
b8f0: 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20 20 69 66  erJournal);.  if
b900: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
b910: 29 20 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72  ) goto delmaster
b920: 5f 6f 75 74 3b 0a 0a 20 20 69 66 28 20 6e 4d 61  _out;..  if( nMa
b930: 73 74 65 72 4a 6f 75 72 6e 61 6c 3e 30 20 29 7b  sterJournal>0 ){
b940: 0a 20 20 20 20 63 68 61 72 20 2a 7a 4a 6f 75 72  .    char *zJour
b950: 6e 61 6c 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  nal;.    char *z
b960: 4d 61 73 74 65 72 50 74 72 20 3d 20 30 3b 0a 0a  MasterPtr = 0;..
b970: 20 20 20 20 2f 2a 20 4c 6f 61 64 20 74 68 65 20      /* Load the 
b980: 65 6e 74 69 72 65 20 6d 61 73 74 65 72 20 6a 6f  entire master jo
b990: 75 72 6e 61 6c 20 66 69 6c 65 20 69 6e 74 6f 20  urnal file into 
b9a0: 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20 66  space obtained f
b9b0: 72 6f 6d 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  rom.    ** sqlit
b9c0: 65 4d 61 6c 6c 6f 63 28 29 20 61 6e 64 20 70 6f  eMalloc() and po
b9d0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 4d 61 73  inted to by zMas
b9e0: 74 65 72 4a 6f 75 72 6e 61 6c 2e 20 0a 20 20 20  terJournal. .   
b9f0: 20 2a 2f 0a 20 20 20 20 7a 4d 61 73 74 65 72 4a   */.    zMasterJ
ba00: 6f 75 72 6e 61 6c 20 3d 20 28 63 68 61 72 20 2a  ournal = (char *
ba10: 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 6e 4d  )sqliteMalloc(nM
ba20: 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b 0a 20  asterJournal);. 
ba30: 20 20 20 69 66 28 20 21 7a 4d 61 73 74 65 72 4a     if( !zMasterJ
ba40: 6f 75 72 6e 61 6c 20 29 7b 0a 20 20 20 20 20 20  ournal ){.      
ba50: 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
ba60: 4d 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 64 65  M;.      goto de
ba70: 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 20 20 20  lmaster_out;.   
ba80: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
ba90: 74 65 33 4f 73 52 65 61 64 28 6d 61 73 74 65 72  te3OsRead(master
baa0: 2c 20 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , zMasterJournal
bab0: 2c 20 6e 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c  , nMasterJournal
bac0: 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
bad0: 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
bae0: 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b 0a 0a  delmaster_out;..
baf0: 20 20 20 20 7a 4a 6f 75 72 6e 61 6c 20 3d 20 7a      zJournal = z
bb00: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 3b 0a 20  MasterJournal;. 
bb10: 20 20 20 77 68 69 6c 65 28 20 28 7a 4a 6f 75 72     while( (zJour
bb20: 6e 61 6c 2d 7a 4d 61 73 74 65 72 4a 6f 75 72 6e  nal-zMasterJourn
bb30: 61 6c 29 3c 6e 4d 61 73 74 65 72 4a 6f 75 72 6e  al)<nMasterJourn
bb40: 61 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  al ){.      if( 
bb50: 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78 69  sqlite3OsFileExi
bb60: 73 74 73 28 7a 4a 6f 75 72 6e 61 6c 29 20 29 7b  sts(zJournal) ){
bb70: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  .        /* One 
bb80: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 73 20  of the journals 
bb90: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 74 68  pointed to by th
bba0: 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c  e master journal
bbb0: 20 65 78 69 73 74 73 2e 0a 20 20 20 20 20 20 20   exists..       
bbc0: 20 2a 2a 20 4f 70 65 6e 20 69 74 20 61 6e 64 20   ** Open it and 
bbd0: 63 68 65 63 6b 20 69 66 20 69 74 20 70 6f 69 6e  check if it poin
bbe0: 74 73 20 61 74 20 74 68 65 20 6d 61 73 74 65 72  ts at the master
bbf0: 20 6a 6f 75 72 6e 61 6c 2e 20 49 66 0a 20 20 20   journal. If.   
bc00: 20 20 20 20 20 2a 2a 20 73 6f 2c 20 72 65 74 75       ** so, retu
bc10: 72 6e 20 77 69 74 68 6f 75 74 20 64 65 6c 65 74  rn without delet
bc20: 69 6e 67 20 74 68 65 20 6d 61 73 74 65 72 20 6a  ing the master j
bc30: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a 20 20 20  ournal file..   
bc40: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
bc50: 4f 73 46 69 6c 65 20 2a 6a 6f 75 72 6e 61 6c 20  OsFile *journal 
bc60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  = 0;.        int
bc70: 20 63 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20   c;..        rc 
bc80: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
bc90: 65 61 64 4f 6e 6c 79 28 7a 4a 6f 75 72 6e 61 6c  eadOnly(zJournal
bca0: 2c 20 26 6a 6f 75 72 6e 61 6c 29 3b 0a 20 20 20  , &journal);.   
bcb0: 20 20 20 20 20 61 73 73 65 72 74 28 20 72 63 21       assert( rc!
bcc0: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 6a 6f  =SQLITE_OK || jo
bcd0: 75 72 6e 61 6c 20 29 3b 0a 20 20 20 20 20 20 20  urnal );.       
bce0: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
bcf0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
bd00: 67 6f 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f  goto delmaster_o
bd10: 75 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ut;.        }.. 
bd20: 20 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64         rc = read
bd30: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 6a 6f  MasterJournal(jo
bd40: 75 72 6e 61 6c 2c 20 26 7a 4d 61 73 74 65 72 50  urnal, &zMasterP
bd50: 74 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  tr);.        sql
bd60: 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 6a 6f 75  ite3OsClose(&jou
bd70: 72 6e 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 69  rnal);.        i
bd80: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
bd90: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   ){.          go
bda0: 74 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74  to delmaster_out
bdb0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
bdc0: 20 20 20 20 20 63 20 3d 20 7a 4d 61 73 74 65 72       c = zMaster
bdd0: 50 74 72 21 3d 30 20 26 26 20 73 74 72 63 6d 70  Ptr!=0 && strcmp
bde0: 28 7a 4d 61 73 74 65 72 50 74 72 2c 20 7a 4d 61  (zMasterPtr, zMa
bdf0: 73 74 65 72 29 3d 3d 30 3b 0a 20 20 20 20 20 20  ster)==0;.      
be00: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4d 61    sqliteFree(zMa
be10: 73 74 65 72 50 74 72 29 3b 0a 20 20 20 20 20 20  sterPtr);.      
be20: 20 20 69 66 28 20 63 20 29 7b 0a 20 20 20 20 20    if( c ){.     
be30: 20 20 20 20 20 2f 2a 20 57 65 20 68 61 76 65 20       /* We have 
be40: 61 20 6d 61 74 63 68 2e 20 44 6f 20 6e 6f 74 20  a match. Do not 
be50: 64 65 6c 65 74 65 20 74 68 65 20 6d 61 73 74 65  delete the maste
be60: 72 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  r journal file. 
be70: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  */.          got
be80: 6f 20 64 65 6c 6d 61 73 74 65 72 5f 6f 75 74 3b  o delmaster_out;
be90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bea0: 20 7d 0a 20 20 20 20 20 20 7a 4a 6f 75 72 6e 61   }.      zJourna
beb0: 6c 20 2b 3d 20 28 73 74 72 6c 65 6e 28 7a 4a 6f  l += (strlen(zJo
bec0: 75 72 6e 61 6c 29 2b 31 29 3b 0a 20 20 20 20 7d  urnal)+1);.    }
bed0: 0a 20 20 7d 0a 20 20 0a 20 20 72 63 20 3d 20 73  .  }.  .  rc = s
bee0: 71 6c 69 74 65 33 4f 73 44 65 6c 65 74 65 28 7a  qlite3OsDelete(z
bef0: 4d 61 73 74 65 72 29 3b 0a 0a 64 65 6c 6d 61 73  Master);..delmas
bf00: 74 65 72 5f 6f 75 74 3a 0a 20 20 69 66 28 20 7a  ter_out:.  if( z
bf10: 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 29 7b  MasterJournal ){
bf20: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
bf30: 7a 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 29 3b  zMasterJournal);
bf40: 0a 20 20 7d 20 20 0a 20 20 69 66 28 20 6d 61 73  .  }  .  if( mas
bf50: 74 65 72 5f 6f 70 65 6e 20 29 7b 0a 20 20 20 20  ter_open ){.    
bf60: 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
bf70: 6d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 20 20 72  master);.  }.  r
bf80: 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 73 74  eturn rc;.}...st
bf90: 61 74 69 63 20 76 6f 69 64 20 70 61 67 65 72 5f  atic void pager_
bfa0: 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28 50  truncate_cache(P
bfb0: 61 67 65 72 20 2a 70 50 61 67 65 72 29 3b 0a 0a  ager *pPager);..
bfc0: 2f 2a 0a 2a 2a 20 54 72 75 6e 63 61 74 65 20 74  /*.** Truncate t
bfd0: 68 65 20 6d 61 69 6e 20 66 69 6c 65 20 6f 66 20  he main file of 
bfe0: 74 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 20  the given pager 
bff0: 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  to the number of
c000: 20 70 61 67 65 73 0a 2a 2a 20 69 6e 64 69 63 61   pages.** indica
c010: 74 65 64 2e 20 41 6c 73 6f 20 74 72 75 6e 63 61  ted. Also trunca
c020: 74 65 20 74 68 65 20 63 61 63 68 65 64 20 72 65  te the cached re
c030: 70 72 65 73 65 6e 74 61 74 69 6f 6e 20 6f 66 20  presentation of 
c040: 74 68 65 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  the file..*/.sta
c050: 74 69 63 20 69 6e 74 20 70 61 67 65 72 5f 74 72  tic int pager_tr
c060: 75 6e 63 61 74 65 28 50 61 67 65 72 20 2a 70 50  uncate(Pager *pP
c070: 61 67 65 72 2c 20 69 6e 74 20 6e 50 61 67 65 29  ager, int nPage)
c080: 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
c090: 49 54 45 5f 4f 4b 3b 0a 20 20 69 66 28 20 70 50  ITE_OK;.  if( pP
c0a0: 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47  ager->state>=PAG
c0b0: 45 52 5f 45 58 43 4c 55 53 49 56 45 20 29 7b 0a  ER_EXCLUSIVE ){.
c0c0: 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
c0d0: 4f 73 54 72 75 6e 63 61 74 65 28 70 50 61 67 65  OsTruncate(pPage
c0e0: 72 2d 3e 66 64 2c 20 70 50 61 67 65 72 2d 3e 70  r->fd, pPager->p
c0f0: 61 67 65 53 69 7a 65 2a 28 69 36 34 29 6e 50 61  ageSize*(i64)nPa
c100: 67 65 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72  ge);.  }.  if( r
c110: 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
c120: 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
c130: 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20 20 20 20  ze = nPage;.    
c140: 70 61 67 65 72 5f 74 72 75 6e 63 61 74 65 5f 63  pager_truncate_c
c150: 61 63 68 65 28 70 50 61 67 65 72 29 3b 0a 20 20  ache(pPager);.  
c160: 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  }.  return rc;.}
c170: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
c180: 73 65 63 74 6f 72 53 69 7a 65 20 66 6f 72 20 74  sectorSize for t
c190: 68 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a  he given pager..
c1a0: 2a 2a 0a 2a 2a 20 54 68 65 20 73 65 63 74 6f 72  **.** The sector
c1b0: 20 73 69 7a 65 20 69 73 20 74 68 65 20 6c 61 72   size is the lar
c1c0: 67 65 72 20 6f 66 20 74 68 65 20 73 65 63 74 6f  ger of the secto
c1d0: 72 20 73 69 7a 65 20 72 65 70 6f 72 74 65 64 0a  r size reported.
c1e0: 2a 2a 20 62 79 20 73 71 6c 69 74 65 33 4f 73 53  ** by sqlite3OsS
c1f0: 65 63 74 6f 72 53 69 7a 65 28 29 20 61 6e 64 20  ectorSize() and 
c200: 74 68 65 20 70 61 67 65 53 69 7a 65 2e 0a 2a 2f  the pageSize..*/
c210: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74  .static void set
c220: 53 65 63 74 6f 72 53 69 7a 65 28 50 61 67 65 72  SectorSize(Pager
c230: 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 70 50 61   *pPager){.  pPa
c240: 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a 65 20  ger->sectorSize 
c250: 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 63 74 6f  = sqlite3OsSecto
c260: 72 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 66 64  rSize(pPager->fd
c270: 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  );.  if( pPager-
c280: 3e 73 65 63 74 6f 72 53 69 7a 65 3c 70 50 61 67  >sectorSize<pPag
c290: 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 7b 0a  er->pageSize ){.
c2a0: 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65 63 74      pPager->sect
c2b0: 6f 72 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d  orSize = pPager-
c2c0: 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 7d 0a 7d  >pageSize;.  }.}
c2d0: 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62 61 63 6b  ../*.** Playback
c2e0: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64   the journal and
c2f0: 20 74 68 75 73 20 72 65 73 74 6f 72 65 20 74 68   thus restore th
c300: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
c310: 74 6f 0a 2a 2a 20 74 68 65 20 73 74 61 74 65 20  to.** the state 
c320: 69 74 20 77 61 73 20 69 6e 20 62 65 66 6f 72 65  it was in before
c330: 20 77 65 20 73 74 61 72 74 65 64 20 6d 61 6b 69   we started maki
c340: 6e 67 20 63 68 61 6e 67 65 73 2e 20 20 0a 2a 2a  ng changes.  .**
c350: 0a 2a 2a 20 54 68 65 20 6a 6f 75 72 6e 61 6c 20  .** The journal 
c360: 66 69 6c 65 20 66 6f 72 6d 61 74 20 69 73 20 61  file format is a
c370: 73 20 66 6f 6c 6c 6f 77 73 3a 20 0a 2a 2a 0a 2a  s follows: .**.*
c380: 2a 20 20 28 31 29 20 20 38 20 62 79 74 65 20 70  *  (1)  8 byte p
c390: 72 65 66 69 78 2e 20 20 41 20 63 6f 70 79 20 6f  refix.  A copy o
c3a0: 66 20 61 4a 6f 75 72 6e 61 6c 4d 61 67 69 63 5b  f aJournalMagic[
c3b0: 5d 2e 0a 2a 2a 20 20 28 32 29 20 20 34 20 62 79  ]..**  (2)  4 by
c3c0: 74 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e  te big-endian in
c3d0: 74 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74  teger which is t
c3e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 76 61 6c  he number of val
c3f0: 69 64 20 70 61 67 65 20 72 65 63 6f 72 64 73 0a  id page records.
c400: 2a 2a 20 20 20 20 20 20 20 69 6e 20 74 68 65 20  **       in the 
c410: 6a 6f 75 72 6e 61 6c 2e 20 20 49 66 20 74 68 69  journal.  If thi
c420: 73 20 76 61 6c 75 65 20 69 73 20 30 78 66 66 66  s value is 0xfff
c430: 66 66 66 66 66 2c 20 74 68 65 6e 20 63 6f 6d 70  fffff, then comp
c440: 75 74 65 20 74 68 65 0a 2a 2a 20 20 20 20 20 20  ute the.**      
c450: 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 20   number of page 
c460: 72 65 63 6f 72 64 73 20 66 72 6f 6d 20 74 68 65  records from the
c470: 20 6a 6f 75 72 6e 61 6c 20 73 69 7a 65 2e 0a 2a   journal size..*
c480: 2a 20 20 28 33 29 20 20 34 20 62 79 74 65 20 62  *  (3)  4 byte b
c490: 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67 65  ig-endian intege
c4a0: 72 20 77 68 69 63 68 20 69 73 20 74 68 65 20 69  r which is the i
c4b0: 6e 69 74 69 61 6c 20 76 61 6c 75 65 20 66 6f 72  nitial value for
c4c0: 20 74 68 65 20 0a 2a 2a 20 20 20 20 20 20 20 73   the .**       s
c4d0: 61 6e 69 74 79 20 63 68 65 63 6b 73 75 6d 2e 0a  anity checksum..
c4e0: 2a 2a 20 20 28 34 29 20 20 34 20 62 79 74 65 20  **  (4)  4 byte 
c4f0: 69 6e 74 65 67 65 72 20 77 68 69 63 68 20 69 73  integer which is
c500: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 70   the number of p
c510: 61 67 65 73 20 74 6f 20 74 72 75 6e 63 61 74 65  ages to truncate
c520: 20 74 68 65 0a 2a 2a 20 20 20 20 20 20 20 64 61   the.**       da
c530: 74 61 62 61 73 65 20 74 6f 20 64 75 72 69 6e 67  tabase to during
c540: 20 61 20 72 6f 6c 6c 62 61 63 6b 2e 0a 2a 2a 20   a rollback..** 
c550: 20 28 35 29 20 20 34 20 62 79 74 65 20 69 6e 74   (5)  4 byte int
c560: 65 67 65 72 20 77 68 69 63 68 20 69 73 20 74 68  eger which is th
c570: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  e number of byte
c580: 73 20 69 6e 20 74 68 65 20 6d 61 73 74 65 72 20  s in the master 
c590: 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 20 20 20 20 20  journal.**      
c5a0: 20 6e 61 6d 65 2e 20 20 54 68 65 20 76 61 6c 75   name.  The valu
c5b0: 65 20 6d 61 79 20 62 65 20 7a 65 72 6f 20 28 69  e may be zero (i
c5c0: 6e 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65  ndicate that the
c5d0: 72 65 20 69 73 20 6e 6f 20 6d 61 73 74 65 72 0a  re is no master.
c5e0: 2a 2a 20 20 20 20 20 20 20 6a 6f 75 72 6e 61 6c  **       journal
c5f0: 2e 29 0a 2a 2a 20 20 28 36 29 20 20 4e 20 62 79  .).**  (6)  N by
c600: 74 65 73 20 6f 66 20 74 68 65 20 6d 61 73 74 65  tes of the maste
c610: 72 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 2e 20  r journal name. 
c620: 20 54 68 65 20 6e 61 6d 65 20 77 69 6c 6c 20 62   The name will b
c630: 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  e nul-terminated
c640: 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 6d 69  .**       and mi
c650: 67 68 74 20 62 65 20 73 68 6f 72 74 65 72 20 74  ght be shorter t
c660: 68 61 6e 20 74 68 65 20 76 61 6c 75 65 20 72 65  han the value re
c670: 61 64 20 66 72 6f 6d 20 28 35 29 2e 20 20 49 66  ad from (5).  If
c680: 20 74 68 65 20 66 69 72 73 74 20 62 79 74 65 0a   the first byte.
c690: 2a 2a 20 20 20 20 20 20 20 6f 66 20 74 68 65 20  **       of the 
c6a0: 6e 61 6d 65 20 69 73 20 5c 30 30 30 20 74 68 65  name is \000 the
c6b0: 6e 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  n there is no ma
c6c0: 73 74 65 72 20 6a 6f 75 72 6e 61 6c 2e 20 20 54  ster journal.  T
c6d0: 68 65 20 6d 61 73 74 65 72 0a 2a 2a 20 20 20 20  he master.**    
c6e0: 20 20 20 6a 6f 75 72 6e 61 6c 20 6e 61 6d 65 20     journal name 
c6f0: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 55 54 46  is stored in UTF
c700: 2d 38 2e 0a 2a 2a 20 20 28 37 29 20 20 5a 65 72  -8..**  (7)  Zer
c710: 6f 20 6f 72 20 6d 6f 72 65 20 70 61 67 65 73 20  o or more pages 
c720: 69 6e 73 74 61 6e 63 65 73 2c 20 65 61 63 68 20  instances, each 
c730: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 20 20  as follows:.**  
c740: 20 20 20 20 20 20 2b 20 20 34 20 62 79 74 65 20        +  4 byte 
c750: 70 61 67 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 20  page number..** 
c760: 20 20 20 20 20 20 20 2b 20 20 70 50 61 67 65 72         +  pPager
c770: 2d 3e 70 61 67 65 53 69 7a 65 20 62 79 74 65 73  ->pageSize bytes
c780: 20 6f 66 20 64 61 74 61 2e 0a 2a 2a 20 20 20 20   of data..**    
c790: 20 20 20 20 2b 20 20 34 20 62 79 74 65 20 63 68      +  4 byte ch
c7a0: 65 63 6b 73 75 6d 0a 2a 2a 0a 2a 2a 20 57 68 65  ecksum.**.** Whe
c7b0: 6e 20 77 65 20 73 70 65 61 6b 20 6f 66 20 74 68  n we speak of th
c7c0: 65 20 6a 6f 75 72 6e 61 6c 20 68 65 61 64 65 72  e journal header
c7d0: 2c 20 77 65 20 6d 65 61 6e 20 74 68 65 20 66 69  , we mean the fi
c7e0: 72 73 74 20 36 20 69 74 65 6d 73 20 61 62 6f 76  rst 6 items abov
c7f0: 65 2e 0a 2a 2a 20 45 61 63 68 20 65 6e 74 72 79  e..** Each entry
c800: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   in the journal 
c810: 69 73 20 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f  is an instance o
c820: 66 20 74 68 65 20 37 74 68 20 69 74 65 6d 2e 0a  f the 7th item..
c830: 2a 2a 0a 2a 2a 20 43 61 6c 6c 20 74 68 65 20 76  **.** Call the v
c840: 61 6c 75 65 20 66 72 6f 6d 20 74 68 65 20 73 65  alue from the se
c850: 63 6f 6e 64 20 62 75 6c 6c 65 74 20 22 6e 52 65  cond bullet "nRe
c860: 63 22 2e 20 20 6e 52 65 63 20 69 73 20 74 68 65  c".  nRec is the
c870: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 76 61   number of.** va
c880: 6c 69 64 20 70 61 67 65 20 65 6e 74 72 69 65 73  lid page entries
c890: 20 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e   in the journal.
c8a0: 20 20 49 6e 20 6d 6f 73 74 20 63 61 73 65 73 2c    In most cases,
c8b0: 20 79 6f 75 20 63 61 6e 20 63 6f 6d 70 75 74 65   you can compute
c8c0: 20 74 68 65 0a 2a 2a 20 76 61 6c 75 65 20 6f 66   the.** value of
c8d0: 20 6e 52 65 63 20 66 72 6f 6d 20 74 68 65 20 73   nRec from the s
c8e0: 69 7a 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ize of the journ
c8f0: 61 6c 20 66 69 6c 65 2e 20 20 42 75 74 20 69 66  al file.  But if
c900: 20 61 20 70 6f 77 65 72 0a 2a 2a 20 66 61 69 6c   a power.** fail
c910: 75 72 65 20 6f 63 63 75 72 72 65 64 20 77 68 69  ure occurred whi
c920: 6c 65 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77  le the journal w
c930: 61 73 20 62 65 69 6e 67 20 77 72 69 74 74 65 6e  as being written
c940: 2c 20 69 74 20 63 6f 75 6c 64 20 62 65 20 74 68  , it could be th
c950: 65 0a 2a 2a 20 63 61 73 65 20 74 68 61 74 20 74  e.** case that t
c960: 68 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 6a  he size of the j
c970: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 68 61 64 20  ournal file had 
c980: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 69 6e 63  already been inc
c990: 72 65 61 73 65 64 20 62 75 74 0a 2a 2a 20 74 68  reased but.** th
c9a0: 65 20 65 78 74 72 61 20 65 6e 74 72 69 65 73 20  e extra entries 
c9b0: 68 61 64 20 6e 6f 74 20 79 65 74 20 6d 61 64 65  had not yet made
c9c0: 20 69 74 20 73 61 66 65 6c 79 20 74 6f 20 64 69   it safely to di
c9d0: 73 6b 2e 20 20 49 6e 20 73 75 63 68 20 61 20 63  sk.  In such a c
c9e0: 61 73 65 2c 0a 2a 2a 20 74 68 65 20 76 61 6c 75  ase,.** the valu
c9f0: 65 20 6f 66 20 6e 52 65 63 20 63 6f 6d 70 75 74  e of nRec comput
ca00: 65 64 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65  ed from the file
ca10: 20 73 69 7a 65 20 77 6f 75 6c 64 20 62 65 20 74   size would be t
ca20: 6f 6f 20 6c 61 72 67 65 2e 20 20 46 6f 72 0a 2a  oo large.  For.*
ca30: 2a 20 74 68 61 74 20 72 65 61 73 6f 6e 2c 20 77  * that reason, w
ca40: 65 20 61 6c 77 61 79 73 20 75 73 65 20 74 68 65  e always use the
ca50: 20 6e 52 65 63 20 76 61 6c 75 65 20 69 6e 20 74   nRec value in t
ca60: 68 65 20 68 65 61 64 65 72 2e 0a 2a 2a 0a 2a 2a  he header..**.**
ca70: 20 49 66 20 74 68 65 20 6e 52 65 63 20 76 61 6c   If the nRec val
ca80: 75 65 20 69 73 20 30 78 66 66 66 66 66 66 66 66  ue is 0xffffffff
ca90: 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74 20 6e   it means that n
caa0: 52 65 63 20 73 68 6f 75 6c 64 20 62 65 20 63 6f  Rec should be co
cab0: 6d 70 75 74 65 64 0a 2a 2a 20 66 72 6f 6d 20 74  mputed.** from t
cac0: 68 65 20 66 69 6c 65 20 73 69 7a 65 2e 20 20 54  he file size.  T
cad0: 68 69 73 20 76 61 6c 75 65 20 69 73 20 75 73 65  his value is use
cae0: 64 20 77 68 65 6e 20 74 68 65 20 75 73 65 72 20  d when the user 
caf0: 73 65 6c 65 63 74 73 20 74 68 65 0a 2a 2a 20 6e  selects the.** n
cb00: 6f 2d 73 79 6e 63 20 6f 70 74 69 6f 6e 20 66 6f  o-sync option fo
cb10: 72 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  r the journal.  
cb20: 41 20 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20  A power failure 
cb30: 63 6f 75 6c 64 20 6c 65 61 64 20 74 6f 20 63 6f  could lead to co
cb40: 72 72 75 70 74 69 6f 6e 0a 2a 2a 20 69 6e 20 74  rruption.** in t
cb50: 68 69 73 20 63 61 73 65 2e 20 20 42 75 74 20 66  his case.  But f
cb60: 6f 72 20 74 68 69 6e 67 73 20 6c 69 6b 65 20 74  or things like t
cb70: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20 28  emporary table (
cb80: 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a 2a 2a  which will be.**
cb90: 20 64 65 6c 65 74 65 64 20 77 68 65 6e 20 74 68   deleted when th
cba0: 65 20 70 6f 77 65 72 20 69 73 20 72 65 73 74 6f  e power is resto
cbb0: 72 65 64 29 20 77 65 20 64 6f 6e 27 74 20 63 61  red) we don't ca
cbc0: 72 65 2e 20 20 0a 2a 2a 0a 2a 2a 20 49 66 20 74  re.  .**.** If t
cbd0: 68 65 20 66 69 6c 65 20 6f 70 65 6e 65 64 20 61  he file opened a
cbe0: 73 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  s the journal fi
cbf0: 6c 65 20 69 73 20 6e 6f 74 20 61 20 77 65 6c 6c  le is not a well
cc00: 2d 66 6f 72 6d 65 64 0a 2a 2a 20 6a 6f 75 72 6e  -formed.** journ
cc10: 61 6c 20 66 69 6c 65 20 74 68 65 6e 20 61 6c 6c  al file then all
cc20: 20 70 61 67 65 73 20 75 70 20 74 6f 20 74 68 65   pages up to the
cc30: 20 66 69 72 73 74 20 63 6f 72 72 75 70 74 65 64   first corrupted
cc40: 20 70 61 67 65 20 61 72 65 20 72 6f 6c 6c 65 64   page are rolled
cc50: 0a 2a 2a 20 62 61 63 6b 20 28 6f 72 20 6e 6f 20  .** back (or no 
cc60: 70 61 67 65 73 20 69 66 20 74 68 65 20 6a 6f 75  pages if the jou
cc70: 72 6e 61 6c 20 68 65 61 64 65 72 20 69 73 20 63  rnal header is c
cc80: 6f 72 72 75 70 74 65 64 29 2e 20 54 68 65 20 6a  orrupted). The j
cc90: 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 69  ournal file.** i
cca0: 73 20 74 68 65 6e 20 64 65 6c 65 74 65 64 20 61  s then deleted a
ccb0: 6e 64 20 53 51 4c 49 54 45 5f 4f 4b 20 72 65 74  nd SQLITE_OK ret
ccc0: 75 72 6e 65 64 2c 20 6a 75 73 74 20 61 73 20 69  urned, just as i
ccd0: 66 20 6e 6f 20 63 6f 72 72 75 70 74 69 6f 6e 20  f no corruption 
cce0: 68 61 64 0a 2a 2a 20 62 65 65 6e 20 65 6e 63 6f  had.** been enco
ccf0: 75 6e 74 65 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  untered..**.** I
cd00: 66 20 61 6e 20 49 2f 4f 20 6f 72 20 6d 61 6c 6c  f an I/O or mall
cd10: 6f 63 28 29 20 65 72 72 6f 72 20 6f 63 63 75 72  oc() error occur
cd20: 73 2c 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2d 66  s, the journal-f
cd30: 69 6c 65 20 69 73 20 6e 6f 74 20 64 65 6c 65 74  ile is not delet
cd40: 65 64 0a 2a 2a 20 61 6e 64 20 61 6e 20 65 72 72  ed.** and an err
cd50: 6f 72 20 63 6f 64 65 20 69 73 20 72 65 74 75 72  or code is retur
cd60: 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ned..*/.static i
cd70: 6e 74 20 70 61 67 65 72 5f 70 6c 61 79 62 61 63  nt pager_playbac
cd80: 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
cd90: 20 69 6e 74 20 69 73 48 6f 74 29 7b 0a 20 20 69   int isHot){.  i
cda0: 36 34 20 73 7a 4a 3b 20 20 20 20 20 20 20 20 20  64 szJ;         
cdb0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20          /* Size 
cdc0: 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66  of the journal f
cdd0: 69 6c 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a  ile in bytes */.
cde0: 20 20 75 33 32 20 6e 52 65 63 3b 20 20 20 20 20    u32 nRec;     
cdf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
ce00: 6d 62 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20  mber of Records 
ce10: 69 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 2a  in the journal *
ce20: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
ce30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ce40: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
ce50: 20 20 50 67 6e 6f 20 6d 78 50 67 20 3d 20 30 3b    Pgno mxPg = 0;
ce60: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 69             /* Si
ce70: 7a 65 20 6f 66 20 74 68 65 20 6f 72 69 67 69 6e  ze of the origin
ce80: 61 6c 20 66 69 6c 65 20 69 6e 20 70 61 67 65 73  al file in pages
ce90: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
cea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
ceb0: 2a 20 52 65 73 75 6c 74 20 63 6f 64 65 20 6f 66  * Result code of
cec0: 20 61 20 73 75 62 72 6f 75 74 69 6e 65 20 2a 2f   a subroutine */
ced0: 0a 20 20 63 68 61 72 20 2a 7a 4d 61 73 74 65 72  .  char *zMaster
cee0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
cef0: 61 6d 65 20 6f 66 20 6d 61 73 74 65 72 20 6a 6f  ame of master jo
cf00: 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20 61 6e  urnal file if an
cf10: 79 20 2a 2f 0a 0a 20 20 2f 2a 20 46 69 67 75 72  y */..  /* Figur
cf20: 65 20 6f 75 74 20 68 6f 77 20 6d 61 6e 79 20 72  e out how many r
cf30: 65 63 6f 72 64 73 20 61 72 65 20 69 6e 20 74 68  ecords are in th
cf40: 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 41 62 6f 72  e journal.  Abor
cf50: 74 20 65 61 72 6c 79 20 69 66 0a 20 20 2a 2a 20  t early if.  ** 
cf60: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 69 73 20 65  the journal is e
cf70: 6d 70 74 79 2e 0a 20 20 2a 2f 0a 20 20 61 73 73  mpty..  */.  ass
cf80: 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ert( pPager->jou
cf90: 72 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 72 63  rnalOpen );.  rc
cfa0: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
cfb0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
cfc0: 2c 20 26 73 7a 4a 29 3b 0a 20 20 69 66 28 20 72  , &szJ);.  if( r
cfd0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20  c!=SQLITE_OK || 
cfe0: 73 7a 4a 3d 3d 30 20 29 7b 0a 20 20 20 20 67 6f  szJ==0 ){.    go
cff0: 74 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b  to end_playback;
d000: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 61 64 20  .  }..  /* Read 
d010: 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e  the master journ
d020: 61 6c 20 6e 61 6d 65 20 66 72 6f 6d 20 74 68 65  al name from the
d030: 20 6a 6f 75 72 6e 61 6c 2c 20 69 66 20 69 74 20   journal, if it 
d040: 69 73 20 70 72 65 73 65 6e 74 2e 0a 20 20 2a 2a  is present..  **
d050: 20 49 66 20 61 20 6d 61 73 74 65 72 20 6a 6f 75   If a master jou
d060: 72 6e 61 6c 20 66 69 6c 65 20 6e 61 6d 65 20 69  rnal file name i
d070: 73 20 73 70 65 63 69 66 69 65 64 2c 20 62 75 74  s specified, but
d080: 20 74 68 65 20 66 69 6c 65 20 69 73 20 6e 6f 74   the file is not
d090: 0a 20 20 2a 2a 20 70 72 65 73 65 6e 74 20 6f 6e  .  ** present on
d0a0: 20 64 69 73 6b 2c 20 74 68 65 6e 20 74 68 65 20   disk, then the 
d0b0: 6a 6f 75 72 6e 61 6c 20 69 73 20 6e 6f 74 20 68  journal is not h
d0c0: 6f 74 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ot and does not 
d0d0: 6e 65 65 64 20 74 6f 20 62 65 0a 20 20 2a 2a 20  need to be.  ** 
d0e0: 70 6c 61 79 65 64 20 62 61 63 6b 2e 0a 20 20 2a  played back..  *
d0f0: 2f 0a 20 20 72 63 20 3d 20 72 65 61 64 4d 61 73  /.  rc = readMas
d100: 74 65 72 4a 6f 75 72 6e 61 6c 28 70 50 61 67 65  terJournal(pPage
d110: 72 2d 3e 6a 66 64 2c 20 26 7a 4d 61 73 74 65 72  r->jfd, &zMaster
d120: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21  );.  assert( rc!
d130: 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a  =SQLITE_DONE );.
d140: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
d150: 5f 4f 4b 20 7c 7c 20 28 7a 4d 61 73 74 65 72 20  _OK || (zMaster 
d160: 26 26 20 21 73 71 6c 69 74 65 33 4f 73 46 69 6c  && !sqlite3OsFil
d170: 65 45 78 69 73 74 73 28 7a 4d 61 73 74 65 72 29  eExists(zMaster)
d180: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  ) ){.    sqliteF
d190: 72 65 65 28 7a 4d 61 73 74 65 72 29 3b 0a 20 20  ree(zMaster);.  
d1a0: 20 20 7a 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20    zMaster = 0;. 
d1b0: 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
d1c0: 45 5f 44 4f 4e 45 20 29 20 72 63 20 3d 20 53 51  E_DONE ) rc = SQ
d1d0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 20 20 67 6f 74  LITE_OK;.    got
d1e0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
d1f0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 4f 73 53    }.  sqlite3OsS
d200: 65 65 6b 28 70 50 61 67 65 72 2d 3e 6a 66 64 2c  eek(pPager->jfd,
d210: 20 30 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6a   0);.  pPager->j
d220: 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 0a  ournalOff = 0;..
d230: 20 20 2f 2a 20 54 68 69 73 20 6c 6f 6f 70 20 74    /* This loop t
d240: 65 72 6d 69 6e 61 74 65 73 20 65 69 74 68 65 72  erminates either
d250: 20 77 68 65 6e 20 74 68 65 20 72 65 61 64 4a 6f   when the readJo
d260: 75 72 6e 61 6c 48 64 72 28 29 20 63 61 6c 6c 20  urnalHdr() call 
d270: 72 65 74 75 72 6e 73 0a 20 20 2a 2a 20 53 51 4c  returns.  ** SQL
d280: 49 54 45 5f 44 4f 4e 45 20 6f 72 20 61 6e 20 49  ITE_DONE or an I
d290: 4f 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 20  O error occurs. 
d2a0: 2a 2f 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b  */.  while( 1 ){
d2b0: 0a 0a 20 20 20 20 2f 2a 20 52 65 61 64 20 74 68  ..    /* Read th
d2c0: 65 20 6e 65 78 74 20 6a 6f 75 72 6e 61 6c 20 68  e next journal h
d2d0: 65 61 64 65 72 20 66 72 6f 6d 20 74 68 65 20 6a  eader from the j
d2e0: 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20 20 49 66  ournal file.  If
d2f0: 20 74 68 65 72 65 20 61 72 65 0a 20 20 20 20 2a   there are.    *
d300: 2a 20 6e 6f 74 20 65 6e 6f 75 67 68 20 62 79 74  * not enough byt
d310: 65 73 20 6c 65 66 74 20 69 6e 20 74 68 65 20 6a  es left in the j
d320: 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72 20  ournal file for 
d330: 61 20 63 6f 6d 70 6c 65 74 65 20 68 65 61 64 65  a complete heade
d340: 72 2c 20 6f 72 0a 20 20 20 20 2a 2a 20 69 74 20  r, or.    ** it 
d350: 69 73 20 63 6f 72 72 75 70 74 65 64 2c 20 74 68  is corrupted, th
d360: 65 6e 20 61 20 70 72 6f 63 65 73 73 20 6d 75 73  en a process mus
d370: 74 20 6f 66 20 66 61 69 6c 65 64 20 77 68 69 6c  t of failed whil
d380: 65 20 77 72 69 74 69 6e 67 20 69 74 2e 0a 20 20  e writing it..  
d390: 20 20 2a 2a 20 54 68 69 73 20 69 6e 64 69 63 61    ** This indica
d3a0: 74 65 73 20 6e 6f 74 68 69 6e 67 20 6d 6f 72 65  tes nothing more
d3b0: 20 6e 65 65 64 73 20 74 6f 20 62 65 20 72 6f 6c   needs to be rol
d3c0: 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20 2a 2f  led back..    */
d3d0: 0a 20 20 20 20 72 63 20 3d 20 72 65 61 64 4a 6f  .    rc = readJo
d3e0: 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65 72 2c  urnalHdr(pPager,
d3f0: 20 73 7a 4a 2c 20 26 6e 52 65 63 2c 20 26 6d 78   szJ, &nRec, &mx
d400: 50 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  Pg);.    if( rc!
d410: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 20 0a 20  =SQLITE_OK ){ . 
d420: 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
d430: 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
d440: 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
d450: 4f 4b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OK;.      }.    
d460: 20 20 67 6f 74 6f 20 65 6e 64 5f 70 6c 61 79 62    goto end_playb
d470: 61 63 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ack;.    }..    
d480: 2f 2a 20 49 66 20 6e 52 65 63 20 69 73 20 30 78  /* If nRec is 0x
d490: 66 66 66 66 66 66 66 66 2c 20 74 68 65 6e 20 74  ffffffff, then t
d4a0: 68 69 73 20 6a 6f 75 72 6e 61 6c 20 77 61 73 20  his journal was 
d4b0: 63 72 65 61 74 65 64 20 62 79 20 61 20 70 72 6f  created by a pro
d4c0: 63 65 73 73 0a 20 20 20 20 2a 2a 20 77 6f 72 6b  cess.    ** work
d4d0: 69 6e 67 20 69 6e 20 6e 6f 2d 73 79 6e 63 20 6d  ing in no-sync m
d4e0: 6f 64 65 2e 20 54 68 69 73 20 6d 65 61 6e 73 20  ode. This means 
d4f0: 74 68 61 74 20 74 68 65 20 72 65 73 74 20 6f 66  that the rest of
d500: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 20 20 20   the journal.   
d510: 20 2a 2a 20 66 69 6c 65 20 63 6f 6e 73 69 73 74   ** file consist
d520: 73 20 6f 66 20 70 61 67 65 73 2c 20 74 68 65 72  s of pages, ther
d530: 65 20 61 72 65 20 6e 6f 20 6d 6f 72 65 20 6a 6f  e are no more jo
d540: 75 72 6e 61 6c 20 68 65 61 64 65 72 73 2e 20 43  urnal headers. C
d550: 6f 6d 70 75 74 65 0a 20 20 20 20 2a 2a 20 74 68  ompute.    ** th
d560: 65 20 76 61 6c 75 65 20 6f 66 20 6e 52 65 63 20  e value of nRec 
d570: 62 61 73 65 64 20 6f 6e 20 74 68 69 73 20 61 73  based on this as
d580: 73 75 6d 70 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f  sumption..    */
d590: 0a 20 20 20 20 69 66 28 20 6e 52 65 63 3d 3d 30  .    if( nRec==0
d5a0: 78 66 66 66 66 66 66 66 66 20 29 7b 0a 20 20 20  xffffffff ){.   
d5b0: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
d5c0: 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 3d 3d 4a  r->journalOff==J
d5d0: 4f 55 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50  OURNAL_HDR_SZ(pP
d5e0: 61 67 65 72 29 20 29 3b 0a 20 20 20 20 20 20 6e  ager) );.      n
d5f0: 52 65 63 20 3d 20 28 73 7a 4a 20 2d 20 4a 4f 55  Rec = (szJ - JOU
d600: 52 4e 41 4c 5f 48 44 52 5f 53 5a 28 70 50 61 67  RNAL_HDR_SZ(pPag
d610: 65 72 29 29 2f 4a 4f 55 52 4e 41 4c 5f 50 47 5f  er))/JOURNAL_PG_
d620: 53 5a 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20  SZ(pPager);.    
d630: 7d 0a 0a 20 20 20 20 2f 2a 20 49 66 20 6e 52 65  }..    /* If nRe
d640: 63 20 69 73 20 30 20 61 6e 64 20 74 68 69 73 20  c is 0 and this 
d650: 72 6f 6c 6c 62 61 63 6b 20 69 73 20 6f 66 20 61  rollback is of a
d660: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 72 65   transaction cre
d670: 61 74 65 64 20 62 79 20 74 68 69 73 0a 20 20 20  ated by this.   
d680: 20 2a 2a 20 70 72 6f 63 65 73 73 2e 20 49 6e 20   ** process. In 
d690: 74 68 69 73 20 63 61 73 65 20 74 68 65 20 72 65  this case the re
d6a0: 73 74 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  st of the journa
d6b0: 6c 20 66 69 6c 65 20 63 6f 6e 73 69 73 74 73 20  l file consists 
d6c0: 6f 66 0a 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61  of.    ** journa
d6d0: 6c 6c 65 64 20 63 6f 70 69 65 73 20 6f 66 20 70  lled copies of p
d6e0: 61 67 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  ages that need t
d6f0: 6f 20 62 65 20 72 65 61 64 20 62 61 63 6b 20 69  o be read back i
d700: 6e 74 6f 20 74 68 65 20 63 61 63 68 65 2e 0a 20  nto the cache.. 
d710: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 52     */.    if( nR
d720: 65 63 3d 3d 30 20 26 26 20 21 69 73 48 6f 74 20  ec==0 && !isHot 
d730: 29 7b 0a 20 20 20 20 20 20 6e 52 65 63 20 3d 20  ){.      nRec = 
d740: 28 73 7a 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a  (szJ - pPager->j
d750: 6f 75 72 6e 61 6c 4f 66 66 29 20 2f 20 4a 4f 55  ournalOff) / JOU
d760: 52 4e 41 4c 5f 50 47 5f 53 5a 28 70 50 61 67 65  RNAL_PG_SZ(pPage
d770: 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  r);.    }..    /
d780: 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
d790: 20 66 69 72 73 74 20 68 65 61 64 65 72 20 72 65   first header re
d7a0: 61 64 20 66 72 6f 6d 20 74 68 65 20 6a 6f 75 72  ad from the jour
d7b0: 6e 61 6c 2c 20 74 72 75 6e 63 61 74 65 20 74 68  nal, truncate th
d7c0: 65 0a 20 20 20 20 2a 2a 20 64 61 74 61 62 61 73  e.    ** databas
d7d0: 65 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 69  e file back to i
d7e0: 74 27 73 20 6f 72 69 67 69 6e 61 6c 20 73 69 7a  t's original siz
d7f0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
d800: 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
d810: 6c 4f 66 66 3d 3d 4a 4f 55 52 4e 41 4c 5f 48 44  lOff==JOURNAL_HD
d820: 52 5f 53 5a 28 70 50 61 67 65 72 29 20 29 7b 0a  R_SZ(pPager) ){.
d830: 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72        rc = pager
d840: 5f 74 72 75 6e 63 61 74 65 28 70 50 61 67 65 72  _truncate(pPager
d850: 2c 20 6d 78 50 67 29 3b 0a 20 20 20 20 20 20 69  , mxPg);.      i
d860: 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
d870: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   ){.        goto
d880: 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a 20   end_playback;. 
d890: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
d8a0: 20 20 2f 2a 20 43 6f 70 79 20 6f 72 69 67 69 6e    /* Copy origin
d8b0: 61 6c 20 70 61 67 65 73 20 6f 75 74 20 6f 66 20  al pages out of 
d8c0: 74 68 65 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  the journal and 
d8d0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 20 64 61  back into the da
d8e0: 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
d8f0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
d900: 20 69 3c 6e 52 65 63 3b 20 69 2b 2b 29 7b 0a 20   i<nRec; i++){. 
d910: 20 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f       rc = pager_
d920: 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67  playback_one_pag
d930: 65 28 70 50 61 67 65 72 2c 20 70 50 61 67 65 72  e(pPager, pPager
d940: 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20 20 20  ->jfd, 1);.     
d950: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
d960: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  OK ){.        if
d970: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
d980: 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  E ){.          r
d990: 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
d9a0: 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
d9b0: 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a  >journalOff = sz
d9c0: 4a 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  J;.          bre
d9d0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
d9e0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  e{.          got
d9f0: 6f 20 65 6e 64 5f 70 6c 61 79 62 61 63 6b 3b 0a  o end_playback;.
da00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
da10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2f 2a  }.    }.  }.  /*
da20: 4e 4f 54 52 45 41 43 48 45 44 2a 2f 0a 20 20 61  NOTREACHED*/.  a
da30: 73 73 65 72 74 28 20 30 20 29 3b 0a 0a 65 6e 64  ssert( 0 );..end
da40: 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69 66 28  _playback:.  if(
da50: 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
da60: 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  {.    rc = pager
da70: 5f 65 6e 64 5f 74 72 61 6e 73 61 63 74 69 6f 6e  _end_transaction
da80: 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20  (pPager);.  }.  
da90: 69 66 28 20 7a 4d 61 73 74 65 72 20 29 7b 0a 20  if( zMaster ){. 
daa0: 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 77     /* If there w
dab0: 61 73 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72  as a master jour
dac0: 6e 61 6c 20 61 6e 64 20 74 68 69 73 20 72 6f 75  nal and this rou
dad0: 74 69 6e 65 20 77 69 6c 6c 20 72 65 74 75 72 6e  tine will return
dae0: 20 73 75 63 63 65 73 73 2c 0a 20 20 20 20 2a 2a   success,.    **
daf0: 20 73 65 65 20 69 66 20 69 74 20 69 73 20 70 6f   see if it is po
db00: 73 73 69 62 6c 65 20 74 6f 20 64 65 6c 65 74 65  ssible to delete
db10: 20 74 68 65 20 6d 61 73 74 65 72 20 6a 6f 75 72   the master jour
db20: 6e 61 6c 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  nal..    */.    
db30: 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
db40: 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
db50: 70 61 67 65 72 5f 64 65 6c 6d 61 73 74 65 72 28  pager_delmaster(
db60: 7a 4d 61 73 74 65 72 29 3b 0a 20 20 20 20 7d 0a  zMaster);.    }.
db70: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
db80: 4d 61 73 74 65 72 29 3b 0a 20 20 7d 0a 0a 20 20  Master);.  }..  
db90: 2f 2a 20 54 68 65 20 50 61 67 65 72 2e 73 65 63  /* The Pager.sec
dba0: 74 6f 72 53 69 7a 65 20 76 61 72 69 61 62 6c 65  torSize variable
dbb0: 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e 20 75   may have been u
dbc0: 70 64 61 74 65 64 20 77 68 69 6c 65 20 72 6f 6c  pdated while rol
dbd0: 6c 69 6e 67 0a 20 20 2a 2a 20 62 61 63 6b 20 61  ling.  ** back a
dbe0: 20 6a 6f 75 72 6e 61 6c 20 63 72 65 61 74 65 64   journal created
dbf0: 20 62 79 20 61 20 70 72 6f 63 65 73 73 20 77 69   by a process wi
dc00: 74 68 20 61 20 64 69 66 66 65 72 65 6e 74 20 73  th a different s
dc10: 65 63 74 6f 72 20 73 69 7a 65 0a 20 20 2a 2a 20  ector size.  ** 
dc20: 76 61 6c 75 65 2e 20 52 65 73 65 74 20 69 74 20  value. Reset it 
dc30: 74 6f 20 74 68 65 20 63 6f 72 72 65 63 74 20 76  to the correct v
dc40: 61 6c 75 65 20 66 6f 72 20 74 68 69 73 20 70 72  alue for this pr
dc50: 6f 63 65 73 73 2e 0a 20 20 2a 2f 0a 20 20 73 65  ocess..  */.  se
dc60: 74 53 65 63 74 6f 72 53 69 7a 65 28 70 50 61 67  tSectorSize(pPag
dc70: 65 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  er);.  return rc
dc80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 6c 61 79 62  ;.}../*.** Playb
dc90: 61 63 6b 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ack the statemen
dca0: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a 2a 2a  t journal..**.**
dcb0: 20 54 68 69 73 20 69 73 20 73 69 6d 69 6c 61 72   This is similar
dcc0: 20 74 6f 20 70 6c 61 79 69 6e 67 20 62 61 63 6b   to playing back
dcd0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
dce0: 20 6a 6f 75 72 6e 61 6c 20 62 75 74 20 77 69 74   journal but wit
dcf0: 68 0a 2a 2a 20 61 20 66 65 77 20 65 78 74 72 61  h.** a few extra
dd00: 20 74 77 69 73 74 73 2e 0a 2a 2a 0a 2a 2a 20 20   twists..**.**  
dd10: 20 20 28 31 29 20 20 54 68 65 20 6e 75 6d 62 65    (1)  The numbe
dd20: 72 20 6f 66 20 70 61 67 65 73 20 69 6e 20 74 68  r of pages in th
dd30: 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
dd40: 61 74 20 74 68 65 20 73 74 61 72 74 20 6f 66 0a  at the start of.
dd50: 2a 2a 20 20 20 20 20 20 20 20 20 74 68 65 20 73  **         the s
dd60: 74 61 74 65 6d 65 6e 74 20 69 73 20 73 74 6f 72  tatement is stor
dd70: 65 64 20 69 6e 20 70 50 61 67 65 72 2d 3e 73 74  ed in pPager->st
dd80: 6d 74 53 69 7a 65 2c 20 6e 6f 74 20 69 6e 20 74  mtSize, not in t
dd90: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 6a 6f  he.**         jo
dda0: 75 72 6e 61 6c 20 66 69 6c 65 20 69 74 73 65 6c  urnal file itsel
ddb0: 66 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 28 32 29 20  f..**.**    (2) 
ddc0: 20 49 6e 20 61 64 64 69 74 69 6f 6e 20 74 6f 20   In addition to 
ddd0: 70 6c 61 79 69 6e 67 20 62 61 63 6b 20 74 68 65  playing back the
dde0: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
ddf0: 61 6c 2c 20 61 6c 73 6f 0a 2a 2a 20 20 20 20 20  al, also.**     
de00: 20 20 20 20 70 6c 61 79 62 61 63 6b 20 61 6c 6c      playback all
de10: 20 70 61 67 65 73 20 6f 66 20 74 68 65 20 74 72   pages of the tr
de20: 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61  ansaction journa
de30: 6c 20 62 65 67 69 6e 6e 69 6e 67 0a 2a 2a 20 20  l beginning.**  
de40: 20 20 20 20 20 20 20 61 74 20 6f 66 66 73 65 74         at offset
de50: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4a 53 69   pPager->stmtJSi
de60: 7a 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ze..*/.static in
de70: 74 20 70 61 67 65 72 5f 73 74 6d 74 5f 70 6c 61  t pager_stmt_pla
de80: 79 62 61 63 6b 28 50 61 67 65 72 20 2a 70 50 61  yback(Pager *pPa
de90: 67 65 72 29 7b 0a 20 20 69 36 34 20 73 7a 4a 3b  ger){.  i64 szJ;
dea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
deb0: 20 2f 2a 20 53 69 7a 65 20 6f 66 20 74 68 65 20   /* Size of the 
dec0: 66 75 6c 6c 20 6a 6f 75 72 6e 61 6c 20 2a 2f 0a  full journal */.
ded0: 20 20 69 36 34 20 68 64 72 4f 66 66 3b 0a 20 20    i64 hdrOff;.  
dee0: 69 6e 74 20 6e 52 65 63 3b 20 20 20 20 20 20 20  int nRec;       
def0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
df00: 65 72 20 6f 66 20 52 65 63 6f 72 64 73 20 2a 2f  er of Records */
df10: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
df20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
df30: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
df40: 20 69 6e 74 20 72 63 3b 0a 0a 20 20 73 7a 4a 20   int rc;..  szJ 
df50: 3d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  = pPager->journa
df60: 6c 4f 66 66 3b 0a 23 69 66 6e 64 65 66 20 4e 44  lOff;.#ifndef ND
df70: 45 42 55 47 20 0a 20 20 7b 0a 20 20 20 20 69 36  EBUG .  {.    i6
df80: 34 20 6f 73 5f 73 7a 4a 3b 0a 20 20 20 20 72 63  4 os_szJ;.    rc
df90: 20 3d 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65   = sqlite3OsFile
dfa0: 53 69 7a 65 28 70 50 61 67 65 72 2d 3e 6a 66 64  Size(pPager->jfd
dfb0: 2c 20 26 6f 73 5f 73 7a 4a 29 3b 0a 20 20 20 20  , &os_szJ);.    
dfc0: 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
dfd0: 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  K ) return rc;. 
dfe0: 20 20 20 61 73 73 65 72 74 28 20 73 7a 4a 3d 3d     assert( szJ==
dff0: 6f 73 5f 73 7a 4a 20 29 3b 0a 20 20 7d 0a 23 65  os_szJ );.  }.#e
e000: 6e 64 69 66 0a 0a 20 20 2f 2a 20 53 65 74 20 68  ndif..  /* Set h
e010: 64 72 4f 66 66 20 74 6f 20 62 65 20 74 68 65 20  drOff to be the 
e020: 6f 66 66 73 65 74 20 6a 75 73 74 20 61 66 74 65  offset just afte
e030: 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  r the end of the
e040: 20 6c 61 73 74 20 6a 6f 75 72 6e 61 6c 0a 20 20   last journal.  
e050: 2a 2a 20 70 61 67 65 20 77 72 69 74 74 65 6e 20  ** page written 
e060: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
e070: 20 6a 6f 75 72 6e 61 6c 2d 68 65 61 64 65 72 20   journal-header 
e080: 66 6f 72 20 74 68 69 73 20 73 74 61 74 65 6d 65  for this stateme
e090: 6e 74 0a 20 20 2a 2a 20 74 72 61 6e 73 61 63 74  nt.  ** transact
e0a0: 69 6f 6e 20 77 61 73 20 77 72 69 74 74 65 6e 2c  ion was written,
e0b0: 20 6f 72 20 74 68 65 20 65 6e 64 20 6f 66 20 74   or the end of t
e0c0: 68 65 20 66 69 6c 65 20 69 66 20 6e 6f 20 6a 6f  he file if no jo
e0d0: 75 72 6e 61 6c 0a 20 20 2a 2a 20 68 65 61 64 65  urnal.  ** heade
e0e0: 72 20 77 61 73 20 77 72 69 74 74 65 6e 2e 0a 20  r was written.. 
e0f0: 20 2a 2f 0a 20 20 68 64 72 4f 66 66 20 3d 20 70   */.  hdrOff = p
e100: 50 61 67 65 72 2d 3e 73 74 6d 74 48 64 72 4f 66  Pager->stmtHdrOf
e110: 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  f;.  assert( pPa
e120: 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 7c 7c  ger->fullSync ||
e130: 20 21 68 64 72 4f 66 66 20 29 3b 0a 20 20 69 66   !hdrOff );.  if
e140: 28 20 21 68 64 72 4f 66 66 20 29 7b 0a 20 20 20  ( !hdrOff ){.   
e150: 20 68 64 72 4f 66 66 20 3d 20 73 7a 4a 3b 0a 20   hdrOff = szJ;. 
e160: 20 7d 0a 20 20 0a 20 20 2f 2a 20 54 72 75 6e 63   }.  .  /* Trunc
e170: 61 74 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ate the database
e180: 20 62 61 63 6b 20 74 6f 20 69 74 73 20 6f 72 69   back to its ori
e190: 67 69 6e 61 6c 20 73 69 7a 65 2e 0a 20 20 2a 2f  ginal size..  */
e1a0: 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
e1b0: 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 70  uncate(pPager, p
e1c0: 50 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 29  Pager->stmtSize)
e1d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67  ;.  assert( pPag
e1e0: 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52  er->state>=PAGER
e1f0: 5f 53 48 41 52 45 44 20 29 3b 0a 0a 20 20 2f 2a  _SHARED );..  /*
e200: 20 46 69 67 75 72 65 20 6f 75 74 20 68 6f 77 20   Figure out how 
e210: 6d 61 6e 79 20 72 65 63 6f 72 64 73 20 61 72 65  many records are
e220: 20 69 6e 20 74 68 65 20 73 74 61 74 65 6d 65 6e   in the statemen
e230: 74 20 6a 6f 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a  t journal..  */.
e240: 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
e250: 2d 3e 73 74 6d 74 49 6e 55 73 65 20 26 26 20 70  ->stmtInUse && p
e260: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
e270: 65 6e 20 29 3b 0a 20 20 73 71 6c 69 74 65 33 4f  en );.  sqlite3O
e280: 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 73 74  sSeek(pPager->st
e290: 66 64 2c 20 30 29 3b 0a 20 20 6e 52 65 63 20 3d  fd, 0);.  nRec =
e2a0: 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65   pPager->stmtNRe
e2b0: 63 3b 0a 20 20 0a 20 20 2f 2a 20 43 6f 70 79 20  c;.  .  /* Copy 
e2c0: 6f 72 69 67 69 6e 61 6c 20 70 61 67 65 73 20 6f  original pages o
e2d0: 75 74 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  ut of the statem
e2e0: 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 61 6e 64 20  ent journal and 
e2f0: 62 61 63 6b 20 69 6e 74 6f 20 74 68 65 0a 20 20  back into the.  
e300: 2a 2a 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ** database file
e310: 2e 20 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .  Note that the
e320: 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72 6e   statement journ
e330: 61 6c 20 6f 6d 69 74 73 20 63 68 65 63 6b 73 75  al omits checksu
e340: 6d 73 20 66 72 6f 6d 0a 20 20 2a 2a 20 65 61 63  ms from.  ** eac
e350: 68 20 72 65 63 6f 72 64 20 73 69 6e 63 65 20 70  h record since p
e360: 6f 77 65 72 2d 66 61 69 6c 75 72 65 20 72 65 63  ower-failure rec
e370: 6f 76 65 72 79 20 69 73 20 6e 6f 74 20 69 6d 70  overy is not imp
e380: 6f 72 74 61 6e 74 20 74 6f 20 73 74 61 74 65 6d  ortant to statem
e390: 65 6e 74 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c  ent.  ** journal
e3a0: 73 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  s..  */.  for(i=
e3b0: 6e 52 65 63 2d 31 3b 20 69 3e 3d 30 3b 20 69 2d  nRec-1; i>=0; i-
e3c0: 2d 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 61 67  -){.    rc = pag
e3d0: 65 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f  er_playback_one_
e3e0: 70 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61  page(pPager, pPa
e3f0: 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 0a 20  ger->stfd, 0);. 
e400: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e410: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e420: 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
e430: 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 73  _OK ) goto end_s
e440: 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20 20  tmt_playback;.  
e450: 7d 0a 0a 20 20 2f 2a 20 4e 6f 77 20 72 6f 6c 6c  }..  /* Now roll
e460: 20 73 6f 6d 65 20 70 61 67 65 73 20 62 61 63 6b   some pages back
e470: 20 66 72 6f 6d 20 74 68 65 20 74 72 61 6e 73 61   from the transa
e480: 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 2e 20 50  ction journal. P
e490: 61 67 65 72 2e 73 74 6d 74 4a 53 69 7a 65 0a 20  ager.stmtJSize. 
e4a0: 20 2a 2a 20 77 61 73 20 74 68 65 20 73 69 7a 65   ** was the size
e4b0: 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20   of the journal 
e4c0: 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73 20 73  file when this s
e4d0: 74 61 74 65 6d 65 6e 74 20 77 61 73 20 73 74 61  tatement was sta
e4e0: 72 74 65 64 2c 20 73 6f 0a 20 20 2a 2a 20 65 76  rted, so.  ** ev
e4f0: 65 72 79 74 68 69 6e 67 20 61 66 74 65 72 20 74  erything after t
e500: 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20  hat needs to be 
e510: 72 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74  rolled back, eit
e520: 68 65 72 20 69 6e 74 6f 20 74 68 65 0a 20 20 2a  her into the.  *
e530: 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68 65 20  * database, the 
e540: 6d 65 6d 6f 72 79 20 63 61 63 68 65 2c 20 6f 72  memory cache, or
e550: 20 62 6f 74 68 2e 0a 20 20 2a 2a 0a 20 20 2a 2a   both..  **.  **
e560: 20 49 66 20 69 74 20 69 73 20 6e 6f 74 20 7a 65   If it is not ze
e570: 72 6f 2c 20 74 68 65 6e 20 50 61 67 65 72 2e 73  ro, then Pager.s
e580: 74 6d 74 48 64 72 4f 66 66 20 69 73 20 74 68 65  tmtHdrOff is the
e590: 20 6f 66 66 73 65 74 20 74 6f 20 74 68 65 20 73   offset to the s
e5a0: 74 61 72 74 0a 20 20 2a 2a 20 6f 66 20 74 68 65  tart.  ** of the
e5b0: 20 66 69 72 73 74 20 6a 6f 75 72 6e 61 6c 20 68   first journal h
e5c0: 65 61 64 65 72 20 77 72 69 74 74 65 6e 20 64 75  eader written du
e5d0: 72 69 6e 67 20 74 68 69 73 20 73 74 61 74 65 6d  ring this statem
e5e0: 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e  ent transaction.
e5f0: 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
e600: 69 74 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65  ite3OsSeek(pPage
e610: 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e  r->jfd, pPager->
e620: 73 74 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66  stmtJSize);.  if
e630: 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
e640: 29 7b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  ){.    goto end_
e650: 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a 20  stmt_playback;. 
e660: 20 7d 0a 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75   }.  pPager->jou
e670: 72 6e 61 6c 4f 66 66 20 3d 20 70 50 61 67 65 72  rnalOff = pPager
e680: 2d 3e 73 74 6d 74 4a 53 69 7a 65 3b 0a 20 20 70  ->stmtJSize;.  p
e690: 50 61 67 65 72 2d 3e 63 6b 73 75 6d 49 6e 69 74  Pager->cksumInit
e6a0: 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 43   = pPager->stmtC
e6b0: 6b 73 75 6d 3b 0a 20 20 77 68 69 6c 65 28 20 70  ksum;.  while( p
e6c0: 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
e6d0: 66 20 3c 20 68 64 72 4f 66 66 20 29 7b 0a 20 20  f < hdrOff ){.  
e6e0: 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70 6c 61    rc = pager_pla
e6f0: 79 62 61 63 6b 5f 6f 6e 65 5f 70 61 67 65 28 70  yback_one_page(p
e700: 50 61 67 65 72 2c 20 70 50 61 67 65 72 2d 3e 6a  Pager, pPager->j
e710: 66 64 2c 20 31 29 3b 0a 20 20 20 20 61 73 73 65  fd, 1);.    asse
e720: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
e730: 4f 4e 45 20 29 3b 0a 20 20 20 20 69 66 28 20 72  ONE );.    if( r
e740: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67  c!=SQLITE_OK ) g
e750: 6f 74 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61  oto end_stmt_pla
e760: 79 62 61 63 6b 3b 0a 20 20 7d 0a 0a 20 20 77 68  yback;.  }..  wh
e770: 69 6c 65 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75  ile( pPager->jou
e780: 72 6e 61 6c 4f 66 66 20 3c 20 73 7a 4a 20 29 7b  rnalOff < szJ ){
e790: 0a 20 20 20 20 75 33 32 20 6e 4a 52 65 63 3b 20  .    u32 nJRec; 
e7a0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
e7b0: 72 20 6f 66 20 4a 6f 75 72 6e 61 6c 20 52 65 63  r of Journal Rec
e7c0: 6f 72 64 73 20 2a 2f 0a 20 20 20 20 75 33 32 20  ords */.    u32 
e7d0: 64 75 6d 6d 79 3b 0a 20 20 20 20 72 63 20 3d 20  dummy;.    rc = 
e7e0: 72 65 61 64 4a 6f 75 72 6e 61 6c 48 64 72 28 70  readJournalHdr(p
e7f0: 50 61 67 65 72 2c 20 73 7a 4a 2c 20 26 6e 4a 52  Pager, szJ, &nJR
e800: 65 63 2c 20 26 64 75 6d 6d 79 29 3b 0a 20 20 20  ec, &dummy);.   
e810: 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
e820: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  OK ){.      asse
e830: 72 74 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  rt( rc!=SQLITE_D
e840: 4f 4e 45 20 29 3b 0a 20 20 20 20 20 20 67 6f 74  ONE );.      got
e850: 6f 20 65 6e 64 5f 73 74 6d 74 5f 70 6c 61 79 62  o end_stmt_playb
e860: 61 63 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ack;.    }.    i
e870: 66 28 20 6e 4a 52 65 63 3d 3d 30 20 29 7b 0a 20  f( nJRec==0 ){. 
e880: 20 20 20 20 20 6e 4a 52 65 63 20 3d 20 28 73 7a       nJRec = (sz
e890: 4a 20 2d 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  J - pPager->jour
e8a0: 6e 61 6c 4f 66 66 29 20 2f 20 28 70 50 61 67 65  nalOff) / (pPage
e8b0: 72 2d 3e 70 61 67 65 53 69 7a 65 2b 38 29 3b 0a  r->pageSize+8);.
e8c0: 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d      }.    for(i=
e8d0: 6e 4a 52 65 63 2d 31 3b 20 69 3e 3d 30 20 26 26  nJRec-1; i>=0 &&
e8e0: 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
e8f0: 4f 66 66 20 3c 20 73 7a 4a 3b 20 69 2d 2d 29 7b  Off < szJ; i--){
e900: 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67 65  .      rc = page
e910: 72 5f 70 6c 61 79 62 61 63 6b 5f 6f 6e 65 5f 70  r_playback_one_p
e920: 61 67 65 28 70 50 61 67 65 72 2c 20 70 50 61 67  age(pPager, pPag
e930: 65 72 2d 3e 6a 66 64 2c 20 31 29 3b 0a 20 20 20  er->jfd, 1);.   
e940: 20 20 20 61 73 73 65 72 74 28 20 72 63 21 3d 53     assert( rc!=S
e950: 51 4c 49 54 45 5f 44 4f 4e 45 20 29 3b 0a 20 20  QLITE_DONE );.  
e960: 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
e970: 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
e980: 5f 73 74 6d 74 5f 70 6c 61 79 62 61 63 6b 3b 0a  _stmt_playback;.
e990: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 50 61      }.  }..  pPa
e9a0: 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20  ger->journalOff 
e9b0: 3d 20 73 7a 4a 3b 0a 20 20 0a 65 6e 64 5f 73 74  = szJ;.  .end_st
e9c0: 6d 74 5f 70 6c 61 79 62 61 63 6b 3a 0a 20 20 69  mt_playback:.  i
e9d0: 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
e9e0: 29 20 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ) {.    pPager->
e9f0: 6a 6f 75 72 6e 61 6c 4f 66 66 20 3d 20 73 7a 4a  journalOff = szJ
ea00: 3b 0a 20 20 20 20 2f 2a 20 70 61 67 65 72 5f 72  ;.    /* pager_r
ea10: 65 6c 6f 61 64 5f 63 61 63 68 65 28 70 50 61 67  eload_cache(pPag
ea20: 65 72 29 3b 20 2a 2f 0a 20 20 7d 0a 20 20 72 65  er); */.  }.  re
ea30: 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
ea40: 2a 20 43 68 61 6e 67 65 20 74 68 65 20 6d 61 78  * Change the max
ea50: 69 6d 75 6d 20 6e 75 6d 62 65 72 20 6f 66 20 69  imum number of i
ea60: 6e 2d 6d 65 6d 6f 72 79 20 70 61 67 65 73 20 74  n-memory pages t
ea70: 68 61 74 20 61 72 65 20 61 6c 6c 6f 77 65 64 2e  hat are allowed.
ea80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ea90: 50 61 67 65 72 53 65 74 43 61 63 68 65 73 69 7a  PagerSetCachesiz
eaa0: 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
eab0: 20 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20   int mxPage){.  
eac0: 69 66 28 20 6d 78 50 61 67 65 3e 31 30 20 29 7b  if( mxPage>10 ){
ead0: 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
eae0: 61 67 65 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20  age = mxPage;.  
eaf0: 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 61 67 65  }else{.    pPage
eb00: 72 2d 3e 6d 78 50 61 67 65 20 3d 20 31 30 3b 0a  r->mxPage = 10;.
eb10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 6a    }.}../*.** Adj
eb20: 75 73 74 20 74 68 65 20 72 6f 62 75 73 74 6e 65  ust the robustne
eb30: 73 73 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  ss of the databa
eb40: 73 65 20 74 6f 20 64 61 6d 61 67 65 20 64 75 65  se to damage due
eb50: 20 74 6f 20 4f 53 20 63 72 61 73 68 65 73 0a 2a   to OS crashes.*
eb60: 2a 20 6f 72 20 70 6f 77 65 72 20 66 61 69 6c 75  * or power failu
eb70: 72 65 73 20 62 79 20 63 68 61 6e 67 69 6e 67 20  res by changing 
eb80: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73 79  the number of sy
eb90: 6e 63 73 28 29 73 20 77 68 65 6e 20 77 72 69 74  ncs()s when writ
eba0: 69 6e 67 0a 2a 2a 20 74 68 65 20 72 6f 6c 6c 62  ing.** the rollb
ebb0: 61 63 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 54 68  ack journal.  Th
ebc0: 65 72 65 20 61 72 65 20 74 68 72 65 65 20 6c 65  ere are three le
ebd0: 76 65 6c 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4f  vels:.**.**    O
ebe0: 46 46 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  FF       sqlite3
ebf0: 4f 73 53 79 6e 63 28 29 20 69 73 20 6e 65 76 65  OsSync() is neve
ec00: 72 20 63 61 6c 6c 65 64 2e 20 20 54 68 69 73 20  r called.  This 
ec10: 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 0a 2a  is the default.*
ec20: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
ec30: 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 61 6e 64  or temporary and
ec40: 20 74 72 61 6e 73 69 65 6e 74 20 66 69 6c 65 73   transient files
ec50: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 4e 4f 52 4d 41  ..**.**    NORMA
ec60: 4c 20 20 20 20 54 68 65 20 6a 6f 75 72 6e 61 6c  L    The journal
ec70: 20 69 73 20 73 79 6e 63 65 64 20 6f 6e 63 65 20   is synced once 
ec80: 62 65 66 6f 72 65 20 77 72 69 74 65 73 20 62 65  before writes be
ec90: 67 69 6e 20 6f 6e 20 74 68 65 0a 2a 2a 20 20 20  gin on the.**   
eca0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62             datab
ecb0: 61 73 65 2e 20 20 54 68 69 73 20 69 73 20 6e 6f  ase.  This is no
ecc0: 72 6d 61 6c 6c 79 20 61 64 65 71 75 61 74 65 20  rmally adequate 
ecd0: 70 72 6f 74 65 63 74 69 6f 6e 2c 20 62 75 74 0a  protection, but.
ece0: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
ecf0: 69 74 20 69 73 20 74 68 65 6f 72 65 74 69 63 61  it is theoretica
ed00: 6c 6c 79 20 70 6f 73 73 69 62 6c 65 2c 20 74 68  lly possible, th
ed10: 6f 75 67 68 20 76 65 72 79 20 75 6e 6c 69 6b 65  ough very unlike
ed20: 6c 79 2c 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ly,.**          
ed30: 20 20 20 20 74 68 61 74 20 61 6e 20 69 6e 6f 70      that an inop
ed40: 65 72 74 75 6e 65 20 70 6f 77 65 72 20 66 61 69  ertune power fai
ed50: 6c 75 72 65 20 63 6f 75 6c 64 20 6c 65 61 76 65  lure could leave
ed60: 20 74 68 65 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20   the journal.** 
ed70: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20               in 
ed80: 61 20 73 74 61 74 65 20 77 68 69 63 68 20 77 6f  a state which wo
ed90: 75 6c 64 20 63 61 75 73 65 20 64 61 6d 61 67 65  uld cause damage
eda0: 20 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65   to the database
edb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
edc0: 20 77 68 65 6e 20 69 74 20 69 73 20 72 6f 6c 6c   when it is roll
edd0: 65 64 20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 20  ed back..**.**  
ede0: 20 20 46 55 4c 4c 20 20 20 20 20 20 54 68 65 20    FULL      The 
edf0: 6a 6f 75 72 6e 61 6c 20 69 73 20 73 79 6e 63 65  journal is synce
ee00: 64 20 74 77 69 63 65 20 62 65 66 6f 72 65 20 77  d twice before w
ee10: 72 69 74 65 73 20 62 65 67 69 6e 20 6f 6e 20 74  rites begin on t
ee20: 68 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  he.**           
ee30: 20 20 20 64 61 74 61 62 61 73 65 20 28 77 69 74     database (wit
ee40: 68 20 73 6f 6d 65 20 61 64 64 69 74 69 6f 6e 61  h some additiona
ee50: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2d 20  l information - 
ee60: 74 68 65 20 6e 52 65 63 20 66 69 65 6c 64 0a 2a  the nRec field.*
ee70: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f  *              o
ee80: 66 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 68 65  f the journal he
ee90: 61 64 65 72 20 2d 20 62 65 69 6e 67 20 77 72 69  ader - being wri
eea0: 74 74 65 6e 20 69 6e 20 62 65 74 77 65 65 6e 20  tten in between 
eeb0: 74 68 65 20 74 77 6f 0a 2a 2a 20 20 20 20 20 20  the two.**      
eec0: 20 20 20 20 20 20 20 20 73 79 6e 63 73 29 2e 20          syncs). 
eed0: 20 49 66 20 77 65 20 61 73 73 75 6d 65 20 74 68   If we assume th
eee0: 61 74 20 77 72 69 74 69 6e 67 20 61 0a 2a 2a 20  at writing a.** 
eef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 69 6e               sin
ef00: 67 6c 65 20 64 69 73 6b 20 73 65 63 74 6f 72 20  gle disk sector 
ef10: 69 73 20 61 74 6f 6d 69 63 2c 20 74 68 65 6e 20  is atomic, then 
ef20: 74 68 69 73 20 6d 6f 64 65 20 70 72 6f 76 69 64  this mode provid
ef30: 65 73 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  es.**           
ef40: 20 20 20 61 73 73 75 72 61 6e 63 65 20 74 68 61     assurance tha
ef50: 74 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 77 69  t the journal wi
ef60: 6c 6c 20 6e 6f 74 20 62 65 20 63 6f 72 72 75 70  ll not be corrup
ef70: 74 65 64 20 74 6f 20 74 68 65 0a 2a 2a 20 20 20  ted to the.**   
ef80: 20 20 20 20 20 20 20 20 20 20 20 70 6f 69 6e 74             point
ef90: 20 6f 66 20 63 61 75 73 69 6e 67 20 64 61 6d 61   of causing dama
efa0: 67 65 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ge to the databa
efb0: 73 65 20 64 75 72 69 6e 67 20 72 6f 6c 6c 62 61  se during rollba
efc0: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 4e 75 6d 65 72 69  ck..**.** Numeri
efd0: 63 20 76 61 6c 75 65 73 20 61 73 73 6f 63 69 61  c values associa
efe0: 74 65 64 20 77 69 74 68 20 74 68 65 73 65 20 73  ted with these s
eff0: 74 61 74 65 73 20 61 72 65 20 4f 46 46 3d 3d 31  tates are OFF==1
f000: 2c 20 4e 4f 52 4d 41 4c 3d 32 2c 0a 2a 2a 20 61  , NORMAL=2,.** a
f010: 6e 64 20 46 55 4c 4c 3d 33 2e 0a 2a 2f 0a 23 69  nd FULL=3..*/.#i
f020: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
f030: 54 5f 50 41 47 45 52 5f 50 52 41 47 4d 41 53 0a  T_PAGER_PRAGMAS.
f040: 76 6f 69 64 20 73 71 6c 69 74 65 33 50 61 67 65  void sqlite3Page
f050: 72 53 65 74 53 61 66 65 74 79 4c 65 76 65 6c 28  rSetSafetyLevel(
f060: 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69  Pager *pPager, i
f070: 6e 74 20 6c 65 76 65 6c 2c 20 69 6e 74 20 66 75  nt level, int fu
f080: 6c 6c 5f 66 73 79 6e 63 29 7b 0a 20 20 70 50 61  ll_fsync){.  pPa
f090: 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20 20 6c  ger->noSync =  l
f0a0: 65 76 65 6c 3d 3d 31 20 7c 7c 20 70 50 61 67 65  evel==1 || pPage
f0b0: 72 2d 3e 74 65 6d 70 46 69 6c 65 3b 0a 20 20 70  r->tempFile;.  p
f0c0: 50 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20  Pager->fullSync 
f0d0: 3d 20 6c 65 76 65 6c 3d 3d 33 20 26 26 20 21 70  = level==3 && !p
f0e0: 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 3b  Pager->tempFile;
f0f0: 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 5f  .  pPager->full_
f100: 66 73 79 6e 63 20 3d 20 66 75 6c 6c 5f 66 73 79  fsync = full_fsy
f110: 6e 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65 72  nc;.  if( pPager
f120: 2d 3e 6e 6f 53 79 6e 63 20 29 20 70 50 61 67 65  ->noSync ) pPage
f130: 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b  r->needSync = 0;
f140: 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a  .}.#endif../*.**
f150: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
f160: 6c 6f 62 61 6c 20 76 61 72 69 61 62 6c 65 20 69  lobal variable i
f170: 73 20 69 6e 63 72 65 6d 65 6e 74 65 64 20 77 68  s incremented wh
f180: 65 6e 65 76 65 72 20 74 68 65 20 6c 69 62 72 61  enever the libra
f190: 72 79 0a 2a 2a 20 61 74 74 65 6d 70 74 73 20 74  ry.** attempts t
f1a0: 6f 20 6f 70 65 6e 20 61 20 74 65 6d 70 6f 72 61  o open a tempora
f1b0: 72 79 20 66 69 6c 65 2e 20 20 54 68 69 73 20 69  ry file.  This i
f1c0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 75 73  nformation is us
f1d0: 65 64 20 66 6f 72 0a 2a 2a 20 74 65 73 74 69 6e  ed for.** testin
f1e0: 67 20 61 6e 64 20 61 6e 61 6c 79 73 69 73 20 6f  g and analysis o
f1f0: 6e 6c 79 2e 20 20 0a 2a 2f 0a 23 69 66 64 65 66  nly.  .*/.#ifdef
f200: 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 69 6e 74   SQLITE_TEST.int
f210: 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 74 65 6d   sqlite3_opentem
f220: 70 5f 63 6f 75 6e 74 20 3d 20 30 3b 0a 23 65 6e  p_count = 0;.#en
f230: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  dif../*.** Open 
f240: 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  a temporary file
f250: 2e 20 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20 74  . .**.** Write t
f260: 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
f270: 6f 72 20 69 6e 74 6f 20 2a 66 64 2e 20 20 52 65  or into *fd.  Re
f280: 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 20 6f  turn SQLITE_OK o
f290: 6e 20 73 75 63 63 65 73 73 20 6f 72 20 73 6f 6d  n success or som
f2a0: 65 0a 2a 2a 20 6f 74 68 65 72 20 65 72 72 6f 72  e.** other error
f2b0: 20 63 6f 64 65 20 69 66 20 77 65 20 66 61 69 6c   code if we fail
f2c0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 53 20 77  ..**.** The OS w
f2d0: 69 6c 6c 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ill automaticall
f2e0: 79 20 64 65 6c 65 74 65 20 74 68 65 20 74 65 6d  y delete the tem
f2f0: 70 6f 72 61 72 79 20 66 69 6c 65 20 77 68 65 6e  porary file when
f300: 20 69 74 20 69 73 0a 2a 2a 20 63 6c 6f 73 65 64   it is.** closed
f310: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f320: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
f330: 74 65 6d 70 28 4f 73 46 69 6c 65 20 2a 2a 70 46  temp(OsFile **pF
f340: 64 29 7b 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20  d){.  int cnt = 
f350: 38 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63  8;.  int rc;.  c
f360: 68 61 72 20 7a 46 69 6c 65 5b 53 51 4c 49 54 45  har zFile[SQLITE
f370: 5f 54 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b  _TEMPNAME_SIZE];
f380: 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
f390: 54 45 53 54 0a 20 20 73 71 6c 69 74 65 33 5f 6f  TEST.  sqlite3_o
f3a0: 70 65 6e 74 65 6d 70 5f 63 6f 75 6e 74 2b 2b 3b  pentemp_count++;
f3b0: 20 20 2f 2a 20 55 73 65 64 20 66 6f 72 20 74 65    /* Used for te
f3c0: 73 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73  sting and analys
f3d0: 69 73 20 6f 6e 6c 79 20 2a 2f 0a 23 65 6e 64 69  is only */.#endi
f3e0: 66 0a 20 20 64 6f 7b 0a 20 20 20 20 63 6e 74 2d  f.  do{.    cnt-
f3f0: 2d 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73  -;.    sqlite3Os
f400: 54 65 6d 70 46 69 6c 65 4e 61 6d 65 28 7a 46 69  TempFileName(zFi
f410: 6c 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  le);.    rc = sq
f420: 6c 69 74 65 33 4f 73 4f 70 65 6e 45 78 63 6c 75  lite3OsOpenExclu
f430: 73 69 76 65 28 7a 46 69 6c 65 2c 20 70 46 64 2c  sive(zFile, pFd,
f440: 20 31 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28   1);.    assert(
f450: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
f460: 7c 20 2a 70 46 64 20 29 3b 0a 20 20 7d 77 68 69  | *pFd );.  }whi
f470: 6c 65 28 20 63 6e 74 3e 30 20 26 26 20 72 63 21  le( cnt>0 && rc!
f480: 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63  =SQLITE_OK && rc
f490: 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
f4a0: 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
f4b0: 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61  ../*.** Create a
f4c0: 20 6e 65 77 20 70 61 67 65 20 63 61 63 68 65 20   new page cache 
f4d0: 61 6e 64 20 70 75 74 20 61 20 70 6f 69 6e 74 65  and put a pointe
f4e0: 72 20 74 6f 20 74 68 65 20 70 61 67 65 20 63 61  r to the page ca
f4f0: 63 68 65 20 69 6e 20 2a 70 70 50 61 67 65 72 2e  che in *ppPager.
f500: 0a 2a 2a 20 54 68 65 20 66 69 6c 65 20 74 6f 20  .** The file to 
f510: 62 65 20 63 61 63 68 65 64 20 6e 65 65 64 20 6e  be cached need n
f520: 6f 74 20 65 78 69 73 74 2e 20 20 54 68 65 20 66  ot exist.  The f
f530: 69 6c 65 20 69 73 20 6e 6f 74 20 6c 6f 63 6b 65  ile is not locke
f540: 64 20 75 6e 74 69 6c 0a 2a 2a 20 74 68 65 20 66  d until.** the f
f550: 69 72 73 74 20 63 61 6c 6c 20 74 6f 20 73 71 6c  irst call to sql
f560: 69 74 65 33 50 61 67 65 72 47 65 74 28 29 20 61  ite3PagerGet() a
f570: 6e 64 20 69 73 20 6f 6e 6c 79 20 68 65 6c 64 20  nd is only held 
f580: 6f 70 65 6e 20 75 6e 74 69 6c 20 74 68 65 0a 2a  open until the.*
f590: 2a 20 6c 61 73 74 20 70 61 67 65 20 69 73 20 72  * last page is r
f5a0: 65 6c 65 61 73 65 64 20 75 73 69 6e 67 20 73 71  eleased using sq
f5b0: 6c 69 74 65 33 50 61 67 65 72 55 6e 72 65 66 28  lite3PagerUnref(
f5c0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c  )..**.** If zFil
f5d0: 65 6e 61 6d 65 20 69 73 20 4e 55 4c 4c 20 74 68  ename is NULL th
f5e0: 65 6e 20 61 20 72 61 6e 64 6f 6d 6c 79 2d 6e 61  en a randomly-na
f5f0: 6d 65 64 20 74 65 6d 70 6f 72 61 72 79 20 66 69  med temporary fi
f600: 6c 65 20 69 73 20 63 72 65 61 74 65 64 0a 2a 2a  le is created.**
f610: 20 61 6e 64 20 75 73 65 64 20 61 73 20 74 68 65   and used as the
f620: 20 66 69 6c 65 20 74 6f 20 62 65 20 63 61 63 68   file to be cach
f630: 65 64 2e 20 20 54 68 65 20 66 69 6c 65 20 77 69  ed.  The file wi
f640: 6c 6c 20 62 65 20 64 65 6c 65 74 65 64 0a 2a 2a  ll be deleted.**
f650: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 77   automatically w
f660: 68 65 6e 20 69 74 20 69 73 20 63 6c 6f 73 65 64  hen it is closed
f670: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 46 69 6c 65  ..**.** If zFile
f680: 6e 61 6d 65 20 69 73 20 22 3a 6d 65 6d 6f 72 79  name is ":memory
f690: 3a 22 20 74 68 65 6e 20 61 6c 6c 20 69 6e 66 6f  :" then all info
f6a0: 72 6d 61 74 69 6f 6e 20 69 73 20 68 65 6c 64 20  rmation is held 
f6b0: 69 6e 20 63 61 63 68 65 2e 0a 2a 2a 20 49 74 20  in cache..** It 
f6c0: 69 73 20 6e 65 76 65 72 20 77 72 69 74 74 65 6e  is never written
f6d0: 20 74 6f 20 64 69 73 6b 2e 20 20 54 68 69 73 20   to disk.  This 
f6e0: 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 69  can be used to i
f6f0: 6d 70 6c 65 6d 65 6e 74 20 61 6e 0a 2a 2a 20 69  mplement an.** i
f700: 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
f710: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
f720: 33 50 61 67 65 72 4f 70 65 6e 28 0a 20 20 50 61  3PagerOpen(.  Pa
f730: 67 65 72 20 2a 2a 70 70 50 61 67 65 72 2c 20 20  ger **ppPager,  
f740: 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
f750: 20 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63   the Pager struc
f760: 74 75 72 65 20 68 65 72 65 20 2a 2f 0a 20 20 63  ture here */.  c
f770: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
f780: 6e 61 6d 65 2c 20 20 20 2f 2a 20 4e 61 6d 65 20  name,   /* Name 
f790: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
f7a0: 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
f7b0: 20 20 69 6e 74 20 6e 45 78 74 72 61 2c 20 20 20    int nExtra,   
f7c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
f7d0: 74 72 61 20 62 79 74 65 73 20 61 70 70 65 6e 64  tra bytes append
f7e0: 20 74 6f 20 65 61 63 68 20 69 6e 2d 6d 65 6d 6f   to each in-memo
f7f0: 72 79 20 70 61 67 65 20 2a 2f 0a 20 20 69 6e 74  ry page */.  int
f800: 20 66 6c 61 67 73 20 20 20 20 20 20 20 20 20 20   flags          
f810: 20 20 20 20 20 20 2f 2a 20 66 6c 61 67 73 20 63        /* flags c
f820: 6f 6e 74 72 6f 6c 6c 69 6e 67 20 74 68 69 73 20  ontrolling this 
f830: 66 69 6c 65 20 2a 2f 0a 29 7b 0a 20 20 50 61 67  file */.){.  Pag
f840: 65 72 20 2a 70 50 61 67 65 72 20 3d 20 30 3b 0a  er *pPager = 0;.
f850: 20 20 63 68 61 72 20 2a 7a 46 75 6c 6c 50 61 74    char *zFullPat
f860: 68 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 69 6e 74  hname = 0;.  int
f870: 20 6e 61 6d 65 4c 65 6e 3b 20 20 2f 2a 20 43 6f   nameLen;  /* Co
f880: 6d 70 69 6c 65 72 20 69 73 20 77 72 6f 6e 67 2e  mpiler is wrong.
f890: 20 54 68 69 73 20 69 73 20 61 6c 77 61 79 73 20   This is always 
f8a0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 62 65 66 6f  initialized befo
f8b0: 72 65 20 75 73 65 20 2a 2f 0a 20 20 4f 73 46 69  re use */.  OsFi
f8c0: 6c 65 20 2a 66 64 20 3d 20 30 3b 0a 20 20 69 6e  le *fd = 0;.  in
f8d0: 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
f8e0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
f8f0: 20 74 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20   tempFile = 0;. 
f900: 20 69 6e 74 20 6d 65 6d 44 62 20 3d 20 30 3b 0a   int memDb = 0;.
f910: 20 20 69 6e 74 20 72 65 61 64 4f 6e 6c 79 20 3d    int readOnly =
f920: 20 30 3b 0a 20 20 69 6e 74 20 75 73 65 4a 6f 75   0;.  int useJou
f930: 72 6e 61 6c 20 3d 20 28 66 6c 61 67 73 20 26 20  rnal = (flags & 
f940: 50 41 47 45 52 5f 4f 4d 49 54 5f 4a 4f 55 52 4e  PAGER_OMIT_JOURN
f950: 41 4c 29 3d 3d 30 3b 0a 20 20 69 6e 74 20 6e 6f  AL)==0;.  int no
f960: 52 65 61 64 6c 6f 63 6b 20 3d 20 28 66 6c 61 67  Readlock = (flag
f970: 73 20 26 20 50 41 47 45 52 5f 4e 4f 5f 52 45 41  s & PAGER_NO_REA
f980: 44 4c 4f 43 4b 29 21 3d 30 3b 0a 20 20 63 68 61  DLOCK)!=0;.  cha
f990: 72 20 7a 54 65 6d 70 5b 53 51 4c 49 54 45 5f 54  r zTemp[SQLITE_T
f9a0: 45 4d 50 4e 41 4d 45 5f 53 49 5a 45 5d 3b 0a 23  EMPNAME_SIZE];.#
f9b0: 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
f9c0: 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e 41 47  BLE_MEMORY_MANAG
f9d0: 45 4d 45 4e 54 0a 20 20 2f 2a 20 41 20 6d 61 6c  EMENT.  /* A mal
f9e0: 6c 6f 63 28 29 20 63 61 6e 6e 6f 74 20 66 61 69  loc() cannot fai
f9f0: 6c 20 69 6e 20 73 71 6c 69 74 65 33 54 68 72 65  l in sqlite3Thre
fa00: 61 64 44 61 74 61 28 29 20 61 73 20 6f 6e 65 20  adData() as one 
fa10: 6f 72 20 6d 6f 72 65 20 63 61 6c 6c 73 20 74 6f  or more calls to
fa20: 20 0a 20 20 2a 2a 20 6d 61 6c 6c 6f 63 28 29 20   .  ** malloc() 
fa30: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
fa40: 79 20 62 65 65 6e 20 6d 61 64 65 20 62 79 20 74  y been made by t
fa50: 68 69 73 20 74 68 72 65 61 64 20 62 65 66 6f 72  his thread befor
fa60: 65 20 69 74 20 67 65 74 73 0a 20 20 2a 2a 20 74  e it gets.  ** t
fa70: 6f 20 74 68 69 73 20 70 6f 69 6e 74 2e 20 54 68  o this point. Th
fa80: 69 73 20 6d 65 61 6e 73 20 74 68 65 20 54 68 72  is means the Thr
fa90: 65 61 64 44 61 74 61 20 6d 75 73 74 20 68 61 76  eadData must hav
faa0: 65 20 62 65 65 6e 20 61 6c 6c 6f 63 61 74 65 64  e been allocated
fab0: 20 61 6c 72 65 61 64 79 0a 20 20 2a 2a 20 73 6f   already.  ** so
fac0: 20 74 68 61 74 20 54 68 72 65 61 64 44 61 74 61   that ThreadData
fad0: 2e 6e 41 6c 6c 6f 63 20 63 61 6e 20 62 65 20 73  .nAlloc can be s
fae0: 65 74 2e 20 49 74 20 77 6f 75 6c 64 20 62 65 20  et. It would be 
faf0: 6e 69 63 65 20 74 6f 20 61 73 73 65 72 74 0a 20  nice to assert. 
fb00: 20 2a 2a 20 74 68 61 74 20 54 68 72 65 61 64 44   ** that ThreadD
fb10: 61 74 61 2e 6e 41 6c 6c 6f 63 20 69 73 20 6e 6f  ata.nAlloc is no
fb20: 6e 2d 7a 65 72 6f 2c 20 62 75 74 20 61 6c 61 73  n-zero, but alas
fb30: 20 74 68 69 73 20 62 72 65 61 6b 73 20 74 65 73   this breaks tes
fb40: 74 20 63 61 73 65 73 20 0a 20 20 2a 2a 20 77 72  t cases .  ** wr
fb50: 69 74 74 65 6e 20 74 6f 20 69 6e 76 6f 6b 65 20  itten to invoke 
fb60: 74 68 65 20 70 61 67 65 72 20 64 69 72 65 63 74  the pager direct
fb70: 6c 79 2e 0a 20 20 2a 2f 0a 20 20 54 68 72 65 61  ly..  */.  Threa
fb80: 64 44 61 74 61 20 2a 70 54 73 64 20 3d 20 73 71  dData *pTsd = sq
fb90: 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61 28  lite3ThreadData(
fba0: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73  );.  assert( pTs
fbb0: 64 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  d );.#endif..  /
fbc0: 2a 20 57 65 20 75 73 65 64 20 74 6f 20 74 65 73  * We used to tes
fbd0: 74 20 69 66 20 6d 61 6c 6c 6f 63 28 29 20 68 61  t if malloc() ha
fbe0: 64 20 61 6c 72 65 61 64 79 20 66 61 69 6c 65 64  d already failed
fbf0: 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
fc00: 6e 67 2e 20 0a 20 20 2a 2a 20 42 75 74 20 74 68  ng. .  ** But th
fc10: 65 20 77 61 79 20 74 68 69 73 20 66 75 6e 63 74  e way this funct
fc20: 69 6f 6e 20 69 73 20 75 73 65 64 20 69 6e 20 53  ion is used in S
fc30: 51 4c 69 74 65 20 6d 65 61 6e 73 20 74 68 61 74  QLite means that
fc40: 20 63 61 6e 20 6e 65 76 65 72 0a 20 20 2a 2a 20   can never.  ** 
fc50: 68 61 70 70 65 6e 2e 20 46 75 72 74 68 65 72 6d  happen. Furtherm
fc60: 6f 72 65 2c 20 69 66 20 74 68 65 20 6d 61 6c 6c  ore, if the mall
fc70: 6f 63 2d 66 61 69 6c 65 64 20 66 6c 61 67 20 69  oc-failed flag i
fc80: 73 20 61 6c 72 65 61 64 79 20 73 65 74 2c 20 0a  s already set, .
fc90: 20 20 2a 2a 20 65 69 74 68 65 72 20 74 68 65 20    ** either the 
fca0: 63 61 6c 6c 20 74 6f 20 73 71 6c 69 74 65 53 74  call to sqliteSt
fcb0: 72 44 75 70 28 29 20 6f 72 20 73 71 6c 69 74 65  rDup() or sqlite
fcc0: 4d 61 6c 6c 6f 63 28 29 20 62 65 6c 6f 77 20 77  Malloc() below w
fcd0: 69 6c 6c 0a 20 20 2a 2a 20 66 61 69 6c 20 73 68  ill.  ** fail sh
fce0: 6f 72 74 6c 79 20 61 6e 64 20 53 51 4c 49 54 45  ortly and SQLITE
fcf0: 5f 4e 4f 4d 45 4d 20 72 65 74 75 72 6e 65 64 20  _NOMEM returned 
fd00: 61 6e 79 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 2a  anyway..  */.  *
fd10: 70 70 50 61 67 65 72 20 3d 20 30 3b 0a 0a 20 20  ppPager = 0;..  
fd20: 2f 2a 20 4f 70 65 6e 20 74 68 65 20 70 61 67 65  /* Open the page
fd30: 72 20 66 69 6c 65 20 61 6e 64 20 73 65 74 20 7a  r file and set z
fd40: 46 75 6c 6c 50 61 74 68 6e 61 6d 65 20 74 6f 20  FullPathname to 
fd50: 70 6f 69 6e 74 20 61 74 20 6d 61 6c 6c 6f 63 28  point at malloc(
fd60: 29 65 64 20 0a 20 20 2a 2a 20 6d 65 6d 6f 72 79  )ed .  ** memory
fd70: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
fd80: 63 6f 6d 70 6c 65 74 65 20 66 69 6c 65 6e 61 6d  complete filenam
fd90: 65 20 28 69 2e 65 2e 20 69 6e 63 6c 75 64 69 6e  e (i.e. includin
fda0: 67 20 74 68 65 20 64 69 72 65 63 74 6f 72 79 29  g the directory)
fdb0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 46 69  ..  */.  if( zFi
fdc0: 6c 65 6e 61 6d 65 20 26 26 20 7a 46 69 6c 65 6e  lename && zFilen
fdd0: 61 6d 65 5b 30 5d 20 29 7b 0a 23 69 66 6e 64 65  ame[0] ){.#ifnde
fde0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4d 45  f SQLITE_OMIT_ME
fdf0: 4d 4f 52 59 44 42 0a 20 20 20 20 69 66 28 20 73  MORYDB.    if( s
fe00: 74 72 63 6d 70 28 7a 46 69 6c 65 6e 61 6d 65 2c  trcmp(zFilename,
fe10: 22 3a 6d 65 6d 6f 72 79 3a 22 29 3d 3d 30 20 29  ":memory:")==0 )
fe20: 7b 0a 20 20 20 20 20 20 6d 65 6d 44 62 20 3d 20  {.      memDb = 
fe30: 31 3b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61  1;.      zFullPa
fe40: 74 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  thname = sqliteS
fe50: 74 72 44 75 70 28 22 22 29 3b 0a 20 20 20 20 7d  trDup("");.    }
fe60: 65 6c 73 65 0a 23 65 6e 64 69 66 0a 20 20 20 20  else.#endif.    
fe70: 7b 0a 20 20 20 20 20 20 7a 46 75 6c 6c 50 61 74  {.      zFullPat
fe80: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
fe90: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
fea0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
feb0: 69 66 28 20 7a 46 75 6c 6c 50 61 74 68 6e 61 6d  if( zFullPathnam
fec0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20  e ){.        rc 
fed0: 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e 52  = sqlite3OsOpenR
fee0: 65 61 64 57 72 69 74 65 28 7a 46 75 6c 6c 50 61  eadWrite(zFullPa
fef0: 74 68 6e 61 6d 65 2c 20 26 66 64 2c 20 26 72 65  thname, &fd, &re
ff00: 61 64 4f 6e 6c 79 29 3b 0a 20 20 20 20 20 20 20  adOnly);.       
ff10: 20 61 73 73 65 72 74 28 20 72 63 21 3d 53 51 4c   assert( rc!=SQL
ff20: 49 54 45 5f 4f 4b 20 7c 7c 20 66 64 20 29 3b 0a  ITE_OK || fd );.
ff30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
ff40: 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
ff50: 73 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e  sqlite3PagerOpen
ff60: 74 65 6d 70 28 26 66 64 29 3b 0a 20 20 20 20 73  temp(&fd);.    s
ff70: 71 6c 69 74 65 33 4f 73 54 65 6d 70 46 69 6c 65  qlite3OsTempFile
ff80: 4e 61 6d 65 28 7a 54 65 6d 70 29 3b 0a 20 20 20  Name(zTemp);.   
ff90: 20 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 54 65   zFilename = zTe
ffa0: 6d 70 3b 0a 20 20 20 20 7a 46 75 6c 6c 50 61 74  mp;.    zFullPat
ffb0: 68 6e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4f  hname = sqlite3O
ffc0: 73 46 75 6c 6c 50 61 74 68 6e 61 6d 65 28 7a 46  sFullPathname(zF
ffd0: 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 69 66  ilename);.    if
ffe0: 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
fff0: 29 7b 0a 20 20 20 20 20 20 74 65 6d 70 46 69 6c  ){.      tempFil
10000 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  e = 1;.    }.  }
10010 0a 0a 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 20  ..  /* Allocate 
10020 74 68 65 20 50 61 67 65 72 20 73 74 72 75 63 74  the Pager struct
10030 75 72 65 2e 20 41 73 20 70 61 72 74 20 6f 66 20  ure. As part of 
10040 74 68 65 20 73 61 6d 65 20 61 6c 6c 6f 63 61 74  the same allocat
10050 69 6f 6e 2c 20 61 6c 6c 6f 63 61 74 65 0a 20 20  ion, allocate.  
10060 2a 2a 20 73 70 61 63 65 20 66 6f 72 20 74 68 65  ** space for the
10070 20 66 75 6c 6c 20 70 61 74 68 73 20 6f 66 20 74   full paths of t
10080 68 65 20 66 69 6c 65 2c 20 64 69 72 65 63 74 6f  he file, directo
10090 72 79 20 61 6e 64 20 6a 6f 75 72 6e 61 6c 20 0a  ry and journal .
100a0 20 20 2a 2a 20 28 50 61 67 65 72 2e 7a 46 69 6c    ** (Pager.zFil
100b0 65 6e 61 6d 65 2c 20 50 61 67 65 72 2e 7a 44 69  ename, Pager.zDi
100c0 72 65 63 74 6f 72 79 20 61 6e 64 20 50 61 67 65  rectory and Page
100d0 72 2e 7a 4a 6f 75 72 6e 61 6c 29 2e 0a 20 20 2a  r.zJournal)..  *
100e0 2f 0a 20 20 69 66 28 20 7a 46 75 6c 6c 50 61 74  /.  if( zFullPat
100f0 68 6e 61 6d 65 20 29 7b 0a 20 20 20 20 6e 61 6d  hname ){.    nam
10100 65 4c 65 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 46  eLen = strlen(zF
10110 75 6c 6c 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20  ullPathname);.  
10120 20 20 70 50 61 67 65 72 20 3d 20 73 71 6c 69 74    pPager = sqlit
10130 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
10140 2a 70 50 61 67 65 72 29 20 2b 20 6e 61 6d 65 4c  *pPager) + nameL
10150 65 6e 2a 33 20 2b 20 33 30 20 29 3b 0a 20 20 20  en*3 + 30 );.   
10160 20 69 66 28 20 70 50 61 67 65 72 20 26 26 20 72   if( pPager && r
10170 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
10180 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 70 54        pPager->pT
10190 6d 70 53 70 61 63 65 20 3d 20 28 63 68 61 72 20  mpSpace = (char 
101a0 2a 29 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  *)sqliteMallocRa
101b0 77 28 53 51 4c 49 54 45 5f 44 45 46 41 55 4c 54  w(SQLITE_DEFAULT
101c0 5f 50 41 47 45 5f 53 49 5a 45 29 3b 0a 20 20 20  _PAGE_SIZE);.   
101d0 20 7d 0a 20 20 7d 0a 0a 0a 20 20 2f 2a 20 49 66   }.  }...  /* If
101e0 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 65   an error occure
101f0 64 20 69 6e 20 65 69 74 68 65 72 20 6f 66 20 74  d in either of t
10200 68 65 20 62 6c 6f 63 6b 73 20 61 62 6f 76 65 2c  he blocks above,
10210 20 66 72 65 65 20 74 68 65 20 6d 65 6d 6f 72 79   free the memory
10220 20 0a 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74   .  ** pointed t
10230 6f 20 62 79 20 7a 46 75 6c 6c 50 61 74 68 6e 61  o by zFullPathna
10240 6d 65 2c 20 66 72 65 65 20 74 68 65 20 50 61 67  me, free the Pag
10250 65 72 20 73 74 72 75 63 74 75 72 65 20 61 6e 64  er structure and
10260 20 63 6c 6f 73 65 20 74 68 65 20 0a 20 20 2a 2a   close the .  **
10270 20 66 69 6c 65 2e 20 53 69 6e 63 65 20 74 68 65   file. Since the
10280 20 70 61 67 65 72 20 69 73 20 6e 6f 74 20 61 6c   pager is not al
10290 6c 6f 63 61 74 65 64 20 74 68 65 72 65 20 69 73  located there is
102a0 20 6e 6f 20 6e 65 65 64 20 74 6f 20 73 65 74 20   no need to set 
102b0 0a 20 20 2a 2a 20 61 6e 79 20 50 61 67 65 72 2e  .  ** any Pager.
102c0 65 72 72 4d 61 73 6b 20 76 61 72 69 61 62 6c 65  errMask variable
102d0 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21 70  s..  */.  if( !p
102e0 50 61 67 65 72 20 7c 7c 20 21 7a 46 75 6c 6c 50  Pager || !zFullP
102f0 61 74 68 6e 61 6d 65 20 7c 7c 20 21 70 50 61 67  athname || !pPag
10300 65 72 2d 3e 70 54 6d 70 53 70 61 63 65 20 7c 7c  er->pTmpSpace ||
10310 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
10320 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 4f 73 43  {.    sqlite3OsC
10330 6c 6f 73 65 28 26 66 64 29 3b 0a 20 20 20 20 73  lose(&fd);.    s
10340 71 6c 69 74 65 46 72 65 65 28 7a 46 75 6c 6c 50  qliteFree(zFullP
10350 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 73 71  athname);.    sq
10360 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72 29  liteFree(pPager)
10370 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 28 72  ;.    return ((r
10380 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 29 3f 53 51  c==SQLITE_OK)?SQ
10390 4c 49 54 45 5f 4e 4f 4d 45 4d 3a 72 63 29 3b 0a  LITE_NOMEM:rc);.
103a0 20 20 7d 0a 0a 20 20 50 41 47 45 52 54 52 41 43    }..  PAGERTRAC
103b0 45 33 28 22 4f 50 45 4e 20 25 64 20 25 73 5c 6e  E3("OPEN %d %s\n
103c0 22 2c 20 46 49 4c 45 48 41 4e 44 4c 45 49 44 28  ", FILEHANDLEID(
103d0 66 64 29 2c 20 7a 46 75 6c 6c 50 61 74 68 6e 61  fd), zFullPathna
103e0 6d 65 29 3b 0a 20 20 49 4f 54 52 41 43 45 28 28  me);.  IOTRACE((
103f0 22 4f 50 45 4e 20 25 70 20 25 73 5c 6e 22 2c 20  "OPEN %p %s\n", 
10400 70 50 61 67 65 72 2c 20 7a 46 75 6c 6c 50 61 74  pPager, zFullPat
10410 68 6e 61 6d 65 29 29 0a 20 20 70 50 61 67 65 72  hname)).  pPager
10420 2d 3e 7a 46 69 6c 65 6e 61 6d 65 20 3d 20 28 63  ->zFilename = (c
10430 68 61 72 2a 29 26 70 50 61 67 65 72 5b 31 5d 3b  har*)&pPager[1];
10440 0a 20 20 70 50 61 67 65 72 2d 3e 7a 44 69 72 65  .  pPager->zDire
10450 63 74 6f 72 79 20 3d 20 26 70 50 61 67 65 72 2d  ctory = &pPager-
10460 3e 7a 46 69 6c 65 6e 61 6d 65 5b 6e 61 6d 65 4c  >zFilename[nameL
10470 65 6e 2b 31 5d 3b 0a 20 20 70 50 61 67 65 72 2d  en+1];.  pPager-
10480 3e 7a 4a 6f 75 72 6e 61 6c 20 3d 20 26 70 50 61  >zJournal = &pPa
10490 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 5b  ger->zDirectory[
104a0 6e 61 6d 65 4c 65 6e 2b 31 5d 3b 0a 20 20 6d 65  nameLen+1];.  me
104b0 6d 63 70 79 28 70 50 61 67 65 72 2d 3e 7a 46 69  mcpy(pPager->zFi
104c0 6c 65 6e 61 6d 65 2c 20 7a 46 75 6c 6c 50 61 74  lename, zFullPat
104d0 68 6e 61 6d 65 2c 20 6e 61 6d 65 4c 65 6e 2b 31  hname, nameLen+1
104e0 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67  );.  memcpy(pPag
104f0 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79 2c 20  er->zDirectory, 
10500 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 2c 20 6e  zFullPathname, n
10510 61 6d 65 4c 65 6e 2b 31 29 3b 0a 0a 20 20 66 6f  ameLen+1);..  fo
10520 72 28 69 3d 6e 61 6d 65 4c 65 6e 3b 20 69 3e 30  r(i=nameLen; i>0
10530 20 26 26 20 70 50 61 67 65 72 2d 3e 7a 44 69 72   && pPager->zDir
10540 65 63 74 6f 72 79 5b 69 2d 31 5d 21 3d 27 2f 27  ectory[i-1]!='/'
10550 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
10560 3e 30 20 29 20 70 50 61 67 65 72 2d 3e 7a 44 69  >0 ) pPager->zDi
10570 72 65 63 74 6f 72 79 5b 69 2d 31 5d 20 3d 20 30  rectory[i-1] = 0
10580 3b 0a 20 20 6d 65 6d 63 70 79 28 70 50 61 67 65  ;.  memcpy(pPage
10590 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 7a 46 75  r->zJournal, zFu
105a0 6c 6c 50 61 74 68 6e 61 6d 65 2c 6e 61 6d 65 4c  llPathname,nameL
105b0 65 6e 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  en);.  sqliteFre
105c0 65 28 7a 46 75 6c 6c 50 61 74 68 6e 61 6d 65 29  e(zFullPathname)
105d0 3b 0a 20 20 6d 65 6d 63 70 79 28 26 70 50 61 67  ;.  memcpy(&pPag
105e0 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 5b 6e 61 6d  er->zJournal[nam
105f0 65 4c 65 6e 5d 2c 20 22 2d 6a 6f 75 72 6e 61 6c  eLen], "-journal
10600 22 2c 73 69 7a 65 6f 66 28 22 2d 6a 6f 75 72 6e  ",sizeof("-journ
10610 61 6c 22 29 29 3b 0a 20 20 70 50 61 67 65 72 2d  al"));.  pPager-
10620 3e 66 64 20 3d 20 66 64 3b 0a 20 20 2f 2a 20 70  >fd = fd;.  /* p
10630 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70  Pager->journalOp
10640 65 6e 20 3d 20 30 3b 20 2a 2f 0a 20 20 70 50 61  en = 0; */.  pPa
10650 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20  ger->useJournal 
10660 3d 20 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20  = useJournal && 
10670 21 6d 65 6d 44 62 3b 0a 20 20 70 50 61 67 65 72  !memDb;.  pPager
10680 2d 3e 6e 6f 52 65 61 64 6c 6f 63 6b 20 3d 20 6e  ->noReadlock = n
10690 6f 52 65 61 64 6c 6f 63 6b 20 26 26 20 72 65 61  oReadlock && rea
106a0 64 4f 6e 6c 79 3b 0a 20 20 2f 2a 20 70 50 61 67  dOnly;.  /* pPag
106b0 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20 30  er->stmtOpen = 0
106c0 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72  ; */.  /* pPager
106d0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
106e0 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65 72 2d   */.  /* pPager-
106f0 3e 6e 52 65 66 20 3d 20 30 3b 20 2a 2f 0a 20 20  >nRef = 0; */.  
10700 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
10710 20 6d 65 6d 44 62 2d 31 3b 0a 20 20 70 50 61 67   memDb-1;.  pPag
10720 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 3d 20 53  er->pageSize = S
10730 51 4c 49 54 45 5f 44 45 46 41 55 4c 54 5f 50 41  QLITE_DEFAULT_PA
10740 47 45 5f 53 49 5a 45 3b 0a 20 20 2f 2a 20 70 50  GE_SIZE;.  /* pP
10750 61 67 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 3d  ager->stmtSize =
10760 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67   0; */.  /* pPag
10770 65 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20  er->stmtJSize = 
10780 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  0; */.  /* pPage
10790 72 2d 3e 6e 50 61 67 65 20 3d 20 30 3b 20 2a 2f  r->nPage = 0; */
107a0 0a 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 61 67  .  pPager->mxPag
107b0 65 20 3d 20 31 30 30 3b 0a 20 20 70 50 61 67 65  e = 100;.  pPage
107c0 72 2d 3e 6d 78 50 67 6e 6f 20 3d 20 53 51 4c 49  r->mxPgno = SQLI
107d0 54 45 5f 4d 41 58 5f 50 41 47 45 5f 43 4f 55 4e  TE_MAX_PAGE_COUN
107e0 54 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47  T;.  assert( PAG
107f0 45 52 5f 55 4e 4c 4f 43 4b 3d 3d 30 20 29 3b 0a  ER_UNLOCK==0 );.
10800 20 20 2f 2a 20 70 50 61 67 65 72 2d 3e 73 74 61    /* pPager->sta
10810 74 65 20 3d 20 50 41 47 45 52 5f 55 4e 4c 4f 43  te = PAGER_UNLOC
10820 4b 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61 67 65  K; */.  /* pPage
10830 72 2d 3e 65 72 72 4d 61 73 6b 20 3d 20 30 3b 20  r->errMask = 0; 
10840 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 74 65 6d  */.  pPager->tem
10850 70 46 69 6c 65 20 3d 20 74 65 6d 70 46 69 6c 65  pFile = tempFile
10860 3b 0a 20 20 61 73 73 65 72 74 28 20 74 65 6d 70  ;.  assert( temp
10870 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  File==PAGER_LOCK
10880 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20 0a  INGMODE_NORMAL .
10890 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74 65 6d            || tem
108a0 70 46 69 6c 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  pFile==PAGER_LOC
108b0 4b 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49  KINGMODE_EXCLUSI
108c0 56 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  VE );.  assert( 
108d0 50 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44  PAGER_LOCKINGMOD
108e0 45 5f 45 58 43 4c 55 53 49 56 45 3d 3d 31 20 29  E_EXCLUSIVE==1 )
108f0 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c  ;.  pPager->excl
10900 75 73 69 76 65 4d 6f 64 65 20 3d 20 74 65 6d 70  usiveMode = temp
10910 46 69 6c 65 3b 20 0a 20 20 70 50 61 67 65 72 2d  File; .  pPager-
10920 3e 6d 65 6d 44 62 20 3d 20 6d 65 6d 44 62 3b 0a  >memDb = memDb;.
10930 20 20 70 50 61 67 65 72 2d 3e 72 65 61 64 4f 6e    pPager->readOn
10940 6c 79 20 3d 20 72 65 61 64 4f 6e 6c 79 3b 0a 20  ly = readOnly;. 
10950 20 2f 2a 20 70 50 61 67 65 72 2d 3e 6e 65 65 64   /* pPager->need
10960 53 79 6e 63 20 3d 20 30 3b 20 2a 2f 0a 20 20 70  Sync = 0; */.  p
10970 50 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 3d 20  Pager->noSync = 
10980 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
10990 20 7c 7c 20 21 75 73 65 4a 6f 75 72 6e 61 6c 3b   || !useJournal;
109a0 0a 20 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c 53  .  pPager->fullS
109b0 79 6e 63 20 3d 20 28 70 50 61 67 65 72 2d 3e 6e  ync = (pPager->n
109c0 6f 53 79 6e 63 3f 30 3a 31 29 3b 0a 20 20 2f 2a  oSync?0:1);.  /*
109d0 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20   pPager->pFirst 
109e0 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70 50 61  = 0; */.  /* pPa
109f0 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63 65  ger->pFirstSynce
10a00 64 20 3d 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 70  d = 0; */.  /* p
10a10 50 61 67 65 72 2d 3e 70 4c 61 73 74 20 3d 20 30  Pager->pLast = 0
10a20 3b 20 2a 2f 0a 20 20 70 50 61 67 65 72 2d 3e 6e  ; */.  pPager->n
10a30 45 78 74 72 61 20 3d 20 46 4f 52 43 45 5f 41 4c  Extra = FORCE_AL
10a40 49 47 4e 4d 45 4e 54 28 6e 45 78 74 72 61 29 3b  IGNMENT(nExtra);
10a50 0a 20 20 61 73 73 65 72 74 28 66 64 7c 7c 6d 65  .  assert(fd||me
10a60 6d 44 62 29 3b 0a 20 20 69 66 28 20 21 6d 65 6d  mDb);.  if( !mem
10a70 44 62 20 29 7b 0a 20 20 20 20 73 65 74 53 65 63  Db ){.    setSec
10a80 74 6f 72 53 69 7a 65 28 70 50 61 67 65 72 29 3b  torSize(pPager);
10a90 0a 20 20 7d 0a 20 20 2f 2a 20 70 50 61 67 65 72  .  }.  /* pPager
10aa0 2d 3e 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d  ->pBusyHandler =
10ab0 20 30 3b 20 2a 2f 0a 20 20 2f 2a 20 6d 65 6d 73   0; */.  /* mems
10ac0 65 74 28 70 50 61 67 65 72 2d 3e 61 48 61 73 68  et(pPager->aHash
10ad0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 67  , 0, sizeof(pPag
10ae0 65 72 2d 3e 61 48 61 73 68 29 29 3b 20 2a 2f 0a  er->aHash)); */.
10af0 20 20 2a 70 70 50 61 67 65 72 20 3d 20 70 50 61    *ppPager = pPa
10b00 67 65 72 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  ger;.#ifdef SQLI
10b10 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59  TE_ENABLE_MEMORY
10b20 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20 20 70 50  _MANAGEMENT.  pP
10b30 61 67 65 72 2d 3e 70 4e 65 78 74 20 3d 20 70 54  ager->pNext = pT
10b40 73 64 2d 3e 70 50 61 67 65 72 3b 0a 20 20 70 54  sd->pPager;.  pT
10b50 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70 50 61  sd->pPager = pPa
10b60 67 65 72 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65  ger;.#endif.  re
10b70 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
10b80 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65  }../*.** Set the
10b90 20 62 75 73 79 20 68 61 6e 64 6c 65 72 20 66 75   busy handler fu
10ba0 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  nction..*/.void 
10bb0 73 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 42  sqlite3PagerSetB
10bc0 75 73 79 68 61 6e 64 6c 65 72 28 50 61 67 65 72  usyhandler(Pager
10bd0 20 2a 70 50 61 67 65 72 2c 20 42 75 73 79 48 61   *pPager, BusyHa
10be0 6e 64 6c 65 72 20 2a 70 42 75 73 79 48 61 6e 64  ndler *pBusyHand
10bf0 6c 65 72 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e  ler){.  pPager->
10c00 70 42 75 73 79 48 61 6e 64 6c 65 72 20 3d 20 70  pBusyHandler = p
10c10 42 75 73 79 48 61 6e 64 6c 65 72 3b 0a 7d 0a 0a  BusyHandler;.}..
10c20 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
10c30 73 74 72 75 63 74 6f 72 20 66 6f 72 20 74 68 69  structor for thi
10c40 73 20 70 61 67 65 72 2e 20 20 49 66 20 6e 6f 74  s pager.  If not
10c50 20 4e 55 4c 4c 2c 20 74 68 65 20 64 65 73 74 72   NULL, the destr
10c60 75 63 74 6f 72 20 69 73 20 63 61 6c 6c 65 64 0a  uctor is called.
10c70 2a 2a 20 77 68 65 6e 20 74 68 65 20 72 65 66 65  ** when the refe
10c80 72 65 6e 63 65 20 63 6f 75 6e 74 20 6f 6e 20 65  rence count on e
10c90 61 63 68 20 70 61 67 65 20 72 65 61 63 68 65 73  ach page reaches
10ca0 20 7a 65 72 6f 2e 20 20 54 68 65 20 64 65 73 74   zero.  The dest
10cb0 72 75 63 74 6f 72 20 63 61 6e 0a 2a 2a 20 62 65  ructor can.** be
10cc0 20 75 73 65 64 20 74 6f 20 63 6c 65 61 6e 20 75   used to clean u
10cd0 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  p information in
10ce0 20 74 68 65 20 65 78 74 72 61 20 73 65 67 6d 65   the extra segme
10cf0 6e 74 20 61 70 70 65 6e 64 65 64 20 74 6f 20 65  nt appended to e
10d00 61 63 68 20 70 61 67 65 2e 0a 2a 2a 0a 2a 2a 20  ach page..**.** 
10d10 54 68 65 20 64 65 73 74 72 75 63 74 6f 72 20 69  The destructor i
10d20 73 20 6e 6f 74 20 63 61 6c 6c 65 64 20 61 73 20  s not called as 
10d30 61 20 72 65 73 75 6c 74 20 73 71 6c 69 74 65 33  a result sqlite3
10d40 50 61 67 65 72 43 6c 6f 73 65 28 29 2e 20 20 0a  PagerClose().  .
10d50 2a 2a 20 44 65 73 74 72 75 63 74 6f 72 73 20 61  ** Destructors a
10d60 72 65 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 62  re only called b
10d70 79 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e  y sqlite3PagerUn
10d80 72 65 66 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ref()..*/.void s
10d90 71 6c 69 74 65 33 50 61 67 65 72 53 65 74 44 65  qlite3PagerSetDe
10da0 73 74 72 75 63 74 6f 72 28 50 61 67 65 72 20 2a  structor(Pager *
10db0 70 50 61 67 65 72 2c 20 76 6f 69 64 20 28 2a 78  pPager, void (*x
10dc0 44 65 73 63 29 28 44 62 50 61 67 65 2a 2c 69 6e  Desc)(DbPage*,in
10dd0 74 29 29 7b 0a 20 20 70 50 61 67 65 72 2d 3e 78  t)){.  pPager->x
10de0 44 65 73 74 72 75 63 74 6f 72 20 3d 20 78 44 65  Destructor = xDe
10df0 73 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  sc;.}../*.** Set
10e00 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
10e10 65 72 20 66 6f 72 20 74 68 69 73 20 70 61 67 65  er for this page
10e20 72 2e 20 20 49 66 20 6e 6f 74 20 4e 55 4c 4c 2c  r.  If not NULL,
10e30 20 74 68 65 20 72 65 69 6e 69 74 69 61 6c 69 7a   the reinitializ
10e40 65 72 0a 2a 2a 20 69 73 20 63 61 6c 6c 65 64 20  er.** is called 
10e50 77 68 65 6e 20 74 68 65 20 63 6f 6e 74 65 6e 74  when the content
10e60 20 6f 66 20 61 20 70 61 67 65 20 69 6e 20 63 61   of a page in ca
10e70 63 68 65 20 69 73 20 72 65 73 74 6f 72 65 64 20  che is restored 
10e80 74 6f 20 69 74 73 20 6f 72 69 67 69 6e 61 6c 0a  to its original.
10e90 2a 2a 20 76 61 6c 75 65 20 61 73 20 61 20 72 65  ** value as a re
10ea0 73 75 6c 74 20 6f 66 20 61 20 72 6f 6c 6c 62 61  sult of a rollba
10eb0 63 6b 2e 20 20 54 68 65 20 63 61 6c 6c 62 61 63  ck.  The callbac
10ec0 6b 20 67 69 76 65 73 20 68 69 67 68 65 72 2d 6c  k gives higher-l
10ed0 65 76 65 6c 20 63 6f 64 65 0a 2a 2a 20 61 6e 20  evel code.** an 
10ee0 6f 70 70 6f 72 74 75 6e 69 74 79 20 74 6f 20 72  opportunity to r
10ef0 65 73 74 6f 72 65 20 74 68 65 20 45 58 54 52 41  estore the EXTRA
10f00 20 73 65 63 74 69 6f 6e 20 74 6f 20 61 67 72 65   section to agre
10f10 65 20 77 69 74 68 20 74 68 65 20 72 65 73 74 6f  e with the resto
10f20 72 65 64 0a 2a 2a 20 70 61 67 65 20 64 61 74 61  red.** page data
10f30 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
10f40 33 50 61 67 65 72 53 65 74 52 65 69 6e 69 74 65  3PagerSetReinite
10f50 72 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  r(Pager *pPager,
10f60 20 76 6f 69 64 20 28 2a 78 52 65 69 6e 69 74 29   void (*xReinit)
10f70 28 44 62 50 61 67 65 2a 2c 69 6e 74 29 29 7b 0a  (DbPage*,int)){.
10f80 20 20 70 50 61 67 65 72 2d 3e 78 52 65 69 6e 69    pPager->xReini
10f90 74 65 72 20 3d 20 78 52 65 69 6e 69 74 3b 0a 7d  ter = xReinit;.}
10fa0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
10fb0 70 61 67 65 20 73 69 7a 65 2e 20 20 52 65 74 75  page size.  Retu
10fc0 72 6e 20 74 68 65 20 6e 65 77 20 73 69 7a 65 2e  rn the new size.
10fd0 20 20 49 66 20 74 68 65 20 73 75 67 67 65 73 74    If the suggest
10fe0 20 6e 65 77 20 70 61 67 65 0a 2a 2a 20 73 69 7a   new page.** siz
10ff0 65 20 69 73 20 69 6e 61 70 70 72 6f 70 72 69 61  e is inappropria
11000 74 65 2c 20 74 68 65 6e 20 61 6e 20 61 6c 74 65  te, then an alte
11010 72 6e 61 74 69 76 65 20 70 61 67 65 20 73 69 7a  rnative page siz
11020 65 20 69 73 20 73 65 6c 65 63 74 65 64 0a 2a 2a  e is selected.**
11030 20 61 6e 64 20 72 65 74 75 72 6e 65 64 2e 0a 2a   and returned..*
11040 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
11050 65 72 53 65 74 50 61 67 65 73 69 7a 65 28 50 61  erSetPagesize(Pa
11060 67 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74  ger *pPager, int
11070 20 70 61 67 65 53 69 7a 65 29 7b 0a 20 20 61 73   pageSize){.  as
11080 73 65 72 74 28 20 70 61 67 65 53 69 7a 65 3e 3d  sert( pageSize>=
11090 35 31 32 20 26 26 20 70 61 67 65 53 69 7a 65 3c  512 && pageSize<
110a0 3d 53 51 4c 49 54 45 5f 4d 41 58 5f 50 41 47 45  =SQLITE_MAX_PAGE
110b0 5f 53 49 5a 45 20 29 3b 0a 20 20 69 66 28 20 21  _SIZE );.  if( !
110c0 70 50 61 67 65 72 2d 3e 6d 65 6d 44 62 20 26 26  pPager->memDb &&
110d0 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d 3d 30   pPager->nRef==0
110e0 20 29 7b 0a 20 20 20 20 70 61 67 65 72 5f 72 65   ){.    pager_re
110f0 73 65 74 28 70 50 61 67 65 72 29 3b 0a 20 20 20  set(pPager);.   
11100 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
11110 65 20 3d 20 70 61 67 65 53 69 7a 65 3b 0a 20 20  e = pageSize;.  
11120 20 20 70 50 61 67 65 72 2d 3e 70 54 6d 70 53 70    pPager->pTmpSp
11130 61 63 65 20 3d 20 73 71 6c 69 74 65 33 52 65 61  ace = sqlite3Rea
11140 6c 6c 6f 63 4f 72 46 72 65 65 28 70 50 61 67 65  llocOrFree(pPage
11150 72 2d 3e 70 54 6d 70 53 70 61 63 65 2c 20 70 61  r->pTmpSpace, pa
11160 67 65 53 69 7a 65 29 3b 0a 20 20 7d 0a 20 20 72  geSize);.  }.  r
11170 65 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 70 61  eturn pPager->pa
11180 67 65 53 69 7a 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  geSize;.}../*.**
11190 20 41 74 74 65 6d 70 74 20 74 6f 20 73 65 74 20   Attempt to set 
111a0 74 68 65 20 6d 61 78 69 6d 75 6d 20 64 61 74 61  the maximum data
111b0 62 61 73 65 20 70 61 67 65 20 63 6f 75 6e 74 20  base page count 
111c0 69 66 20 6d 78 50 61 67 65 20 69 73 20 70 6f 73  if mxPage is pos
111d0 69 74 69 76 65 2e 20 0a 2a 2a 20 4d 61 6b 65 20  itive. .** Make 
111e0 6e 6f 20 63 68 61 6e 67 65 73 20 69 66 20 6d 78  no changes if mx
111f0 50 61 67 65 20 69 73 20 7a 65 72 6f 20 6f 72 20  Page is zero or 
11200 6e 65 67 61 74 69 76 65 2e 20 20 41 6e 64 20 6e  negative.  And n
11210 65 76 65 72 20 72 65 64 75 63 65 20 74 68 65 0a  ever reduce the.
11220 2a 2a 20 6d 61 78 69 6d 75 6d 20 70 61 67 65 20  ** maximum page 
11230 63 6f 75 6e 74 20 62 65 6c 6f 77 20 74 68 65 20  count below the 
11240 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f 66 20  current size of 
11250 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  the database..**
11260 0a 2a 2a 20 52 65 67 61 72 64 6c 65 73 73 20 6f  .** Regardless o
11270 66 20 6d 78 50 61 67 65 2c 20 72 65 74 75 72 6e  f mxPage, return
11280 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 61 78   the current max
11290 69 6d 75 6d 20 70 61 67 65 20 63 6f 75 6e 74 2e  imum page count.
112a0 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
112b0 61 67 65 72 4d 61 78 50 61 67 65 43 6f 75 6e 74  agerMaxPageCount
112c0 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20  (Pager *pPager, 
112d0 69 6e 74 20 6d 78 50 61 67 65 29 7b 0a 20 20 69  int mxPage){.  i
112e0 66 28 20 6d 78 50 61 67 65 3e 30 20 29 7b 0a 20  f( mxPage>0 ){. 
112f0 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50 67 6e     pPager->mxPgn
11300 6f 20 3d 20 6d 78 50 61 67 65 3b 0a 20 20 7d 0a  o = mxPage;.  }.
11310 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61    sqlite3PagerPa
11320 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
11330 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
11340 2d 3e 6d 78 50 67 6e 6f 3b 0a 7d 0a 0a 2f 2a 0a  ->mxPgno;.}../*.
11350 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
11360 20 73 65 74 20 6f 66 20 72 6f 75 74 69 6e 65 73   set of routines
11370 20 61 72 65 20 75 73 65 64 20 74 6f 20 64 69 73   are used to dis
11380 61 62 6c 65 20 74 68 65 20 73 69 6d 75 6c 61 74  able the simulat
11390 65 64 0a 2a 2a 20 49 2f 4f 20 65 72 72 6f 72 20  ed.** I/O error 
113a0 6d 65 63 68 61 6e 69 73 6d 2e 20 20 54 68 65 73  mechanism.  Thes
113b0 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 75  e routines are u
113c0 73 65 64 20 74 6f 20 61 76 6f 69 64 20 73 69 6d  sed to avoid sim
113d0 75 6c 61 74 65 64 0a 2a 2a 20 65 72 72 6f 72 73  ulated.** errors
113e0 20 69 6e 20 70 6c 61 63 65 73 20 77 68 65 72 65   in places where
113f0 20 77 65 20 64 6f 20 6e 6f 74 20 63 61 72 65 20   we do not care 
11400 61 62 6f 75 74 20 65 72 72 6f 72 73 2e 0a 2a 2a  about errors..**
11410 0a 2a 2a 20 55 6e 6c 65 73 73 20 2d 44 53 51 4c  .** Unless -DSQL
11420 49 54 45 5f 54 45 53 54 3d 31 20 69 73 20 75 73  ITE_TEST=1 is us
11430 65 64 2c 20 74 68 65 73 65 20 72 6f 75 74 69 6e  ed, these routin
11440 65 73 20 61 72 65 20 61 6c 6c 20 6e 6f 2d 6f 70  es are all no-op
11450 73 0a 2a 2a 20 61 6e 64 20 67 65 6e 65 72 61 74  s.** and generat
11460 65 20 6e 6f 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69  e no code..*/.#i
11470 66 64 65 66 20 53 51 4c 49 54 45 5f 54 45 53 54  fdef SQLITE_TEST
11480 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
11490 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e  te3_io_error_pen
114a0 64 69 6e 67 3b 0a 65 78 74 65 72 6e 20 69 6e 74  ding;.extern int
114b0 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f   sqlite3_io_erro
114c0 72 5f 68 69 74 3b 0a 73 74 61 74 69 63 20 69 6e  r_hit;.static in
114d0 74 20 73 61 76 65 64 5f 63 6e 74 3b 0a 76 6f 69  t saved_cnt;.voi
114e0 64 20 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61  d disable_simula
114f0 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28 76 6f  ted_io_errors(vo
11500 69 64 29 7b 0a 20 20 73 61 76 65 64 5f 63 6e 74  id){.  saved_cnt
11510 20 3d 20 73 71 6c 69 74 65 33 5f 69 6f 5f 65 72   = sqlite3_io_er
11520 72 6f 72 5f 70 65 6e 64 69 6e 67 3b 0a 20 20 73  ror_pending;.  s
11530 71 6c 69 74 65 33 5f 69 6f 5f 65 72 72 6f 72 5f  qlite3_io_error_
11540 70 65 6e 64 69 6e 67 20 3d 20 2d 31 3b 0a 7d 0a  pending = -1;.}.
11550 76 6f 69 64 20 65 6e 61 62 6c 65 5f 73 69 6d 75  void enable_simu
11560 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72 73 28  lated_io_errors(
11570 76 6f 69 64 29 7b 0a 20 20 73 71 6c 69 74 65 33  void){.  sqlite3
11580 5f 69 6f 5f 65 72 72 6f 72 5f 70 65 6e 64 69 6e  _io_error_pendin
11590 67 20 3d 20 73 61 76 65 64 5f 63 6e 74 3b 0a 7d  g = saved_cnt;.}
115a0 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20  .#else.# define 
115b0 64 69 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65  disable_simulate
115c0 64 5f 69 6f 5f 65 72 72 6f 72 73 28 29 0a 23 20  d_io_errors().# 
115d0 64 65 66 69 6e 65 20 65 6e 61 62 6c 65 5f 73 69  define enable_si
115e0 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72 6f 72  mulated_io_error
115f0 73 28 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  s().#endif../*.*
11600 2a 20 52 65 61 64 20 74 68 65 20 66 69 72 73 74  * Read the first
11610 20 4e 20 62 79 74 65 73 20 66 72 6f 6d 20 74 68   N bytes from th
11620 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74  e beginning of t
11630 68 65 20 66 69 6c 65 20 69 6e 74 6f 20 6d 65 6d  he file into mem
11640 6f 72 79 0a 2a 2a 20 74 68 61 74 20 70 44 65 73  ory.** that pDes
11650 74 20 70 6f 69 6e 74 73 20 74 6f 2e 20 0a 2a 2a  t points to. .**
11660 0a 2a 2a 20 4e 6f 20 65 72 72 6f 72 20 63 68 65  .** No error che
11670 63 6b 69 6e 67 20 69 73 20 64 6f 6e 65 2e 20 54  cking is done. T
11680 68 65 20 72 61 74 69 6f 6e 61 6c 20 66 6f 72 20  he rational for 
11690 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 69  this is that thi
116a0 73 20 66 75 6e 63 74 69 6f 6e 20 0a 2a 2a 20 6d  s function .** m
116b0 61 79 20 62 65 20 63 61 6c 6c 65 64 20 65 76 65  ay be called eve
116c0 6e 20 69 66 20 74 68 65 20 66 69 6c 65 20 64 6f  n if the file do
116d0 65 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20  es not exist or 
116e0 63 6f 6e 74 61 69 6e 20 61 20 68 65 61 64 65 72  contain a header
116f0 2e 20 49 6e 20 0a 2a 2a 20 74 68 65 73 65 20 63  . In .** these c
11700 61 73 65 73 20 73 71 6c 69 74 65 33 4f 73 52 65  ases sqlite3OsRe
11710 61 64 28 29 20 77 69 6c 6c 20 72 65 74 75 72 6e  ad() will return
11720 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 77 68   an error, to wh
11730 69 63 68 20 74 68 65 20 63 6f 72 72 65 63 74 20  ich the correct 
11740 0a 2a 2a 20 72 65 73 70 6f 6e 73 65 20 69 73 20  .** response is 
11750 74 6f 20 7a 65 72 6f 20 74 68 65 20 6d 65 6d 6f  to zero the memo
11760 72 79 20 61 74 20 70 44 65 73 74 20 61 6e 64 20  ry at pDest and 
11770 63 6f 6e 74 69 6e 75 65 2e 20 20 41 20 72 65 61  continue.  A rea
11780 6c 20 49 4f 20 65 72 72 6f 72 20 0a 2a 2a 20 77  l IO error .** w
11790 69 6c 6c 20 70 72 65 73 75 6d 61 62 6c 79 20 72  ill presumably r
117a0 65 63 75 72 20 61 6e 64 20 62 65 20 70 69 63 6b  ecur and be pick
117b0 65 64 20 75 70 20 6c 61 74 65 72 20 28 54 6f 64  ed up later (Tod
117c0 6f 3a 20 54 68 69 6e 6b 20 61 62 6f 75 74 20 74  o: Think about t
117d0 68 69 73 29 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  his)..*/.int sql
117e0 69 74 65 33 50 61 67 65 72 52 65 61 64 46 69 6c  ite3PagerReadFil
117f0 65 68 65 61 64 65 72 28 50 61 67 65 72 20 2a 70  eheader(Pager *p
11800 50 61 67 65 72 2c 20 69 6e 74 20 4e 2c 20 75 6e  Pager, int N, un
11810 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70 44 65  signed char *pDe
11820 73 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  st){.  int rc = 
11830 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 6d 65 6d  SQLITE_OK;.  mem
11840 73 65 74 28 70 44 65 73 74 2c 20 30 2c 20 4e 29  set(pDest, 0, N)
11850 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42 3d 3d 30  ;.  if( MEMDB==0
11860 20 29 7b 0a 20 20 20 20 64 69 73 61 62 6c 65 5f   ){.    disable_
11870 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f 65 72 72  simulated_io_err
11880 6f 72 73 28 29 3b 0a 20 20 20 20 73 71 6c 69 74  ors();.    sqlit
11890 65 33 4f 73 53 65 65 6b 28 70 50 61 67 65 72 2d  e3OsSeek(pPager-
118a0 3e 66 64 2c 20 30 29 3b 0a 20 20 20 20 65 6e 61  >fd, 0);.    ena
118b0 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f  ble_simulated_io
118c0 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 20 20 49  _errors();.    I
118d0 4f 54 52 41 43 45 28 28 22 44 42 48 44 52 20 25  OTRACE(("DBHDR %
118e0 70 20 30 20 25 64 5c 6e 22 2c 20 70 50 61 67 65  p 0 %d\n", pPage
118f0 72 2c 20 4e 29 29 0a 20 20 20 20 72 63 20 3d 20  r, N)).    rc = 
11900 73 71 6c 69 74 65 33 4f 73 52 65 61 64 28 70 50  sqlite3OsRead(pP
11910 61 67 65 72 2d 3e 66 64 2c 20 70 44 65 73 74 2c  ager->fd, pDest,
11920 20 4e 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d   N);.    if( rc=
11930 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f 53 48  =SQLITE_IOERR_SH
11940 4f 52 54 5f 52 45 41 44 20 29 7b 0a 20 20 20 20  ORT_READ ){.    
11950 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b    rc = SQLITE_OK
11960 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
11970 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
11980 2a 20 52 65 74 75 72 6e 20 74 68 65 20 74 6f 74  * Return the tot
11990 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67  al number of pag
119a0 65 73 20 69 6e 20 74 68 65 20 64 69 73 6b 20 66  es in the disk f
119b0 69 6c 65 20 61 73 73 6f 63 69 61 74 65 64 20 77  ile associated w
119c0 69 74 68 0a 2a 2a 20 70 50 61 67 65 72 2e 20 0a  ith.** pPager. .
119d0 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 50 45 4e  **.** If the PEN
119e0 44 49 4e 47 5f 42 59 54 45 20 6c 69 65 73 20 6f  DING_BYTE lies o
119f0 6e 20 74 68 65 20 70 61 67 65 20 64 69 72 65 63  n the page direc
11a00 74 6c 79 20 61 66 74 65 72 20 74 68 65 20 65 6e  tly after the en
11a10 64 20 6f 66 20 74 68 65 0a 2a 2a 20 66 69 6c 65  d of the.** file
11a20 2c 20 74 68 65 6e 20 63 6f 6e 73 69 64 65 72 20  , then consider 
11a30 74 68 69 73 20 70 61 67 65 20 70 61 72 74 20 6f  this page part o
11a40 66 20 74 68 65 20 66 69 6c 65 20 74 6f 6f 2e 20  f the file too. 
11a50 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 69 66 0a  For example, if.
11a60 2a 2a 20 50 45 4e 44 49 4e 47 5f 42 59 54 45 20  ** PENDING_BYTE 
11a70 69 73 20 62 79 74 65 20 34 30 39 36 20 28 74 68  is byte 4096 (th
11a80 65 20 66 69 72 73 74 20 62 79 74 65 20 6f 66 20  e first byte of 
11a90 70 61 67 65 20 35 29 20 61 6e 64 20 74 68 65 20  page 5) and the 
11aa0 73 69 7a 65 20 6f 66 20 74 68 65 0a 2a 2a 20 66  size of the.** f
11ab0 69 6c 65 20 69 73 20 34 30 39 36 20 62 79 74 65  ile is 4096 byte
11ac0 73 2c 20 35 20 69 73 20 72 65 74 75 72 6e 65 64  s, 5 is returned
11ad0 20 69 6e 73 74 65 61 64 20 6f 66 20 34 2e 0a 2a   instead of 4..*
11ae0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
11af0 65 72 50 61 67 65 63 6f 75 6e 74 28 50 61 67 65  erPagecount(Page
11b00 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 36  r *pPager){.  i6
11b10 34 20 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  4 n;.  int rc;. 
11b20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 21   assert( pPager!
11b30 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67  =0 );.  if( pPag
11b40 65 72 2d 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20  er->errCode ){. 
11b50 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
11b60 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 64  .  if( pPager->d
11b70 62 53 69 7a 65 3e 3d 30 20 29 7b 0a 20 20 20 20  bSize>=0 ){.    
11b80 6e 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  n = pPager->dbSi
11b90 7a 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ze;.  } else {. 
11ba0 20 20 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c     if( (rc = sql
11bb0 69 74 65 33 4f 73 46 69 6c 65 53 69 7a 65 28 70  ite3OsFileSize(p
11bc0 50 61 67 65 72 2d 3e 66 64 2c 20 26 6e 29 29 21  Pager->fd, &n))!
11bd0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
11be0 20 20 20 20 70 61 67 65 72 5f 65 72 72 6f 72 28      pager_error(
11bf0 70 50 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20  pPager, rc);.   
11c00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
11c10 20 7d 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26   }.    if( n>0 &
11c20 26 20 6e 3c 70 50 61 67 65 72 2d 3e 70 61 67 65  & n<pPager->page
11c30 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 6e 20  Size ){.      n 
11c40 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
11c50 20 20 20 20 20 20 6e 20 2f 3d 20 70 50 61 67 65        n /= pPage
11c60 72 2d 3e 70 61 67 65 53 69 7a 65 3b 0a 20 20 20  r->pageSize;.   
11c70 20 7d 0a 20 20 20 20 69 66 28 20 70 50 61 67 65   }.    if( pPage
11c80 72 2d 3e 73 74 61 74 65 21 3d 50 41 47 45 52 5f  r->state!=PAGER_
11c90 55 4e 4c 4f 43 4b 20 29 7b 0a 20 20 20 20 20 20  UNLOCK ){.      
11ca0 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d  pPager->dbSize =
11cb0 20 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   n;.    }.  }.  
11cc0 69 66 28 20 6e 3d 3d 28 50 45 4e 44 49 4e 47 5f  if( n==(PENDING_
11cd0 42 59 54 45 2f 70 50 61 67 65 72 2d 3e 70 61 67  BYTE/pPager->pag
11ce0 65 53 69 7a 65 29 20 29 7b 0a 20 20 20 20 6e 2b  eSize) ){.    n+
11cf0 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 3e 70  +;.  }.  if( n>p
11d00 50 61 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b  Pager->mxPgno ){
11d10 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6d 78 50  .    pPager->mxP
11d20 67 6e 6f 20 3d 20 6e 3b 0a 20 20 7d 0a 20 20 72  gno = n;.  }.  r
11d30 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 0a 23 69 66  eturn n;.}...#if
11d40 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
11d50 5f 4d 45 4d 4f 52 59 44 42 0a 2f 2a 0a 2a 2a 20  _MEMORYDB./*.** 
11d60 43 6c 65 61 72 20 61 20 50 67 48 69 73 74 6f 72  Clear a PgHistor
11d70 79 20 62 6c 6f 63 6b 0a 2a 2f 0a 73 74 61 74 69  y block.*/.stati
11d80 63 20 76 6f 69 64 20 63 6c 65 61 72 48 69 73 74  c void clearHist
11d90 6f 72 79 28 50 67 48 69 73 74 6f 72 79 20 2a 70  ory(PgHistory *p
11da0 48 69 73 74 29 7b 0a 20 20 73 71 6c 69 74 65 46  Hist){.  sqliteF
11db0 72 65 65 28 70 48 69 73 74 2d 3e 70 4f 72 69 67  ree(pHist->pOrig
11dc0 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
11dd0 70 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20  pHist->pStmt);. 
11de0 20 70 48 69 73 74 2d 3e 70 4f 72 69 67 20 3d 20   pHist->pOrig = 
11df0 30 3b 0a 20 20 70 48 69 73 74 2d 3e 70 53 74 6d  0;.  pHist->pStm
11e00 74 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  t = 0;.}.#else.#
11e10 64 65 66 69 6e 65 20 63 6c 65 61 72 48 69 73 74  define clearHist
11e20 6f 72 79 28 78 29 0a 23 65 6e 64 69 66 0a 0a 2f  ory(x).#endif../
11e30 2a 0a 2a 2a 20 46 6f 72 77 61 72 64 20 64 65 63  *.** Forward dec
11e40 6c 61 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74  laration.*/.stat
11e50 69 63 20 69 6e 74 20 73 79 6e 63 4a 6f 75 72 6e  ic int syncJourn
11e60 61 6c 28 50 61 67 65 72 2a 29 3b 0a 0a 2f 2a 0a  al(Pager*);../*.
11e70 2a 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20 66 72  ** Unlink pPg fr
11e80 6f 6d 20 69 74 27 73 20 68 61 73 68 20 63 68 61  om it's hash cha
11e90 69 6e 2e 20 41 6c 73 6f 20 73 65 74 20 74 68 65  in. Also set the
11ea0 20 70 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20   page number to 
11eb0 30 20 74 6f 20 69 6e 64 69 63 61 74 65 0a 2a 2a  0 to indicate.**
11ec0 20 74 68 61 74 20 74 68 65 20 70 61 67 65 20 69   that the page i
11ed0 73 20 6e 6f 74 20 70 61 72 74 20 6f 66 20 61 6e  s not part of an
11ee0 79 20 68 61 73 68 20 63 68 61 69 6e 2e 20 54 68  y hash chain. Th
11ef0 69 73 20 69 73 20 72 65 71 75 69 72 65 64 20 62  is is required b
11f00 65 63 61 75 73 65 20 74 68 65 0a 2a 2a 20 73 71  ecause the.** sq
11f10 6c 69 74 65 33 50 61 67 65 72 4d 6f 76 65 70 61  lite3PagerMovepa
11f20 67 65 28 29 20 72 6f 75 74 69 6e 65 20 63 61 6e  ge() routine can
11f30 20 6c 65 61 76 65 20 61 20 70 61 67 65 20 69 6e   leave a page in
11f40 20 74 68 65 20 0a 2a 2a 20 70 4e 65 78 74 46 72   the .** pNextFr
11f50 65 65 2f 70 50 72 65 76 46 72 65 65 20 6c 69 73  ee/pPrevFree lis
11f60 74 20 74 68 61 74 20 69 73 20 6e 6f 74 20 61 20  t that is not a 
11f70 70 61 72 74 20 6f 66 20 61 6e 79 20 68 61 73 68  part of any hash
11f80 2d 63 68 61 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69  -chain..*/.stati
11f90 63 20 76 6f 69 64 20 75 6e 6c 69 6e 6b 48 61 73  c void unlinkHas
11fa0 68 43 68 61 69 6e 28 50 61 67 65 72 20 2a 70 50  hChain(Pager *pP
11fb0 61 67 65 72 2c 20 50 67 48 64 72 20 2a 70 50 67  ager, PgHdr *pPg
11fc0 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e 70 67  ){.  if( pPg->pg
11fd0 6e 6f 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  no==0 ){.    ass
11fe0 65 72 74 28 20 70 50 67 2d 3e 70 4e 65 78 74 48  ert( pPg->pNextH
11ff0 61 73 68 3d 3d 30 20 26 26 20 70 50 67 2d 3e 70  ash==0 && pPg->p
12000 50 72 65 76 48 61 73 68 3d 3d 30 20 29 3b 0a 20  PrevHash==0 );. 
12010 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20     return;.  }. 
12020 20 69 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 48   if( pPg->pNextH
12030 61 73 68 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ash ){.    pPg->
12040 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
12050 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72 65  Hash = pPg->pPre
12060 76 48 61 73 68 3b 0a 20 20 7d 0a 20 20 69 66 28  vHash;.  }.  if(
12070 20 70 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20   pPg->pPrevHash 
12080 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
12090 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 70 50 67  Pager->aHash[pPg
120a0 2d 3e 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72  ->pgno & (pPager
120b0 2d 3e 6e 48 61 73 68 2d 31 29 5d 21 3d 70 50 67  ->nHash-1)]!=pPg
120c0 20 29 3b 0a 20 20 20 20 70 50 67 2d 3e 70 50 72   );.    pPg->pPr
120d0 65 76 48 61 73 68 2d 3e 70 4e 65 78 74 48 61 73  evHash->pNextHas
120e0 68 20 3d 20 70 50 67 2d 3e 70 4e 65 78 74 48 61  h = pPg->pNextHa
120f0 73 68 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  sh;.  }else{.   
12100 20 69 6e 74 20 68 20 3d 20 70 50 67 2d 3e 70 67   int h = pPg->pg
12110 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e 48  no & (pPager->nH
12120 61 73 68 2d 31 29 3b 0a 20 20 20 20 70 50 61 67  ash-1);.    pPag
12130 65 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70  er->aHash[h] = p
12140 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 3b 0a 20  Pg->pNextHash;. 
12150 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29   }.  if( MEMDB )
12160 7b 0a 20 20 20 20 63 6c 65 61 72 48 69 73 74 6f  {.    clearHisto
12170 72 79 28 50 47 48 44 52 5f 54 4f 5f 48 49 53 54  ry(PGHDR_TO_HIST
12180 28 70 50 67 2c 20 70 50 61 67 65 72 29 29 3b 0a  (pPg, pPager));.
12190 20 20 7d 0a 20 20 70 50 67 2d 3e 70 67 6e 6f 20    }.  pPg->pgno 
121a0 3d 20 30 3b 0a 20 20 70 50 67 2d 3e 70 4e 65 78  = 0;.  pPg->pNex
121b0 74 48 61 73 68 20 3d 20 70 50 67 2d 3e 70 50 72  tHash = pPg->pPr
121c0 65 76 48 61 73 68 20 3d 20 30 3b 0a 7d 0a 0a 2f  evHash = 0;.}../
121d0 2a 0a 2a 2a 20 55 6e 6c 69 6e 6b 20 61 20 70 61  *.** Unlink a pa
121e0 67 65 20 66 72 6f 6d 20 74 68 65 20 66 72 65 65  ge from the free
121f0 20 6c 69 73 74 20 28 74 68 65 20 6c 69 73 74 20   list (the list 
12200 6f 66 20 61 6c 6c 20 70 61 67 65 73 20 77 68 65  of all pages whe
12210 72 65 20 6e 52 65 66 3d 3d 30 29 0a 2a 2a 20 61  re nRef==0).** a
12220 6e 64 20 66 72 6f 6d 20 69 74 73 20 68 61 73 68  nd from its hash
12230 20 63 6f 6c 6c 69 73 69 6f 6e 20 63 68 61 69 6e   collision chain
12240 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
12250 20 75 6e 6c 69 6e 6b 50 61 67 65 28 50 67 48 64   unlinkPage(PgHd
12260 72 20 2a 70 50 67 29 7b 0a 20 20 50 61 67 65 72  r *pPg){.  Pager
12270 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
12280 70 50 61 67 65 72 3b 0a 0a 20 20 2f 2a 20 4b 65  pPager;..  /* Ke
12290 65 70 20 74 68 65 20 70 46 69 72 73 74 53 79 6e  ep the pFirstSyn
122a0 63 65 64 20 70 6f 69 6e 74 65 72 20 70 6f 69 6e  ced pointer poin
122b0 74 69 6e 67 20 61 74 20 74 68 65 20 66 69 72 73  ting at the firs
122c0 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 70  t synchronized p
122d0 61 67 65 20 2a 2f 0a 20 20 69 66 28 20 70 50 67  age */.  if( pPg
122e0 3d 3d 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  ==pPager->pFirst
122f0 53 79 6e 63 65 64 20 29 7b 0a 20 20 20 20 50 67  Synced ){.    Pg
12300 48 64 72 20 2a 70 20 3d 20 70 50 67 2d 3e 70 4e  Hdr *p = pPg->pN
12310 65 78 74 46 72 65 65 3b 0a 20 20 20 20 77 68 69  extFree;.    whi
12320 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 65 65 64  le( p && p->need
12330 53 79 6e 63 20 29 7b 20 70 20 3d 20 70 2d 3e 70  Sync ){ p = p->p
12340 4e 65 78 74 46 72 65 65 3b 20 7d 0a 20 20 20 20  NextFree; }.    
12350 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79  pPager->pFirstSy
12360 6e 63 65 64 20 3d 20 70 3b 0a 20 20 7d 0a 0a 20  nced = p;.  }.. 
12370 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d 20   /* Unlink from 
12380 74 68 65 20 66 72 65 65 6c 69 73 74 20 2a 2f 0a  the freelist */.
12390 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
123a0 46 72 65 65 20 29 7b 0a 20 20 20 20 70 50 67 2d  Free ){.    pPg-
123b0 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e 65 78  >pPrevFree->pNex
123c0 74 46 72 65 65 20 3d 20 70 50 67 2d 3e 70 4e 65  tFree = pPg->pNe
123d0 78 74 46 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b  xtFree;.  }else{
123e0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
123f0 67 65 72 2d 3e 70 46 69 72 73 74 3d 3d 70 50 67  ger->pFirst==pPg
12400 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
12410 70 46 69 72 73 74 20 3d 20 70 50 67 2d 3e 70 4e  pFirst = pPg->pN
12420 65 78 74 46 72 65 65 3b 0a 20 20 7d 0a 20 20 69  extFree;.  }.  i
12430 66 28 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65  f( pPg->pNextFre
12440 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e 70 4e  e ){.    pPg->pN
12450 65 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72  extFree->pPrevFr
12460 65 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46  ee = pPg->pPrevF
12470 72 65 65 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ree;.  }else{.  
12480 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
12490 2d 3e 70 4c 61 73 74 3d 3d 70 50 67 20 29 3b 0a  ->pLast==pPg );.
124a0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 4c 61 73      pPager->pLas
124b0 74 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  t = pPg->pPrevFr
124c0 65 65 3b 0a 20 20 7d 0a 20 20 70 50 67 2d 3e 70  ee;.  }.  pPg->p
124d0 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
124e0 70 50 72 65 76 46 72 65 65 20 3d 20 30 3b 0a 0a  pPrevFree = 0;..
124f0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 66 72 6f 6d    /* Unlink from
12500 20 74 68 65 20 70 67 6e 6f 20 68 61 73 68 20 74   the pgno hash t
12510 61 62 6c 65 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  able */.  unlink
12520 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
12530 2c 20 70 50 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , pPg);.}../*.**
12540 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
12550 20 75 73 65 64 20 74 6f 20 74 72 75 6e 63 61 74   used to truncat
12560 65 20 74 68 65 20 63 61 63 68 65 20 77 68 65 6e  e the cache when
12570 20 61 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 69   a database.** i
12580 73 20 74 72 75 6e 63 61 74 65 64 2e 20 20 44 72  s truncated.  Dr
12590 6f 70 20 66 72 6f 6d 20 74 68 65 20 63 61 63 68  op from the cach
125a0 65 20 61 6c 6c 20 70 61 67 65 73 20 77 68 6f 73  e all pages whos
125b0 65 20 70 67 6e 6f 20 69 73 0a 2a 2a 20 6c 61 72  e pgno is.** lar
125c0 67 65 72 20 74 68 61 6e 20 70 50 61 67 65 72 2d  ger than pPager-
125d0 3e 64 62 53 69 7a 65 20 61 6e 64 20 69 73 20 75  >dbSize and is u
125e0 6e 72 65 66 65 72 65 6e 63 65 64 2e 0a 2a 2a 0a  nreferenced..**.
125f0 2a 2a 20 52 65 66 65 72 65 6e 63 65 64 20 70 61  ** Referenced pa
12600 67 65 73 20 6c 61 72 67 65 72 20 74 68 61 6e 20  ges larger than 
12610 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 61  pPager->dbSize a
12620 72 65 20 7a 65 72 6f 65 64 2e 0a 2a 2a 0a 2a 2a  re zeroed..**.**
12630 20 41 63 74 75 61 6c 6c 79 2c 20 61 74 20 74 68   Actually, at th
12640 65 20 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75  e point this rou
12650 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
12660 69 74 20 77 6f 75 6c 64 20 62 65 0a 2a 2a 20 61  it would be.** a
12670 6e 20 65 72 72 6f 72 20 74 6f 20 68 61 76 65 20  n error to have 
12680 61 20 72 65 66 65 72 65 6e 63 65 64 20 70 61 67  a referenced pag
12690 65 2e 20 20 42 75 74 20 72 61 74 68 65 72 20 74  e.  But rather t
126a0 68 61 6e 20 64 65 6c 65 74 65 0a 2a 2a 20 74 68  han delete.** th
126b0 61 74 20 70 61 67 65 20 61 6e 64 20 67 75 61 72  at page and guar
126c0 61 6e 74 65 65 20 61 20 73 75 62 73 65 71 75 65  antee a subseque
126d0 6e 74 20 73 65 67 66 61 75 6c 74 2c 20 69 74 20  nt segfault, it 
126e0 73 65 65 6d 73 20 62 65 74 74 65 72 0a 2a 2a 20  seems better.** 
126f0 74 6f 20 7a 65 72 6f 20 69 74 20 61 6e 64 20 68  to zero it and h
12700 6f 70 65 20 74 68 61 74 20 77 65 20 65 72 72 6f  ope that we erro
12710 72 20 6f 75 74 20 73 61 6e 65 6c 79 2e 0a 2a 2f  r out sanely..*/
12720 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 61 67  .static void pag
12730 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
12740 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
12750 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a  {.  PgHdr *pPg;.
12760 20 20 50 67 48 64 72 20 2a 2a 70 70 50 67 3b 0a    PgHdr **ppPg;.
12770 20 20 69 6e 74 20 64 62 53 69 7a 65 20 3d 20 70    int dbSize = p
12780 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a  Pager->dbSize;..
12790 20 20 70 70 50 67 20 3d 20 26 70 50 61 67 65 72    ppPg = &pPager
127a0 2d 3e 70 41 6c 6c 3b 0a 20 20 77 68 69 6c 65 28  ->pAll;.  while(
127b0 20 28 70 50 67 20 3d 20 2a 70 70 50 67 29 21 3d   (pPg = *ppPg)!=
127c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 67  0 ){.    if( pPg
127d0 2d 3e 70 67 6e 6f 3c 3d 64 62 53 69 7a 65 20 29  ->pgno<=dbSize )
127e0 7b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20 26  {.      ppPg = &
127f0 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
12800 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 50 67     }else if( pPg
12810 2d 3e 6e 52 65 66 3e 30 20 29 7b 0a 20 20 20 20  ->nRef>0 ){.    
12820 20 20 6d 65 6d 73 65 74 28 50 47 48 44 52 5f 54    memset(PGHDR_T
12830 4f 5f 44 41 54 41 28 70 50 67 29 2c 20 30 2c 20  O_DATA(pPg), 0, 
12840 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
12850 29 3b 0a 20 20 20 20 20 20 70 70 50 67 20 3d 20  );.      ppPg = 
12860 26 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a  &pPg->pNextAll;.
12870 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12880 20 2a 70 70 50 67 20 3d 20 70 50 67 2d 3e 70 4e   *ppPg = pPg->pN
12890 65 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 49 4f  extAll;.      IO
128a0 54 52 41 43 45 28 28 22 50 47 46 52 45 45 20 25  TRACE(("PGFREE %
128b0 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
128c0 20 70 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20   pPg->pgno));.  
128d0 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
128e0 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
128f0 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
12900 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70 50 67    unlinkPage(pPg
12910 29 3b 0a 20 20 20 20 20 20 6d 61 6b 65 43 6c 65  );.      makeCle
12920 61 6e 28 70 50 67 29 3b 0a 20 20 20 20 20 20 73  an(pPg);.      s
12930 71 6c 69 74 65 46 72 65 65 28 70 50 67 29 3b 0a  qliteFree(pPg);.
12940 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 50        pPager->nP
12950 61 67 65 2d 2d 3b 0a 20 20 20 20 7d 0a 20 20 7d  age--;.    }.  }
12960 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
12970 20 6f 62 74 61 69 6e 20 61 20 6c 6f 63 6b 20 6f   obtain a lock o
12980 6e 20 61 20 66 69 6c 65 2e 20 20 49 6e 76 6f 6b  n a file.  Invok
12990 65 20 74 68 65 20 62 75 73 79 20 63 61 6c 6c 62  e the busy callb
129a0 61 63 6b 20 69 66 20 74 68 65 20 6c 6f 63 6b 0a  ack if the lock.
129b0 2a 2a 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ** is currently 
129c0 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 2e 20 20  not available.  
129d0 52 65 70 65 61 74 20 75 6e 74 69 6c 20 74 68 65  Repeat until the
129e0 20 62 75 73 79 20 63 61 6c 6c 62 61 63 6b 20 72   busy callback r
129f0 65 74 75 72 6e 73 0a 2a 2a 20 66 61 6c 73 65 20  eturns.** false 
12a00 6f 72 20 75 6e 74 69 6c 20 74 68 65 20 6c 6f 63  or until the loc
12a10 6b 20 73 75 63 63 65 65 64 73 2e 0a 2a 2a 0a 2a  k succeeds..**.*
12a20 2a 20 52 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  * Return SQLITE_
12a30 4f 4b 20 6f 6e 20 73 75 63 63 65 73 73 20 61 6e  OK on success an
12a40 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  d an error code 
12a50 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 6f 62 74  if we cannot obt
12a60 61 69 6e 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 2e  ain.** the lock.
12a70 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
12a80 61 67 65 72 5f 77 61 69 74 5f 6f 6e 5f 6c 6f 63  ager_wait_on_loc
12a90 6b 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  k(Pager *pPager,
12aa0 20 69 6e 74 20 6c 6f 63 6b 74 79 70 65 29 7b 0a   int locktype){.
12ab0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
12ac0 54 68 65 20 4f 53 20 6c 6f 63 6b 20 76 61 6c 75  The OS lock valu
12ad0 65 73 20 6d 75 73 74 20 62 65 20 74 68 65 20 73  es must be the s
12ae0 61 6d 65 20 61 73 20 74 68 65 20 50 61 67 65 72  ame as the Pager
12af0 20 6c 6f 63 6b 20 76 61 6c 75 65 73 20 2a 2f 0a   lock values */.
12b00 20 20 61 73 73 65 72 74 28 20 50 41 47 45 52 5f    assert( PAGER_
12b10 53 48 41 52 45 44 3d 3d 53 48 41 52 45 44 5f 4c  SHARED==SHARED_L
12b20 4f 43 4b 20 29 3b 0a 20 20 61 73 73 65 72 74 28  OCK );.  assert(
12b30 20 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3d   PAGER_RESERVED=
12b40 3d 52 45 53 45 52 56 45 44 5f 4c 4f 43 4b 20 29  =RESERVED_LOCK )
12b50 3b 0a 20 20 61 73 73 65 72 74 28 20 50 41 47 45  ;.  assert( PAGE
12b60 52 5f 45 58 43 4c 55 53 49 56 45 3d 3d 45 58 43  R_EXCLUSIVE==EXC
12b70 4c 55 53 49 56 45 5f 4c 4f 43 4b 20 29 3b 0a 0a  LUSIVE_LOCK );..
12b80 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
12b90 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 75 6e   is currently un
12ba0 6c 6f 63 6b 65 64 20 74 68 65 6e 20 74 68 65 20  locked then the 
12bb0 73 69 7a 65 20 6d 75 73 74 20 62 65 20 75 6e 6b  size must be unk
12bc0 6e 6f 77 6e 20 2a 2f 0a 20 20 61 73 73 65 72 74  nown */.  assert
12bd0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12be0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
12bf0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c   pPager->dbSize<
12c00 30 20 7c 7c 20 4d 45 4d 44 42 20 29 3b 0a 0a 20  0 || MEMDB );.. 
12c10 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
12c20 74 65 3e 3d 6c 6f 63 6b 74 79 70 65 20 29 7b 0a  te>=locktype ){.
12c30 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
12c40 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  OK;.  }else{.   
12c50 20 64 6f 20 7b 0a 20 20 20 20 20 20 72 63 20 3d   do {.      rc =
12c60 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
12c70 50 61 67 65 72 2d 3e 66 64 2c 20 6c 6f 63 6b 74  Pager->fd, lockt
12c80 79 70 65 29 3b 0a 20 20 20 20 7d 77 68 69 6c 65  ype);.    }while
12c90 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  ( rc==SQLITE_BUS
12ca0 59 20 26 26 20 73 71 6c 69 74 65 33 49 6e 76 6f  Y && sqlite3Invo
12cb0 6b 65 42 75 73 79 48 61 6e 64 6c 65 72 28 70 50  keBusyHandler(pP
12cc0 61 67 65 72 2d 3e 70 42 75 73 79 48 61 6e 64 6c  ager->pBusyHandl
12cd0 65 72 29 20 29 3b 0a 20 20 20 20 69 66 28 20 72  er) );.    if( r
12ce0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
12cf0 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74        pPager->st
12d00 61 74 65 20 3d 20 6c 6f 63 6b 74 79 70 65 3b 0a  ate = locktype;.
12d10 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
12d20 4c 4f 43 4b 20 25 70 20 25 64 5c 6e 22 2c 20 70  LOCK %p %d\n", p
12d30 50 61 67 65 72 2c 20 6c 6f 63 6b 74 79 70 65 29  Pager, locktype)
12d40 29 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ).    }.  }.  re
12d50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
12d60 2a 20 54 72 75 6e 63 61 74 65 20 74 68 65 20 66  * Truncate the f
12d70 69 6c 65 20 74 6f 20 74 68 65 20 6e 75 6d 62 65  ile to the numbe
12d80 72 20 6f 66 20 70 61 67 65 73 20 73 70 65 63 69  r of pages speci
12d90 66 69 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  fied..*/.int sql
12da0 69 74 65 33 50 61 67 65 72 54 72 75 6e 63 61 74  ite3PagerTruncat
12db0 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c  e(Pager *pPager,
12dc0 20 50 67 6e 6f 20 6e 50 61 67 65 29 7b 0a 20 20   Pgno nPage){.  
12dd0 69 6e 74 20 72 63 3b 0a 20 20 61 73 73 65 72 74  int rc;.  assert
12de0 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e  ( pPager->state>
12df0 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20 7c 7c  =PAGER_SHARED ||
12e00 20 4d 45 4d 44 42 20 29 3b 0a 20 20 73 71 6c 69   MEMDB );.  sqli
12e10 74 65 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e  te3PagerPagecoun
12e20 74 28 70 50 61 67 65 72 29 3b 0a 20 20 69 66 28  t(pPager);.  if(
12e30 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
12e40 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70 50 61   ){.    rc = pPa
12e50 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20  ger->errCode;.  
12e60 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12e70 0a 20 20 69 66 28 20 6e 50 61 67 65 3e 3d 28 75  .  if( nPage>=(u
12e80 6e 73 69 67 6e 65 64 29 70 50 61 67 65 72 2d 3e  nsigned)pPager->
12e90 64 62 53 69 7a 65 20 29 7b 0a 20 20 20 20 72 65  dbSize ){.    re
12ea0 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
12eb0 20 20 7d 0a 20 20 69 66 28 20 4d 45 4d 44 42 20    }.  if( MEMDB 
12ec0 29 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64  ){.    pPager->d
12ed0 62 53 69 7a 65 20 3d 20 6e 50 61 67 65 3b 0a 20  bSize = nPage;. 
12ee0 20 20 20 70 61 67 65 72 5f 74 72 75 6e 63 61 74     pager_truncat
12ef0 65 5f 63 61 63 68 65 28 70 50 61 67 65 72 29 3b  e_cache(pPager);
12f00 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
12f10 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 72 63 20  TE_OK;.  }.  rc 
12f20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 70 50  = syncJournal(pP
12f30 61 67 65 72 29 3b 0a 20 20 69 66 28 20 72 63 21  ager);.  if( rc!
12f40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12f50 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
12f60 0a 0a 20 20 2f 2a 20 47 65 74 20 61 6e 20 65 78  ..  /* Get an ex
12f70 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f 6e 20  clusive lock on 
12f80 74 68 65 20 64 61 74 61 62 61 73 65 20 62 65 66  the database bef
12f90 6f 72 65 20 74 72 75 6e 63 61 74 69 6e 67 2e 20  ore truncating. 
12fa0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
12fb0 77 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61  wait_on_lock(pPa
12fc0 67 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c  ger, EXCLUSIVE_L
12fd0 4f 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d  OCK);.  if( rc!=
12fe0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
12ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
13000 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 74 72  .  rc = pager_tr
13010 75 6e 63 61 74 65 28 70 50 61 67 65 72 2c 20 6e  uncate(pPager, n
13020 50 61 67 65 29 3b 0a 20 20 72 65 74 75 72 6e 20  Page);.  return 
13030 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 68 75  rc;.}../*.** Shu
13040 74 64 6f 77 6e 20 74 68 65 20 70 61 67 65 20 63  tdown the page c
13050 61 63 68 65 2e 20 20 46 72 65 65 20 61 6c 6c 20  ache.  Free all 
13060 6d 65 6d 6f 72 79 20 61 6e 64 20 63 6c 6f 73 65  memory and close
13070 20 61 6c 6c 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a   all files..**.*
13080 2a 20 49 66 20 61 20 74 72 61 6e 73 61 63 74 69  * If a transacti
13090 6f 6e 20 77 61 73 20 69 6e 20 70 72 6f 67 72 65  on was in progre
130a0 73 73 20 77 68 65 6e 20 74 68 69 73 20 72 6f 75  ss when this rou
130b0 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20  tine is called, 
130c0 74 68 61 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  that.** transact
130d0 69 6f 6e 20 69 73 20 72 6f 6c 6c 65 64 20 62 61  ion is rolled ba
130e0 63 6b 2e 20 20 41 6c 6c 20 6f 75 74 73 74 61 6e  ck.  All outstan
130f0 64 69 6e 67 20 70 61 67 65 73 20 61 72 65 20 69  ding pages are i
13100 6e 76 61 6c 69 64 61 74 65 64 0a 2a 2a 20 61 6e  nvalidated.** an
13110 64 20 74 68 65 69 72 20 6d 65 6d 6f 72 79 20 69  d their memory i
13120 73 20 66 72 65 65 64 2e 20 20 41 6e 79 20 61 74  s freed.  Any at
13130 74 65 6d 70 74 20 74 6f 20 75 73 65 20 61 20 70  tempt to use a p
13140 61 67 65 20 61 73 73 6f 63 69 61 74 65 64 0a 2a  age associated.*
13150 2a 20 77 69 74 68 20 74 68 69 73 20 70 61 67 65  * with this page
13160 20 63 61 63 68 65 20 61 66 74 65 72 20 74 68 69   cache after thi
13170 73 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  s function retur
13180 6e 73 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 0a 2a  ns will likely.*
13190 2a 20 72 65 73 75 6c 74 20 69 6e 20 61 20 63 6f  * result in a co
131a0 72 65 64 75 6d 70 2e 0a 2a 2a 0a 2a 2a 20 54 68  redump..**.** Th
131b0 69 73 20 66 75 6e 63 74 69 6f 6e 20 61 6c 77 61  is function alwa
131c0 79 73 20 73 75 63 63 65 65 64 73 2e 20 49 66 20  ys succeeds. If 
131d0 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  a transaction is
131e0 20 61 63 74 69 76 65 20 61 6e 20 61 74 74 65 6d   active an attem
131f0 70 74 0a 2a 2a 20 69 73 20 6d 61 64 65 20 74 6f  pt.** is made to
13200 20 72 6f 6c 6c 20 69 74 20 62 61 63 6b 2e 20 49   roll it back. I
13210 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
13220 73 20 64 75 72 69 6e 67 20 74 68 65 20 72 6f 6c  s during the rol
13230 6c 62 61 63 6b 20 0a 2a 2a 20 61 20 68 6f 74 20  lback .** a hot 
13240 6a 6f 75 72 6e 61 6c 20 6d 61 79 20 62 65 20 6c  journal may be l
13250 65 66 74 20 69 6e 20 74 68 65 20 66 69 6c 65 73  eft in the files
13260 79 73 74 65 6d 20 62 75 74 20 6e 6f 20 65 72 72  ystem but no err
13270 6f 72 20 69 73 20 72 65 74 75 72 6e 65 64 0a 2a  or is returned.*
13280 2a 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 2e  * to the caller.
13290 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50  .*/.int sqlite3P
132a0 61 67 65 72 43 6c 6f 73 65 28 50 61 67 65 72 20  agerClose(Pager 
132b0 2a 70 50 61 67 65 72 29 7b 0a 23 69 66 64 65 66  *pPager){.#ifdef
132c0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d   SQLITE_ENABLE_M
132d0 45 4d 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54  EMORY_MANAGEMENT
132e0 0a 20 20 2f 2a 20 41 20 6d 61 6c 6c 6f 63 28 29  .  /* A malloc()
132f0 20 63 61 6e 6e 6f 74 20 66 61 69 6c 20 69 6e 20   cannot fail in 
13300 73 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74  sqlite3ThreadDat
13310 61 28 29 20 61 73 20 6f 6e 65 20 6f 72 20 6d 6f  a() as one or mo
13320 72 65 20 63 61 6c 6c 73 20 74 6f 20 0a 20 20 2a  re calls to .  *
13330 2a 20 6d 61 6c 6c 6f 63 28 29 20 6d 75 73 74 20  * malloc() must 
13340 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
13350 6e 20 6d 61 64 65 20 62 79 20 74 68 69 73 20 74  n made by this t
13360 68 72 65 61 64 20 62 65 66 6f 72 65 20 69 74 20  hread before it 
13370 67 65 74 73 0a 20 20 2a 2a 20 74 6f 20 74 68 69  gets.  ** to thi
13380 73 20 70 6f 69 6e 74 2e 20 54 68 69 73 20 6d 65  s point. This me
13390 61 6e 73 20 74 68 65 20 54 68 72 65 61 64 44 61  ans the ThreadDa
133a0 74 61 20 6d 75 73 74 20 68 61 76 65 20 62 65 65  ta must have bee
133b0 6e 20 61 6c 6c 6f 63 61 74 65 64 20 61 6c 72 65  n allocated alre
133c0 61 64 79 0a 20 20 2a 2a 20 73 6f 20 74 68 61 74  ady.  ** so that
133d0 20 54 68 72 65 61 64 44 61 74 61 2e 6e 41 6c 6c   ThreadData.nAll
133e0 6f 63 20 63 61 6e 20 62 65 20 73 65 74 2e 0a 20  oc can be set.. 
133f0 20 2a 2f 0a 20 20 54 68 72 65 61 64 44 61 74 61   */.  ThreadData
13400 20 2a 70 54 73 64 20 3d 20 73 71 6c 69 74 65 33   *pTsd = sqlite3
13410 54 68 72 65 61 64 44 61 74 61 28 29 3b 0a 20 20  ThreadData();.  
13420 61 73 73 65 72 74 28 20 70 50 61 67 65 72 20 29  assert( pPager )
13430 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 73 64  ;.  assert( pTsd
13440 20 26 26 20 70 54 73 64 2d 3e 6e 41 6c 6c 6f 63   && pTsd->nAlloc
13450 20 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 64 69   );.#endif..  di
13460 73 61 62 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f  sable_simulated_
13470 69 6f 5f 65 72 72 6f 72 73 28 29 3b 0a 20 20 70  io_errors();.  p
13480 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20 3d  Pager->errCode =
13490 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 65 78   0;.  pPager->ex
134a0 63 6c 75 73 69 76 65 4d 6f 64 65 20 3d 20 30 3b  clusiveMode = 0;
134b0 0a 20 20 70 61 67 65 72 5f 72 65 73 65 74 28 70  .  pager_reset(p
134c0 50 61 67 65 72 29 3b 0a 20 20 70 61 67 65 72 55  Pager);.  pagerU
134d0 6e 6c 6f 63 6b 41 6e 64 52 6f 6c 6c 62 61 63 6b  nlockAndRollback
134e0 28 70 50 61 67 65 72 29 3b 0a 20 20 65 6e 61 62  (pPager);.  enab
134f0 6c 65 5f 73 69 6d 75 6c 61 74 65 64 5f 69 6f 5f  le_simulated_io_
13500 65 72 72 6f 72 73 28 29 3b 0a 20 20 50 41 47 45  errors();.  PAGE
13510 52 54 52 41 43 45 32 28 22 43 4c 4f 53 45 20 25  RTRACE2("CLOSE %
13520 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
13530 61 67 65 72 29 29 3b 0a 20 20 49 4f 54 52 41 43  ager));.  IOTRAC
13540 45 28 28 22 43 4c 4f 53 45 20 25 70 5c 6e 22 2c  E(("CLOSE %p\n",
13550 20 70 50 61 67 65 72 29 29 0a 20 20 61 73 73 65   pPager)).  asse
13560 72 74 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43  rt( pPager->errC
13570 6f 64 65 20 7c 7c 20 28 70 50 61 67 65 72 2d 3e  ode || (pPager->
13580 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 26  journalOpen==0 &
13590 26 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70  & pPager->stmtOp
135a0 65 6e 3d 3d 30 29 20 29 3b 0a 20 20 69 66 28 20  en==0) );.  if( 
135b0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
135c0 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  pen ){.    sqlit
135d0 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61 67 65  e3OsClose(&pPage
135e0 72 2d 3e 6a 66 64 29 3b 0a 20 20 7d 0a 20 20 73  r->jfd);.  }.  s
135f0 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65 72  qliteFree(pPager
13600 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b 0a 20  ->aInJournal);. 
13610 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
13620 74 4f 70 65 6e 20 29 7b 0a 20 20 20 20 73 71 6c  tOpen ){.    sql
13630 69 74 65 33 4f 73 43 6c 6f 73 65 28 26 70 50 61  ite3OsClose(&pPa
13640 67 65 72 2d 3e 73 74 66 64 29 3b 0a 20 20 7d 0a  ger->stfd);.  }.
13650 20 20 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65    sqlite3OsClose
13660 28 26 70 50 61 67 65 72 2d 3e 66 64 29 3b 0a 20  (&pPager->fd);. 
13670 20 2f 2a 20 54 65 6d 70 20 66 69 6c 65 73 20 61   /* Temp files a
13680 72 65 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79  re automatically
13690 20 64 65 6c 65 74 65 64 20 62 79 20 74 68 65 20   deleted by the 
136a0 4f 53 0a 20 20 2a 2a 20 69 66 28 20 70 50 61 67  OS.  ** if( pPag
136b0 65 72 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a  er->tempFile ){.
136c0 20 20 2a 2a 20 20 20 73 71 6c 69 74 65 33 4f 73    **   sqlite3Os
136d0 44 65 6c 65 74 65 28 70 50 61 67 65 72 2d 3e 7a  Delete(pPager->z
136e0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 2a 2a 20  Filename);.  ** 
136f0 7d 0a 20 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  }.  */..#ifdef S
13700 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
13710 4f 52 59 5f 4d 41 4e 41 47 45 4d 45 4e 54 0a 20  ORY_MANAGEMENT. 
13720 20 2f 2a 20 52 65 6d 6f 76 65 20 74 68 65 20 70   /* Remove the p
13730 61 67 65 72 20 66 72 6f 6d 20 74 68 65 20 6c 69  ager from the li
13740 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 70 61 67  nked list of pag
13750 65 72 73 20 73 74 61 72 74 69 6e 67 20 61 74 20  ers starting at 
13760 0a 20 20 2a 2a 20 54 68 72 65 61 64 44 61 74 61  .  ** ThreadData
13770 2e 70 50 61 67 65 72 20 69 66 20 6d 65 6d 6f 72  .pPager if memor
13780 79 2d 6d 61 6e 61 67 65 6d 65 6e 74 20 69 73 20  y-management is 
13790 65 6e 61 62 6c 65 64 2e 0a 20 20 2a 2f 0a 20 20  enabled..  */.  
137a0 69 66 28 20 70 50 61 67 65 72 3d 3d 70 54 73 64  if( pPager==pTsd
137b0 2d 3e 70 50 61 67 65 72 20 29 7b 0a 20 20 20 20  ->pPager ){.    
137c0 70 54 73 64 2d 3e 70 50 61 67 65 72 20 3d 20 70  pTsd->pPager = p
137d0 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20 20  Pager->pNext;.  
137e0 7d 65 6c 73 65 7b 0a 20 20 20 20 50 61 67 65 72  }else{.    Pager
137f0 20 2a 70 54 6d 70 3b 0a 20 20 20 20 66 6f 72 28   *pTmp;.    for(
13800 70 54 6d 70 20 3d 20 70 54 73 64 2d 3e 70 50 61  pTmp = pTsd->pPa
13810 67 65 72 3b 20 70 54 6d 70 2d 3e 70 4e 65 78 74  ger; pTmp->pNext
13820 21 3d 70 50 61 67 65 72 3b 20 70 54 6d 70 3d 70  !=pPager; pTmp=p
13830 54 6d 70 2d 3e 70 4e 65 78 74 29 7b 7d 0a 20 20  Tmp->pNext){}.  
13840 20 20 70 54 6d 70 2d 3e 70 4e 65 78 74 20 3d 20    pTmp->pNext = 
13850 70 50 61 67 65 72 2d 3e 70 4e 65 78 74 3b 0a 20  pPager->pNext;. 
13860 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
13870 74 65 46 72 65 65 28 70 50 61 67 65 72 2d 3e 61  teFree(pPager->a
13880 48 61 73 68 29 3b 0a 20 20 73 71 6c 69 74 65 46  Hash);.  sqliteF
13890 72 65 65 28 70 50 61 67 65 72 2d 3e 70 54 6d 70  ree(pPager->pTmp
138a0 53 70 61 63 65 29 3b 0a 20 20 73 71 6c 69 74 65  Space);.  sqlite
138b0 46 72 65 65 28 70 50 61 67 65 72 29 3b 0a 20 20  Free(pPager);.  
138c0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
138d0 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
138e0 64 28 4e 44 45 42 55 47 29 20 7c 7c 20 64 65 66  d(NDEBUG) || def
138f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 54 45 53 54  ined(SQLITE_TEST
13900 29 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  )./*.** Return t
13910 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20 66  he page number f
13920 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
13930 65 20 64 61 74 61 2e 0a 2a 2f 0a 50 67 6e 6f 20  e data..*/.Pgno 
13940 73 71 6c 69 74 65 33 50 61 67 65 72 50 61 67 65  sqlite3PagerPage
13950 6e 75 6d 62 65 72 28 44 62 50 61 67 65 20 2a 70  number(DbPage *p
13960 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 70  ){.  return p->p
13970 67 6e 6f 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  gno;.}.#endif../
13980 2a 0a 2a 2a 20 54 68 65 20 70 61 67 65 5f 72 65  *.** The page_re
13990 66 28 29 20 66 75 6e 63 74 69 6f 6e 20 69 6e 63  f() function inc
139a0 72 65 6d 65 6e 74 73 20 74 68 65 20 72 65 66 65  rements the refe
139b0 72 65 6e 63 65 20 63 6f 75 6e 74 20 66 6f 72 20  rence count for 
139c0 61 20 70 61 67 65 2e 0a 2a 2a 20 49 66 20 74 68  a page..** If th
139d0 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
139e0 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
139f0 69 73 74 20 28 74 68 65 20 72 65 66 65 72 65 6e  ist (the referen
13a00 63 65 20 63 6f 75 6e 74 20 69 73 20 7a 65 72 6f  ce count is zero
13a10 29 20 74 68 65 6e 0a 2a 2a 20 72 65 6d 6f 76 65  ) then.** remove
13a20 20 69 74 20 66 72 6f 6d 20 74 68 65 20 66 72 65   it from the fre
13a30 65 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72  elist..**.** For
13a40 20 6e 6f 6e 2d 74 65 73 74 20 73 79 73 74 65 6d   non-test system
13a50 73 2c 20 70 61 67 65 5f 72 65 66 28 29 20 69 73  s, page_ref() is
13a60 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 63 61   a macro that ca
13a70 6c 6c 73 20 5f 70 61 67 65 5f 72 65 66 28 29 0a  lls _page_ref().
13a80 2a 2a 20 6f 6e 6c 69 6e 65 20 6f 66 20 74 68 65  ** online of the
13a90 20 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74   reference count
13aa0 20 69 73 20 7a 65 72 6f 2e 20 20 46 6f 72 20 74   is zero.  For t
13ab0 65 73 74 20 73 79 73 74 65 6d 73 2c 20 70 61 67  est systems, pag
13ac0 65 5f 72 65 66 28 29 0a 2a 2a 20 69 73 20 61 20  e_ref().** is a 
13ad0 72 65 61 6c 20 66 75 6e 63 74 69 6f 6e 20 73 6f  real function so
13ae0 20 74 68 61 74 20 77 65 20 63 61 6e 20 73 65 74   that we can set
13af0 20 62 72 65 61 6b 70 6f 69 6e 74 73 20 61 6e 64   breakpoints and
13b00 20 74 72 61 63 65 20 69 74 2e 0a 2a 2f 0a 73 74   trace it..*/.st
13b10 61 74 69 63 20 76 6f 69 64 20 5f 70 61 67 65 5f  atic void _page_
13b20 72 65 66 28 50 67 48 64 72 20 2a 70 50 67 29 7b  ref(PgHdr *pPg){
13b30 0a 20 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66  .  if( pPg->nRef
13b40 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
13b50 65 20 70 61 67 65 20 69 73 20 63 75 72 72 65 6e  e page is curren
13b60 74 6c 79 20 6f 6e 20 74 68 65 20 66 72 65 65 6c  tly on the freel
13b70 69 73 74 2e 20 20 52 65 6d 6f 76 65 20 69 74 2e  ist.  Remove it.
13b80 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 50 67 3d   */.    if( pPg=
13b90 3d 70 50 67 2d 3e 70 50 61 67 65 72 2d 3e 70 46  =pPg->pPager->pF
13ba0 69 72 73 74 53 79 6e 63 65 64 20 29 7b 0a 20 20  irstSynced ){.  
13bb0 20 20 20 20 50 67 48 64 72 20 2a 70 20 3d 20 70      PgHdr *p = p
13bc0 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 3b 0a 20  Pg->pNextFree;. 
13bd0 20 20 20 20 20 77 68 69 6c 65 28 20 70 20 26 26       while( p &&
13be0 20 70 2d 3e 6e 65 65 64 53 79 6e 63 20 29 7b 20   p->needSync ){ 
13bf0 70 20 3d 20 70 2d 3e 70 4e 65 78 74 46 72 65 65  p = p->pNextFree
13c00 3b 20 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 70  ; }.      pPg->p
13c10 50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e  Pager->pFirstSyn
13c20 63 65 64 20 3d 20 70 3b 0a 20 20 20 20 7d 0a 20  ced = p;.    }. 
13c30 20 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65     if( pPg->pPre
13c40 76 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70  vFree ){.      p
13c50 50 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70  Pg->pPrevFree->p
13c60 4e 65 78 74 46 72 65 65 20 3d 20 70 50 67 2d 3e  NextFree = pPg->
13c70 70 4e 65 78 74 46 72 65 65 3b 0a 20 20 20 20 7d  pNextFree;.    }
13c80 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 50 67 2d  else{.      pPg-
13c90 3e 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20  >pPager->pFirst 
13ca0 3d 20 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65  = pPg->pNextFree
13cb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
13cc0 70 50 67 2d 3e 70 4e 65 78 74 46 72 65 65 20 29  pPg->pNextFree )
13cd0 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70 4e 65  {.      pPg->pNe
13ce0 78 74 46 72 65 65 2d 3e 70 50 72 65 76 46 72 65  xtFree->pPrevFre
13cf0 65 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 46 72  e = pPg->pPrevFr
13d00 65 65 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ee;.    }else{. 
13d10 20 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72       pPg->pPager
13d20 2d 3e 70 4c 61 73 74 20 3d 20 70 50 67 2d 3e 70  ->pLast = pPg->p
13d30 50 72 65 76 46 72 65 65 3b 0a 20 20 20 20 7d 0a  PrevFree;.    }.
13d40 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
13d50 3e 6e 52 65 66 2b 2b 3b 0a 20 20 7d 0a 20 20 70  >nRef++;.  }.  p
13d60 50 67 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 52 45  Pg->nRef++;.  RE
13d70 46 49 4e 46 4f 28 70 50 67 29 3b 0a 7d 0a 23 69  FINFO(pPg);.}.#i
13d80 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
13d90 47 0a 20 20 73 74 61 74 69 63 20 76 6f 69 64 20  G.  static void 
13da0 70 61 67 65 5f 72 65 66 28 50 67 48 64 72 20 2a  page_ref(PgHdr *
13db0 70 50 67 29 7b 0a 20 20 20 20 69 66 28 20 70 50  pPg){.    if( pP
13dc0 67 2d 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20  g->nRef==0 ){.  
13dd0 20 20 20 20 5f 70 61 67 65 5f 72 65 66 28 70 50      _page_ref(pP
13de0 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
13df0 20 20 20 20 20 70 50 67 2d 3e 6e 52 65 66 2b 2b       pPg->nRef++
13e00 3b 0a 20 20 20 20 20 20 52 45 46 49 4e 46 4f 28  ;.      REFINFO(
13e10 70 50 67 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  pPg);.    }.  }.
13e20 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 70  #else.# define p
13e30 61 67 65 5f 72 65 66 28 50 29 20 20 20 28 28 50  age_ref(P)   ((P
13e40 29 2d 3e 6e 52 65 66 3d 3d 30 3f 5f 70 61 67 65  )->nRef==0?_page
13e50 5f 72 65 66 28 50 29 3a 28 76 6f 69 64 29 28 50  _ref(P):(void)(P
13e60 29 2d 3e 6e 52 65 66 2b 2b 29 0a 23 65 6e 64 69  )->nRef++).#endi
13e70 66 0a 0a 2f 2a 0a 2a 2a 20 49 6e 63 72 65 6d 65  f../*.** Increme
13e80 6e 74 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  nt the reference
13e90 20 63 6f 75 6e 74 20 66 6f 72 20 61 20 70 61 67   count for a pag
13ea0 65 2e 20 20 54 68 65 20 69 6e 70 75 74 20 70 6f  e.  The input po
13eb0 69 6e 74 65 72 20 69 73 0a 2a 2a 20 61 20 72 65  inter is.** a re
13ec0 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 70  ference to the p
13ed0 61 67 65 20 64 61 74 61 2e 0a 2a 2f 0a 69 6e 74  age data..*/.int
13ee0 20 73 71 6c 69 74 65 33 50 61 67 65 72 52 65 66   sqlite3PagerRef
13ef0 28 44 62 50 61 67 65 20 2a 70 50 67 29 7b 0a 20  (DbPage *pPg){. 
13f00 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b 0a   page_ref(pPg);.
13f10 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
13f20 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 79 6e  OK;.}../*.** Syn
13f30 63 20 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 20 20  c the journal.  
13f40 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
13f50 6d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 74 68  make sure all th
13f60 65 20 70 61 67 65 73 20 74 68 61 74 20 68 61 76  e pages that hav
13f70 65 0a 2a 2a 20 62 65 65 6e 20 77 72 69 74 74 65  e.** been writte
13f80 6e 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  n to the journal
13f90 20 68 61 76 65 20 61 63 74 75 61 6c 6c 79 20 72   have actually r
13fa0 65 61 63 68 65 64 20 74 68 65 20 73 75 72 66 61  eached the surfa
13fb0 63 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64 69 73  ce of the.** dis
13fc0 6b 2e 20 20 49 74 20 69 73 20 6e 6f 74 20 73 61  k.  It is not sa
13fd0 66 65 20 74 6f 20 6d 6f 64 69 66 79 20 74 68 65  fe to modify the
13fe0 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62 61   original databa
13ff0 73 65 20 66 69 6c 65 20 75 6e 74 69 6c 20 61 66  se file until af
14000 74 65 72 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e  ter.** the journ
14010 61 6c 20 68 61 73 20 62 65 65 6e 20 73 79 6e 63  al has been sync
14020 65 64 2e 20 20 49 66 20 74 68 65 20 6f 72 69 67  ed.  If the orig
14030 69 6e 61 6c 20 64 61 74 61 62 61 73 65 20 69 73  inal database is
14040 20 6d 6f 64 69 66 69 65 64 20 62 65 66 6f 72 65   modified before
14050 0a 2a 2a 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  .** the journal 
14060 69 73 20 73 79 6e 63 65 64 20 61 6e 64 20 61 20  is synced and a 
14070 70 6f 77 65 72 20 66 61 69 6c 75 72 65 20 6f 63  power failure oc
14080 63 75 72 73 2c 20 74 68 65 20 75 6e 73 79 6e 63  curs, the unsync
14090 65 64 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20 64 61  ed journal.** da
140a0 74 61 20 77 6f 75 6c 64 20 62 65 20 6c 6f 73 74  ta would be lost
140b0 20 61 6e 64 20 77 65 20 77 6f 75 6c 64 20 62 65   and we would be
140c0 20 75 6e 61 62 6c 65 20 74 6f 20 63 6f 6d 70 6c   unable to compl
140d0 65 74 65 6c 79 20 72 6f 6c 6c 62 61 63 6b 20 74  etely rollback t
140e0 68 65 0a 2a 2a 20 64 61 74 61 62 61 73 65 20 63  he.** database c
140f0 68 61 6e 67 65 73 2e 20 20 44 61 74 61 62 61 73  hanges.  Databas
14100 65 20 63 6f 72 72 75 70 74 69 6f 6e 20 77 6f 75  e corruption wou
14110 6c 64 20 6f 63 63 75 72 2e 0a 2a 2a 20 0a 2a 2a  ld occur..** .**
14120 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
14130 73 6f 20 75 70 64 61 74 65 73 20 74 68 65 20 6e  so updates the n
14140 52 65 63 20 66 69 65 6c 64 20 69 6e 20 74 68 65  Rec field in the
14150 20 68 65 61 64 65 72 20 6f 66 20 74 68 65 20 6a   header of the j
14160 6f 75 72 6e 61 6c 2e 0a 2a 2a 20 28 53 65 65 20  ournal..** (See 
14170 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  comments on the 
14180 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 29  pager_playback()
14190 20 72 6f 75 74 69 6e 65 20 66 6f 72 20 61 64 64   routine for add
141a0 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
141b0 69 6f 6e 2e 29 0a 2a 2a 20 49 66 20 74 68 65 20  ion.).** If the 
141c0 73 79 6e 63 20 6d 6f 64 65 20 69 73 20 46 55 4c  sync mode is FUL
141d0 4c 2c 20 74 77 6f 20 73 79 6e 63 73 20 77 69 6c  L, two syncs wil
141e0 6c 20 6f 63 63 75 72 2e 20 20 46 69 72 73 74 20  l occur.  First 
141f0 74 68 65 20 77 68 6f 6c 65 20 6a 6f 75 72 6e 61  the whole journa
14200 6c 0a 2a 2a 20 69 73 20 73 79 6e 63 65 64 2c 20  l.** is synced, 
14210 74 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  then the nRec fi
14220 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 2c 20  eld is updated, 
14230 74 68 65 6e 20 61 20 73 65 63 6f 6e 64 20 73 79  then a second sy
14240 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a 0a 2a 2a  nc occurs..**.**
14250 20 46 6f 72 20 74 65 6d 70 6f 72 61 72 79 20 64   For temporary d
14260 61 74 61 62 61 73 65 73 2c 20 77 65 20 64 6f 20  atabases, we do 
14270 6e 6f 74 20 63 61 72 65 20 69 66 20 77 65 20 61  not care if we a
14280 72 65 20 61 62 6c 65 20 74 6f 20 72 6f 6c 6c 62  re able to rollb
14290 61 63 6b 0a 2a 2a 20 61 66 74 65 72 20 61 20 70  ack.** after a p
142a0 6f 77 65 72 20 66 61 69 6c 75 72 65 2c 20 73 6f  ower failure, so
142b0 20 73 79 6e 63 20 6f 63 63 75 72 73 2e 0a 2a 2a   sync occurs..**
142c0 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
142d0 20 63 6c 65 61 72 73 20 74 68 65 20 6e 65 65 64   clears the need
142e0 53 79 6e 63 20 66 69 65 6c 64 20 6f 66 20 65 76  Sync field of ev
142f0 65 72 79 20 70 61 67 65 20 63 75 72 72 65 6e 74  ery page current
14300 20 68 65 6c 64 20 69 6e 0a 2a 2a 20 6d 65 6d 6f   held in.** memo
14310 72 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ry..*/.static in
14320 74 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28 50 61  t syncJournal(Pa
14330 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
14340 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 69 6e  PgHdr *pPg;.  in
14350 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
14360 3b 0a 0a 20 20 2f 2a 20 53 79 6e 63 20 74 68 65  ;..  /* Sync the
14370 20 6a 6f 75 72 6e 61 6c 20 62 65 66 6f 72 65 20   journal before 
14380 6d 6f 64 69 66 79 69 6e 67 20 74 68 65 20 6d 61  modifying the ma
14390 69 6e 20 64 61 74 61 62 61 73 65 0a 20 20 2a 2a  in database.  **
143a0 20 28 61 73 73 75 6d 69 6e 67 20 74 68 65 72 65   (assuming there
143b0 20 69 73 20 61 20 6a 6f 75 72 6e 61 6c 20 61 6e   is a journal an
143c0 64 20 69 74 20 6e 65 65 64 73 20 74 6f 20 62 65  d it needs to be
143d0 20 73 79 6e 63 65 64 2e 29 0a 20 20 2a 2f 0a 20   synced.).  */. 
143e0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6e 65 65   if( pPager->nee
143f0 64 53 79 6e 63 20 29 7b 0a 20 20 20 20 69 66 28  dSync ){.    if(
14400 20 21 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69   !pPager->tempFi
14410 6c 65 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65  le ){.      asse
14420 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
14430 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 20 20 20  nalOpen );.     
14440 20 2f 2a 20 61 73 73 65 72 74 28 20 21 70 50 61   /* assert( !pPa
14450 67 65 72 2d 3e 6e 6f 53 79 6e 63 20 29 3b 20 2f  ger->noSync ); /
14460 2f 20 6e 6f 53 79 6e 63 20 6d 69 67 68 74 20 62  / noSync might b
14470 65 20 73 65 74 20 69 66 20 73 79 6e 63 68 72 6f  e set if synchro
14480 6e 6f 75 73 0a 20 20 20 20 20 20 2a 2a 20 77 61  nous.      ** wa
14490 73 20 74 75 72 6e 65 64 20 6f 66 66 20 61 66 74  s turned off aft
144a0 65 72 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  er the transacti
144b0 6f 6e 20 77 61 73 20 73 74 61 72 74 65 64 2e 20  on was started. 
144c0 20 54 69 63 6b 65 74 20 23 36 31 35 20 2a 2f 0a   Ticket #615 */.
144d0 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
144e0 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 2f       {.        /
144f0 2a 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20  * Make sure the 
14500 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 63 6f 75  pPager->nRec cou
14510 6e 74 65 72 20 77 65 20 61 72 65 20 6b 65 65 70  nter we are keep
14520 69 6e 67 20 61 67 72 65 65 73 0a 20 20 20 20 20  ing agrees.     
14530 20 20 20 2a 2a 20 77 69 74 68 20 74 68 65 20 6e     ** with the n
14540 52 65 63 20 63 6f 6d 70 75 74 65 64 20 66 72 6f  Rec computed fro
14550 6d 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74 68  m the size of th
14560 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 0a  e journal file..
14570 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
14580 20 20 20 69 36 34 20 6a 53 7a 3b 0a 20 20 20 20     i64 jSz;.    
14590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
145a0 4f 73 46 69 6c 65 53 69 7a 65 28 70 50 61 67 65  OsFileSize(pPage
145b0 72 2d 3e 6a 66 64 2c 20 26 6a 53 7a 29 3b 0a 20  r->jfd, &jSz);. 
145c0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30         if( rc!=0
145d0 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
145e0 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
145f0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
14600 3d 3d 6a 53 7a 20 29 3b 0a 20 20 20 20 20 20 7d  ==jSz );.      }
14610 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a  .#endif.      {.
14620 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65          /* Write
14630 20 74 68 65 20 6e 52 65 63 20 76 61 6c 75 65 20   the nRec value 
14640 69 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c  into the journal
14650 20 66 69 6c 65 20 68 65 61 64 65 72 2e 20 49 66   file header. If
14660 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 66   in.        ** f
14670 75 6c 6c 2d 73 79 6e 63 68 72 6f 6e 6f 75 73 20  ull-synchronous 
14680 6d 6f 64 65 2c 20 73 79 6e 63 20 74 68 65 20 6a  mode, sync the j
14690 6f 75 72 6e 61 6c 20 66 69 72 73 74 2e 20 54 68  ournal first. Th
146a0 69 73 20 65 6e 73 75 72 65 73 20 74 68 61 74 0a  is ensures that.
146b0 20 20 20 20 20 20 20 20 2a 2a 20 61 6c 6c 20 64          ** all d
146c0 61 74 61 20 68 61 73 20 72 65 61 6c 6c 79 20 68  ata has really h
146d0 69 74 20 74 68 65 20 64 69 73 6b 20 62 65 66 6f  it the disk befo
146e0 72 65 20 6e 52 65 63 20 69 73 20 75 70 64 61 74  re nRec is updat
146f0 65 64 20 74 6f 20 6d 61 72 6b 0a 20 20 20 20 20  ed to mark.     
14700 20 20 20 2a 2a 20 69 74 20 61 73 20 61 20 63 61     ** it as a ca
14710 6e 64 69 64 61 74 65 20 66 6f 72 20 72 6f 6c 6c  ndidate for roll
14720 62 61 63 6b 2e 20 0a 20 20 20 20 20 20 20 20 2a  back. .        *
14730 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  /.        if( pP
14740 61 67 65 72 2d 3e 66 75 6c 6c 53 79 6e 63 20 29  ager->fullSync )
14750 7b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  {.          PAGE
14760 52 54 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f  RTRACE2("SYNC jo
14770 75 72 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20  urnal of %d\n", 
14780 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 29  PAGERID(pPager))
14790 3b 0a 20 20 20 20 20 20 20 20 20 20 49 4f 54 52  ;.          IOTR
147a0 41 43 45 28 28 22 4a 53 59 4e 43 20 25 70 5c 6e  ACE(("JSYNC %p\n
147b0 22 2c 20 70 50 61 67 65 72 29 29 0a 20 20 20 20  ", pPager)).    
147c0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
147d0 65 33 4f 73 53 79 6e 63 28 70 50 61 67 65 72 2d  e3OsSync(pPager-
147e0 3e 6a 66 64 2c 20 30 29 3b 0a 20 20 20 20 20 20  >jfd, 0);.      
147f0 20 20 20 20 69 66 28 20 72 63 21 3d 30 20 29 20      if( rc!=0 ) 
14800 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20  return rc;.     
14810 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 63 20     }.        rc 
14820 3d 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28  = sqlite3OsSeek(
14830 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20 20  pPager->jfd,.   
14840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14850 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
14860 6a 6f 75 72 6e 61 6c 48 64 72 20 2b 20 73 69 7a  journalHdr + siz
14870 65 6f 66 28 61 4a 6f 75 72 6e 61 6c 4d 61 67 69  eof(aJournalMagi
14880 63 29 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  c));.        if(
14890 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
148a0 0a 20 20 20 20 20 20 20 20 49 4f 54 52 41 43 45  .        IOTRACE
148b0 28 28 22 4a 48 44 52 20 25 70 20 25 6c 6c 64 20  (("JHDR %p %lld 
148c0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 0a 20  %d\n", pPager,. 
148d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
148e0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
148f0 48 64 72 20 2b 20 73 69 7a 65 6f 66 28 61 4a 6f  Hdr + sizeof(aJo
14900 75 72 6e 61 6c 4d 61 67 69 63 29 2c 20 34 29 29  urnalMagic), 4))
14910 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 77 72  .        rc = wr
14920 69 74 65 33 32 62 69 74 73 28 70 50 61 67 65 72  ite32bits(pPager
14930 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 6e  ->jfd, pPager->n
14940 52 65 63 29 3b 0a 20 20 20 20 20 20 20 20 69 66  Rec);.        if
14950 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63  ( rc ) return rc
14960 3b 0a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ;..        rc = 
14970 73 71 6c 69 74 65 33 4f 73 53 65 65 6b 28 70 50  sqlite3OsSeek(pP
14980 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67 65  ager->jfd, pPage
14990 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 29 3b 0a  r->journalOff);.
149a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
149b0 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20   return rc;.    
149c0 20 20 7d 0a 20 20 20 20 20 20 50 41 47 45 52 54    }.      PAGERT
149d0 52 41 43 45 32 28 22 53 59 4e 43 20 6a 6f 75 72  RACE2("SYNC jour
149e0 6e 61 6c 20 6f 66 20 25 64 5c 6e 22 2c 20 50 41  nal of %d\n", PA
149f0 47 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a  GERID(pPager));.
14a00 20 20 20 20 20 20 49 4f 54 52 41 43 45 28 28 22        IOTRACE(("
14a10 4a 53 59 4e 43 20 25 70 5c 6e 22 2c 20 70 50 61  JSYNC %p\n", pPa
14a20 67 65 72 29 29 0a 20 20 20 20 20 20 72 63 20 3d  ger)).      rc =
14a30 20 73 71 6c 69 74 65 33 4f 73 53 79 6e 63 28 70   sqlite3OsSync(p
14a40 50 61 67 65 72 2d 3e 6a 66 64 2c 20 70 50 61 67  Pager->jfd, pPag
14a50 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
14a60 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 30  .      if( rc!=0
14a70 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
14a80 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72      pPager->jour
14a90 6e 61 6c 53 74 61 72 74 65 64 20 3d 20 31 3b 0a  nalStarted = 1;.
14aa0 20 20 20 20 7d 0a 20 20 20 20 70 50 61 67 65 72      }.    pPager
14ab0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a  ->needSync = 0;.
14ac0 0a 20 20 20 20 2f 2a 20 45 72 61 73 65 20 74 68  .    /* Erase th
14ad0 65 20 6e 65 65 64 53 79 6e 63 20 66 6c 61 67 20  e needSync flag 
14ae0 66 72 6f 6d 20 65 76 65 72 79 20 70 61 67 65 2e  from every page.
14af0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  .    */.    for(
14b00 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c  pPg=pPager->pAll
14b10 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67 2d 3e  ; pPg; pPg=pPg->
14b20 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20 20 20  pNextAll){.     
14b30 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
14b40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50   0;.    }.    pP
14b50 61 67 65 72 2d 3e 70 46 69 72 73 74 53 79 6e 63  ager->pFirstSync
14b60 65 64 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69  ed = pPager->pFi
14b70 72 73 74 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65  rst;.  }..#ifnde
14b80 66 20 4e 44 45 42 55 47 0a 20 20 2f 2a 20 49 66  f NDEBUG.  /* If
14b90 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65 64 53   the Pager.needS
14ba0 79 6e 63 20 66 6c 61 67 20 69 73 20 63 6c 65 61  ync flag is clea
14bb0 72 20 74 68 65 6e 20 74 68 65 20 50 67 48 64 72  r then the PgHdr
14bc0 2e 6e 65 65 64 53 79 6e 63 0a 20 20 2a 2a 20 66  .needSync.  ** f
14bd0 6c 61 67 20 6d 75 73 74 20 61 6c 73 6f 20 62 65  lag must also be
14be0 20 63 6c 65 61 72 20 66 6f 72 20 61 6c 6c 20 70   clear for all p
14bf0 61 67 65 73 2e 20 20 56 65 72 69 66 79 20 74 68  ages.  Verify th
14c00 61 74 20 74 68 69 73 0a 20 20 2a 2a 20 69 6e 76  at this.  ** inv
14c10 61 72 69 61 6e 74 20 69 73 20 74 72 75 65 2e 0a  ariant is true..
14c20 20 20 2a 2f 0a 20 20 65 6c 73 65 7b 0a 20 20 20    */.  else{.   
14c30 20 66 6f 72 28 70 50 67 3d 70 50 61 67 65 72 2d   for(pPg=pPager-
14c40 3e 70 41 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d  >pAll; pPg; pPg=
14c50 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a  pPg->pNextAll){.
14c60 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
14c70 67 2d 3e 6e 65 65 64 53 79 6e 63 3d 3d 30 20 29  g->needSync==0 )
14c80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
14c90 72 74 28 20 70 50 61 67 65 72 2d 3e 70 46 69 72  rt( pPager->pFir
14ca0 73 74 53 79 6e 63 65 64 3d 3d 70 50 61 67 65 72  stSynced==pPager
14cb0 2d 3e 70 46 69 72 73 74 20 29 3b 0a 20 20 7d 0a  ->pFirst );.  }.
14cc0 23 65 6e 64 69 66 0a 0a 20 20 72 65 74 75 72 6e  #endif..  return
14cd0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 65   rc;.}../*.** Me
14ce0 72 67 65 20 74 77 6f 20 6c 69 73 74 73 20 6f 66  rge two lists of
14cf0 20 70 61 67 65 73 20 63 6f 6e 6e 65 63 74 65 64   pages connected
14d00 20 62 79 20 70 44 69 72 74 79 20 61 6e 64 20 69   by pDirty and i
14d10 6e 20 70 67 6e 6f 20 6f 72 64 65 72 2e 0a 2a 2a  n pgno order..**
14d20 20 44 6f 20 6e 6f 74 20 62 6f 74 68 20 66 69 78   Do not both fix
14d30 69 6e 67 20 74 68 65 20 70 50 72 65 76 44 69 72  ing the pPrevDir
14d40 74 79 20 70 6f 69 6e 74 65 72 73 2e 0a 2a 2f 0a  ty pointers..*/.
14d50 73 74 61 74 69 63 20 50 67 48 64 72 20 2a 6d 65  static PgHdr *me
14d60 72 67 65 5f 70 61 67 65 6c 69 73 74 28 50 67 48  rge_pagelist(PgH
14d70 64 72 20 2a 70 41 2c 20 50 67 48 64 72 20 2a 70  dr *pA, PgHdr *p
14d80 42 29 7b 0a 20 20 50 67 48 64 72 20 72 65 73 75  B){.  PgHdr resu
14d90 6c 74 2c 20 2a 70 54 61 69 6c 3b 0a 20 20 70 54  lt, *pTail;.  pT
14da0 61 69 6c 20 3d 20 26 72 65 73 75 6c 74 3b 0a 20  ail = &result;. 
14db0 20 77 68 69 6c 65 28 20 70 41 20 26 26 20 70 42   while( pA && pB
14dc0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
14dd0 70 67 6e 6f 3c 70 42 2d 3e 70 67 6e 6f 20 29 7b  pgno<pB->pgno ){
14de0 0a 20 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  .      pTail->pD
14df0 69 72 74 79 20 3d 20 70 41 3b 0a 20 20 20 20 20  irty = pA;.     
14e00 20 70 54 61 69 6c 20 3d 20 70 41 3b 0a 20 20 20   pTail = pA;.   
14e10 20 20 20 70 41 20 3d 20 70 41 2d 3e 70 44 69 72     pA = pA->pDir
14e20 74 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ty;.    }else{. 
14e30 20 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69 72       pTail->pDir
14e40 74 79 20 3d 20 70 42 3b 0a 20 20 20 20 20 20 70  ty = pB;.      p
14e50 54 61 69 6c 20 3d 20 70 42 3b 0a 20 20 20 20 20  Tail = pB;.     
14e60 20 70 42 20 3d 20 70 42 2d 3e 70 44 69 72 74 79   pB = pB->pDirty
14e70 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66  ;.    }.  }.  if
14e80 28 20 70 41 20 29 7b 0a 20 20 20 20 70 54 61 69  ( pA ){.    pTai
14e90 6c 2d 3e 70 44 69 72 74 79 20 3d 20 70 41 3b 0a  l->pDirty = pA;.
14ea0 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 20 29    }else if( pB )
14eb0 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44 69  {.    pTail->pDi
14ec0 72 74 79 20 3d 20 70 42 3b 0a 20 20 7d 65 6c 73  rty = pB;.  }els
14ed0 65 7b 0a 20 20 20 20 70 54 61 69 6c 2d 3e 70 44  e{.    pTail->pD
14ee0 69 72 74 79 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  irty = 0;.  }.  
14ef0 72 65 74 75 72 6e 20 72 65 73 75 6c 74 2e 70 44  return result.pD
14f00 69 72 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  irty;.}../*.** S
14f10 6f 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ort the list of 
14f20 70 61 67 65 73 20 69 6e 20 61 63 63 65 6e 64 69  pages in accendi
14f30 6e 67 20 6f 72 64 65 72 20 62 79 20 70 67 6e 6f  ng order by pgno
14f40 2e 20 20 50 61 67 65 73 20 61 72 65 0a 2a 2a 20  .  Pages are.** 
14f50 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 70 44 69  connected by pDi
14f60 72 74 79 20 70 6f 69 6e 74 65 72 73 2e 20 20 54  rty pointers.  T
14f70 68 65 20 70 50 72 65 76 44 69 72 74 79 20 70 6f  he pPrevDirty po
14f80 69 6e 74 65 72 73 20 61 72 65 0a 2a 2a 20 63 6f  inters are.** co
14f90 72 72 75 70 74 65 64 20 62 79 20 74 68 69 73 20  rrupted by this 
14fa0 73 6f 72 74 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  sort..*/.#define
14fb0 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41   N_SORT_BUCKET_A
14fc0 4c 4c 4f 43 20 32 35 0a 23 64 65 66 69 6e 65 20  LLOC 25.#define 
14fd0 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20 20 20  N_SORT_BUCKET   
14fe0 20 20 20 20 32 35 0a 23 69 66 64 65 66 20 53 51      25.#ifdef SQ
14ff0 4c 49 54 45 5f 54 45 53 54 0a 20 20 69 6e 74 20  LITE_TEST.  int 
15000 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f  sqlite3_pager_n_
15010 73 6f 72 74 5f 62 75 63 6b 65 74 20 3d 20 30 3b  sort_bucket = 0;
15020 0a 20 20 23 75 6e 64 65 66 20 4e 5f 53 4f 52 54  .  #undef N_SORT
15030 5f 42 55 43 4b 45 54 0a 20 20 23 64 65 66 69 6e  _BUCKET.  #defin
15040 65 20 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 20  e N_SORT_BUCKET 
15050 5c 0a 20 20 20 28 73 71 6c 69 74 65 33 5f 70 61  \.   (sqlite3_pa
15060 67 65 72 5f 6e 5f 73 6f 72 74 5f 62 75 63 6b 65  ger_n_sort_bucke
15070 74 3f 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  t?sqlite3_pager_
15080 6e 5f 73 6f 72 74 5f 62 75 63 6b 65 74 3a 4e 5f  n_sort_bucket:N_
15090 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
150a0 43 29 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63  C).#endif.static
150b0 20 50 67 48 64 72 20 2a 73 6f 72 74 5f 70 61 67   PgHdr *sort_pag
150c0 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 49 6e  elist(PgHdr *pIn
150d0 29 7b 0a 20 20 50 67 48 64 72 20 2a 61 5b 4e 5f  ){.  PgHdr *a[N_
150e0 53 4f 52 54 5f 42 55 43 4b 45 54 5f 41 4c 4c 4f  SORT_BUCKET_ALLO
150f0 43 5d 2c 20 2a 70 3b 0a 20 20 69 6e 74 20 69 3b  C], *p;.  int i;
15100 0a 20 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20  .  memset(a, 0, 
15110 73 69 7a 65 6f 66 28 61 29 29 3b 0a 20 20 77 68  sizeof(a));.  wh
15120 69 6c 65 28 20 70 49 6e 20 29 7b 0a 20 20 20 20  ile( pIn ){.    
15130 70 20 3d 20 70 49 6e 3b 0a 20 20 20 20 70 49 6e  p = pIn;.    pIn
15140 20 3d 20 70 2d 3e 70 44 69 72 74 79 3b 0a 20 20   = p->pDirty;.  
15150 20 20 70 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b    p->pDirty = 0;
15160 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
15170 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 2d 31 3b  N_SORT_BUCKET-1;
15180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
15190 20 61 5b 69 5d 3d 3d 30 20 29 7b 0a 20 20 20 20   a[i]==0 ){.    
151a0 20 20 20 20 61 5b 69 5d 20 3d 20 70 3b 0a 20 20      a[i] = p;.  
151b0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
151c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
151d0 20 20 70 20 3d 20 6d 65 72 67 65 5f 70 61 67 65    p = merge_page
151e0 6c 69 73 74 28 61 5b 69 5d 2c 20 70 29 3b 0a 20  list(a[i], p);. 
151f0 20 20 20 20 20 20 20 61 5b 69 5d 20 3d 20 30 3b         a[i] = 0;
15200 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
15210 20 20 20 69 66 28 20 69 3d 3d 4e 5f 53 4f 52 54     if( i==N_SORT
15220 5f 42 55 43 4b 45 54 2d 31 20 29 7b 0a 20 20 20  _BUCKET-1 ){.   
15230 20 20 20 2f 2a 20 43 6f 76 65 72 61 67 65 3a 20     /* Coverage: 
15240 54 6f 20 67 65 74 20 68 65 72 65 2c 20 74 68 65  To get here, the
15250 72 65 20 6e 65 65 64 20 74 6f 20 62 65 20 32 5e  re need to be 2^
15260 28 4e 5f 53 4f 52 54 5f 42 55 43 4b 45 54 29 20  (N_SORT_BUCKET) 
15270 0a 20 20 20 20 20 20 2a 2a 20 65 6c 65 6d 65 6e  .      ** elemen
15280 74 73 20 69 6e 20 74 68 65 20 69 6e 70 75 74 20  ts in the input 
15290 6c 69 73 74 2e 20 54 68 69 73 20 69 73 20 70 6f  list. This is po
152a0 73 73 69 62 6c 65 2c 20 62 75 74 20 69 6d 70 72  ssible, but impr
152b0 61 63 74 69 63 61 6c 2e 0a 20 20 20 20 20 20 2a  actical..      *
152c0 2a 20 54 65 73 74 69 6e 67 20 74 68 69 73 20 6c  * Testing this l
152d0 69 6e 65 20 69 73 20 74 68 65 20 70 6f 69 6e 74  ine is the point
152e0 20 6f 66 20 67 6c 6f 62 61 6c 20 76 61 72 69 61   of global varia
152f0 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 73 71 6c  ble.      ** sql
15300 69 74 65 33 5f 70 61 67 65 72 5f 6e 5f 73 6f 72  ite3_pager_n_sor
15310 74 5f 62 75 63 6b 65 74 2e 0a 20 20 20 20 20 20  t_bucket..      
15320 2a 2f 0a 20 20 20 20 20 20 61 5b 69 5d 20 3d 20  */.      a[i] = 
15330 6d 65 72 67 65 5f 70 61 67 65 6c 69 73 74 28 61  merge_pagelist(a
15340 5b 69 5d 2c 20 70 29 3b 0a 20 20 20 20 7d 0a 20  [i], p);.    }. 
15350 20 7d 0a 20 20 70 20 3d 20 61 5b 30 5d 3b 0a 20   }.  p = a[0];. 
15360 20 66 6f 72 28 69 3d 31 3b 20 69 3c 4e 5f 53 4f   for(i=1; i<N_SO
15370 52 54 5f 42 55 43 4b 45 54 3b 20 69 2b 2b 29 7b  RT_BUCKET; i++){
15380 0a 20 20 20 20 70 20 3d 20 6d 65 72 67 65 5f 70  .    p = merge_p
15390 61 67 65 6c 69 73 74 28 70 2c 20 61 5b 69 5d 29  agelist(p, a[i])
153a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
153b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
153c0 20 61 20 6c 69 73 74 20 6f 66 20 70 61 67 65 73   a list of pages
153d0 20 28 63 6f 6e 6e 65 63 74 65 64 20 62 79 20 74   (connected by t
153e0 68 65 20 50 67 48 64 72 2e 70 44 69 72 74 79 20  he PgHdr.pDirty 
153f0 70 6f 69 6e 74 65 72 29 20 77 72 69 74 65 0a 2a  pointer) write.*
15400 2a 20 65 76 65 72 79 20 6f 6e 65 20 6f 66 20 74  * every one of t
15410 68 6f 73 65 20 70 61 67 65 73 20 6f 75 74 20 74  hose pages out t
15420 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  o the database f
15430 69 6c 65 20 61 6e 64 20 6d 61 72 6b 20 74 68 65  ile and mark the
15440 6d 20 61 6c 6c 0a 2a 2a 20 61 73 20 63 6c 65 61  m all.** as clea
15450 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
15460 20 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67   pager_write_pag
15470 65 6c 69 73 74 28 50 67 48 64 72 20 2a 70 4c 69  elist(PgHdr *pLi
15480 73 74 29 7b 0a 20 20 50 61 67 65 72 20 2a 70 50  st){.  Pager *pP
15490 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  ager;.  int rc;.
154a0 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
154b0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
154c0 4f 4b 3b 0a 20 20 70 50 61 67 65 72 20 3d 20 70  OK;.  pPager = p
154d0 4c 69 73 74 2d 3e 70 50 61 67 65 72 3b 0a 0a 20  List->pPager;.. 
154e0 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
154f0 74 20 74 68 65 72 65 20 6d 61 79 20 62 65 20 65  t there may be e
15500 69 74 68 65 72 20 61 20 52 45 53 45 52 56 45 44  ither a RESERVED
15510 20 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f   or EXCLUSIVE lo
15520 63 6b 20 6f 6e 20 74 68 65 0a 20 20 2a 2a 20 64  ck on the.  ** d
15530 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 49 66  atabase file. If
15540 20 74 68 65 72 65 20 69 73 20 61 6c 72 65 61 64   there is alread
15550 79 20 61 6e 20 45 58 43 4c 55 53 49 56 45 20 6c  y an EXCLUSIVE l
15560 6f 63 6b 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ock, the followi
15570 6e 67 0a 20 20 2a 2a 20 63 61 6c 6c 73 20 74 6f  ng.  ** calls to
15580 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 29   sqlite3OsLock()
15590 20 61 72 65 20 6e 6f 2d 6f 70 73 2e 0a 20 20 2a   are no-ops..  *
155a0 2a 0a 20 20 2a 2a 20 4d 6f 76 69 6e 67 20 74 68  *.  ** Moving th
155b0 65 20 6c 6f 63 6b 20 66 72 6f 6d 20 52 45 53 45  e lock from RESE
155c0 52 56 45 44 20 74 6f 20 45 58 43 4c 55 53 49 56  RVED to EXCLUSIV
155d0 45 20 61 63 74 75 61 6c 6c 79 20 69 6e 76 6f 6c  E actually invol
155e0 76 65 73 20 67 6f 69 6e 67 0a 20 20 2a 2a 20 74  ves going.  ** t
155f0 68 72 6f 75 67 68 20 61 6e 20 69 6e 74 65 72 6d  hrough an interm
15600 65 64 69 61 74 65 20 73 74 61 74 65 20 50 45 4e  ediate state PEN
15610 44 49 4e 47 2e 20 20 20 41 20 50 45 4e 44 49 4e  DING.   A PENDIN
15620 47 20 6c 6f 63 6b 20 70 72 65 76 65 6e 74 73 20  G lock prevents 
15630 6e 65 77 0a 20 20 2a 2a 20 72 65 61 64 65 72 73  new.  ** readers
15640 20 66 72 6f 6d 20 61 74 74 61 63 68 69 6e 67 20   from attaching 
15650 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
15660 62 75 74 20 69 73 20 75 6e 73 75 66 66 69 63 69  but is unsuffici
15670 65 6e 74 20 66 6f 72 20 75 73 20 74 6f 0a 20 20  ent for us to.  
15680 2a 2a 20 77 72 69 74 65 2e 20 20 54 68 65 20 69  ** write.  The i
15690 64 65 61 20 6f 66 20 61 20 50 45 4e 44 49 4e 47  dea of a PENDING
156a0 20 6c 6f 63 6b 20 69 73 20 74 6f 20 70 72 65 76   lock is to prev
156b0 65 6e 74 20 6e 65 77 20 72 65 61 64 65 72 73 20  ent new readers 
156c0 66 72 6f 6d 0a 20 20 2a 2a 20 63 6f 6d 69 6e 67  from.  ** coming
156d0 20 69 6e 20 77 68 69 6c 65 20 77 65 20 77 61 69   in while we wai
156e0 74 20 66 6f 72 20 65 78 69 73 74 69 6e 67 20 72  t for existing r
156f0 65 61 64 65 72 73 20 74 6f 20 63 6c 65 61 72 2e  eaders to clear.
15700 0a 20 20 2a 2a 0a 20 20 2a 2a 20 57 68 69 6c 65  .  **.  ** While
15710 20 74 68 65 20 70 61 67 65 72 20 69 73 20 69 6e   the pager is in
15720 20 74 68 65 20 52 45 53 45 52 56 45 44 20 73 74   the RESERVED st
15730 61 74 65 2c 20 74 68 65 20 6f 72 69 67 69 6e 61  ate, the origina
15740 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 0a  l database file.
15750 20 20 2a 2a 20 69 73 20 75 6e 63 68 61 6e 67 65    ** is unchange
15760 64 20 61 6e 64 20 77 65 20 63 61 6e 20 72 6f 6c  d and we can rol
15770 6c 62 61 63 6b 20 77 69 74 68 6f 75 74 20 68 61  lback without ha
15780 76 69 6e 67 20 74 6f 20 70 6c 61 79 62 61 63 6b  ving to playback
15790 20 74 68 65 0a 20 20 2a 2a 20 6a 6f 75 72 6e 61   the.  ** journa
157a0 6c 20 69 6e 74 6f 20 74 68 65 20 6f 72 69 67 69  l into the origi
157b0 6e 61 6c 20 64 61 74 61 62 61 73 65 20 66 69 6c  nal database fil
157c0 65 2e 20 20 4f 6e 63 65 20 77 65 20 74 72 61 6e  e.  Once we tran
157d0 73 69 74 69 6f 6e 20 74 6f 0a 20 20 2a 2a 20 45  sition to.  ** E
157e0 58 43 4c 55 53 49 56 45 2c 20 69 74 20 6d 65 61  XCLUSIVE, it mea
157f0 6e 73 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ns the database 
15800 66 69 6c 65 20 68 61 73 20 62 65 65 6e 20 63 68  file has been ch
15810 61 6e 67 65 64 20 61 6e 64 20 61 6e 79 20 72 6f  anged and any ro
15820 6c 6c 62 61 63 6b 0a 20 20 2a 2a 20 77 69 6c 6c  llback.  ** will
15830 20 72 65 71 75 69 72 65 20 61 20 6a 6f 75 72 6e   require a journ
15840 61 6c 20 70 6c 61 79 62 61 63 6b 2e 0a 20 20 2a  al playback..  *
15850 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f 77  /.  rc = pager_w
15860 61 69 74 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67  ait_on_lock(pPag
15870 65 72 2c 20 45 58 43 4c 55 53 49 56 45 5f 4c 4f  er, EXCLUSIVE_LO
15880 43 4b 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  CK);.  if( rc!=S
15890 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
158a0 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a  return rc;.  }..
158b0 20 20 70 4c 69 73 74 20 3d 20 73 6f 72 74 5f 70    pList = sort_p
158c0 61 67 65 6c 69 73 74 28 70 4c 69 73 74 29 3b 0a  agelist(pList);.
158d0 20 20 77 68 69 6c 65 28 20 70 4c 69 73 74 20 29    while( pList )
158e0 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c  {.    assert( pL
158f0 69 73 74 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20  ist->dirty );.  
15900 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
15910 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64 2c  Seek(pPager->fd,
15920 20 28 70 4c 69 73 74 2d 3e 70 67 6e 6f 2d 31 29   (pList->pgno-1)
15930 2a 28 69 36 34 29 70 50 61 67 65 72 2d 3e 70 61  *(i64)pPager->pa
15940 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 69 66 28  geSize);.    if(
15950 20 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b   rc ) return rc;
15960 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65  .    /* If there
15970 20 61 72 65 20 64 69 72 74 79 20 70 61 67 65 73   are dirty pages
15980 20 69 6e 20 74 68 65 20 70 61 67 65 20 63 61 63   in the page cac
15990 68 65 20 77 69 74 68 20 70 61 67 65 20 6e 75 6d  he with page num
159a0 62 65 72 73 20 67 72 65 61 74 65 72 0a 20 20 20  bers greater.   
159b0 20 2a 2a 20 74 68 61 6e 20 50 61 67 65 72 2e 64   ** than Pager.d
159c0 62 53 69 7a 65 2c 20 74 68 69 73 20 6d 65 61 6e  bSize, this mean
159d0 73 20 73 71 6c 69 74 65 33 50 61 67 65 72 54 72  s sqlite3PagerTr
159e0 75 6e 63 61 74 65 28 29 20 77 61 73 20 63 61 6c  uncate() was cal
159f0 6c 65 64 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61  led to.    ** ma
15a00 6b 65 20 74 68 65 20 66 69 6c 65 20 73 6d 61 6c  ke the file smal
15a10 6c 65 72 20 28 70 72 65 73 75 6d 61 62 6c 79 20  ler (presumably 
15a20 62 79 20 61 75 74 6f 2d 76 61 63 75 75 6d 20 63  by auto-vacuum c
15a30 6f 64 65 29 2e 20 44 6f 20 6e 6f 74 20 77 72 69  ode). Do not wri
15a40 74 65 0a 20 20 20 20 2a 2a 20 61 6e 79 20 73 75  te.    ** any su
15a50 63 68 20 70 61 67 65 73 20 74 6f 20 74 68 65 20  ch pages to the 
15a60 66 69 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  file..    */.   
15a70 20 69 66 28 20 70 4c 69 73 74 2d 3e 70 67 6e 6f   if( pList->pgno
15a80 3c 3d 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  <=pPager->dbSize
15a90 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
15aa0 70 44 61 74 61 20 3d 20 43 4f 44 45 43 32 28 70  pData = CODEC2(p
15ab0 50 61 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f  Pager, PGHDR_TO_
15ac0 44 41 54 41 28 70 4c 69 73 74 29 2c 20 70 4c 69  DATA(pList), pLi
15ad0 73 74 2d 3e 70 67 6e 6f 2c 20 36 29 3b 0a 20 20  st->pgno, 6);.  
15ae0 20 20 20 20 50 41 47 45 52 54 52 41 43 45 34 28      PAGERTRACE4(
15af0 22 53 54 4f 52 45 20 25 64 20 70 61 67 65 20 25  "STORE %d page %
15b00 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
15b10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
15b20 20 20 20 20 50 41 47 45 52 49 44 28 70 50 61 67      PAGERID(pPag
15b30 65 72 29 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f  er), pList->pgno
15b40 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
15b50 28 70 4c 69 73 74 29 29 3b 0a 20 20 20 20 20 20  (pList));.      
15b60 49 4f 54 52 41 43 45 28 28 22 50 47 4f 55 54 20  IOTRACE(("PGOUT 
15b70 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72  %p %d\n", pPager
15b80 2c 20 70 4c 69 73 74 2d 3e 70 67 6e 6f 29 29 3b  , pList->pgno));
15b90 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
15ba0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
15bb0 72 2d 3e 66 64 2c 20 70 44 61 74 61 2c 20 70 50  r->fd, pData, pP
15bc0 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b  ager->pageSize);
15bd0 0a 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43  .      PAGER_INC
15be0 52 28 73 71 6c 69 74 65 33 5f 70 61 67 65 72 5f  R(sqlite3_pager_
15bf0 77 72 69 74 65 64 62 5f 63 6f 75 6e 74 29 3b 0a  writedb_count);.
15c00 20 20 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52        PAGER_INCR
15c10 28 70 50 61 67 65 72 2d 3e 6e 57 72 69 74 65 29  (pPager->nWrite)
15c20 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69 73  ;.      if( pLis
15c30 74 2d 3e 70 67 6e 6f 3d 3d 31 20 29 7b 0a 20 20  t->pgno==1 ){.  
15c40 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 50        memcpy(&pP
15c50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73  ager->dbFileVers
15c60 2c 20 26 70 44 61 74 61 5b 32 34 5d 2c 20 73 69  , &pData[24], si
15c70 7a 65 6f 66 28 70 50 61 67 65 72 2d 3e 64 62 46  zeof(pPager->dbF
15c80 69 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20  ileVers));.     
15c90 20 7d 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66   }.    }.#ifndef
15ca0 20 4e 44 45 42 55 47 0a 20 20 20 20 65 6c 73 65   NDEBUG.    else
15cb0 7b 0a 20 20 20 20 20 20 50 41 47 45 52 54 52 41  {.      PAGERTRA
15cc0 43 45 33 28 22 4e 4f 53 54 4f 52 45 20 25 64 20  CE3("NOSTORE %d 
15cd0 70 61 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45  page %d\n", PAGE
15ce0 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 4c 69  RID(pPager), pLi
15cf0 73 74 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 7d  st->pgno);.    }
15d00 0a 23 65 6e 64 69 66 0a 20 20 20 20 69 66 28 20  .#endif.    if( 
15d10 72 63 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  rc ) return rc;.
15d20 20 20 20 20 70 4c 69 73 74 2d 3e 64 69 72 74 79      pList->dirty
15d30 20 3d 20 30 3b 0a 23 69 66 64 65 66 20 53 51 4c   = 0;.#ifdef SQL
15d40 49 54 45 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a  ITE_CHECK_PAGES.
15d50 20 20 20 20 70 4c 69 73 74 2d 3e 70 61 67 65 48      pList->pageH
15d60 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67 65  ash = pager_page
15d70 68 61 73 68 28 70 4c 69 73 74 29 3b 0a 23 65 6e  hash(pList);.#en
15d80 64 69 66 0a 20 20 20 20 70 4c 69 73 74 20 3d 20  dif.    pList = 
15d90 70 4c 69 73 74 2d 3e 70 44 69 72 74 79 3b 0a 20  pList->pDirty;. 
15da0 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
15db0 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  TE_OK;.}../*.** 
15dc0 43 6f 6c 6c 65 63 74 20 65 76 65 72 79 20 64 69  Collect every di
15dd0 72 74 79 20 70 61 67 65 20 69 6e 74 6f 20 61 20  rty page into a 
15de0 64 69 72 74 79 20 6c 69 73 74 20 61 6e 64 0a 2a  dirty list and.*
15df0 2a 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * return a point
15e00 65 72 20 74 6f 20 74 68 65 20 68 65 61 64 20 6f  er to the head o
15e10 66 20 74 68 61 74 20 6c 69 73 74 2e 20 20 41 6c  f that list.  Al
15e20 6c 20 70 61 67 65 73 20 61 72 65 0a 2a 2a 20 63  l pages are.** c
15e30 6f 6c 6c 65 63 74 65 64 20 65 76 65 6e 20 69 66  ollected even if
15e40 20 74 68 65 79 20 61 72 65 20 73 74 69 6c 6c 20   they are still 
15e50 69 6e 20 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  in use..*/.stati
15e60 63 20 50 67 48 64 72 20 2a 70 61 67 65 72 5f 67  c PgHdr *pager_g
15e70 65 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67  et_all_dirty_pag
15e80 65 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  es(Pager *pPager
15e90 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
15ea0 65 72 2d 3e 70 44 69 72 74 79 3b 0a 7d 0a 0a 2f  er->pDirty;.}../
15eb0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
15ec0 20 69 66 20 74 68 65 72 65 20 69 73 20 61 20 68   if there is a h
15ed0 6f 74 20 6a 6f 75 72 6e 61 6c 20 6f 6e 20 74 68  ot journal on th
15ee0 65 20 67 69 76 65 6e 20 70 61 67 65 72 2e 0a 2a  e given pager..*
15ef0 2a 20 41 20 68 6f 74 20 6a 6f 75 72 6e 61 6c 20  * A hot journal 
15f00 69 73 20 6f 6e 65 20 74 68 61 74 20 6e 65 65 64  is one that need
15f10 73 20 74 6f 20 62 65 20 70 6c 61 79 65 64 20 62  s to be played b
15f20 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ack..**.** If th
15f30 65 20 63 75 72 72 65 6e 74 20 73 69 7a 65 20 6f  e current size o
15f40 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  f the database f
15f50 69 6c 65 20 69 73 20 30 20 62 75 74 20 61 20 6a  ile is 0 but a j
15f60 6f 75 72 6e 61 6c 20 66 69 6c 65 0a 2a 2a 20 65  ournal file.** e
15f70 78 69 73 74 73 2c 20 74 68 61 74 20 69 73 20 70  xists, that is p
15f80 72 6f 62 61 62 6c 79 20 61 6e 20 6f 6c 64 20 6a  robably an old j
15f90 6f 75 72 6e 61 6c 20 6c 65 66 74 20 6f 76 65 72  ournal left over
15fa0 20 66 72 6f 6d 20 61 20 70 72 69 6f 72 0a 2a 2a   from a prior.**
15fb0 20 64 61 74 61 62 61 73 65 20 77 69 74 68 20 74   database with t
15fc0 68 65 20 73 61 6d 65 20 6e 61 6d 65 2e 20 20 4a  he same name.  J
15fd0 75 73 74 20 64 65 6c 65 74 65 20 74 68 65 20 6a  ust delete the j
15fe0 6f 75 72 6e 61 6c 2e 0a 2a 2f 0a 73 74 61 74 69  ournal..*/.stati
15ff0 63 20 69 6e 74 20 68 61 73 48 6f 74 4a 6f 75 72  c int hasHotJour
16000 6e 61 6c 28 50 61 67 65 72 20 2a 70 50 61 67 65  nal(Pager *pPage
16010 72 29 7b 0a 20 20 69 66 28 20 21 70 50 61 67 65  r){.  if( !pPage
16020 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 20  r->useJournal ) 
16030 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
16040 21 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45 78  !sqlite3OsFileEx
16050 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a 6f  ists(pPager->zJo
16060 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 72 65  urnal) ){.    re
16070 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
16080 28 20 73 71 6c 69 74 65 33 4f 73 43 68 65 63 6b  ( sqlite3OsCheck
16090 52 65 73 65 72 76 65 64 4c 6f 63 6b 28 70 50 61  ReservedLock(pPa
160a0 67 65 72 2d 3e 66 64 29 20 29 7b 0a 20 20 20 20  ger->fd) ){.    
160b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
160c0 69 66 28 20 73 71 6c 69 74 65 33 50 61 67 65 72  if( sqlite3Pager
160d0 50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72  Pagecount(pPager
160e0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
160f0 74 65 33 4f 73 44 65 6c 65 74 65 28 70 50 61 67  te3OsDelete(pPag
16100 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 29 3b 0a 20  er->zJournal);. 
16110 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
16120 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
16130 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
16140 20 54 72 79 20 74 6f 20 66 69 6e 64 20 61 20 70   Try to find a p
16150 61 67 65 20 69 6e 20 74 68 65 20 63 61 63 68 65  age in the cache
16160 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 63   that can be rec
16170 79 63 6c 65 64 2e 20 0a 2a 2a 0a 2a 2a 20 54 68  ycled. .**.** Th
16180 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 79 20 72  is routine may r
16190 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 49 4f 45  eturn SQLITE_IOE
161a0 52 52 2c 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  RR, SQLITE_FULL 
161b0 6f 72 20 53 51 4c 49 54 45 5f 4f 4b 2e 20 49 74  or SQLITE_OK. It
161c0 20 0a 2a 2a 20 64 6f 65 73 20 6e 6f 74 20 73 65   .** does not se
161d0 74 20 74 68 65 20 70 50 61 67 65 72 2d 3e 65 72  t the pPager->er
161e0 72 43 6f 64 65 20 76 61 72 69 61 62 6c 65 2e 0a  rCode variable..
161f0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 61  */.static int pa
16200 67 65 72 5f 72 65 63 79 63 6c 65 28 50 61 67 65  ger_recycle(Page
16210 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20 73  r *pPager, int s
16220 79 6e 63 4f 6b 2c 20 50 67 48 64 72 20 2a 2a 70  yncOk, PgHdr **p
16230 70 50 67 29 7b 0a 20 20 50 67 48 64 72 20 2a 70  pPg){.  PgHdr *p
16240 50 67 3b 0a 20 20 2a 70 70 50 67 20 3d 20 30 3b  Pg;.  *ppPg = 0;
16250 0a 0a 20 20 61 73 73 65 72 74 28 21 4d 45 4d 44  ..  assert(!MEMD
16260 42 29 3b 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 61  B);..  /* Find a
16270 20 70 61 67 65 20 74 6f 20 72 65 63 79 63 6c 65   page to recycle
16280 2e 20 20 54 72 79 20 74 6f 20 6c 6f 63 61 74 65  .  Try to locate
16290 20 61 20 70 61 67 65 20 74 68 61 74 20 64 6f 65   a page that doe
162a0 73 20 6e 6f 74 0a 20 20 2a 2a 20 72 65 71 75 69  s not.  ** requi
162b0 72 65 20 75 73 20 74 6f 20 64 6f 20 61 6e 20 66  re us to do an f
162c0 73 79 6e 63 28 29 20 6f 6e 20 74 68 65 20 6a 6f  sync() on the jo
162d0 75 72 6e 61 6c 2e 0a 20 20 2a 2f 0a 20 20 70 50  urnal..  */.  pP
162e0 67 20 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72  g = pPager->pFir
162f0 73 74 53 79 6e 63 65 64 3b 0a 0a 20 20 2f 2a 20  stSynced;..  /* 
16300 49 66 20 77 65 20 63 6f 75 6c 64 20 6e 6f 74 20  If we could not 
16310 66 69 6e 64 20 61 20 70 61 67 65 20 74 68 61 74  find a page that
16320 20 64 6f 65 73 20 6e 6f 74 20 72 65 71 75 69 72   does not requir
16330 65 20 61 6e 20 66 73 79 6e 63 28 29 0a 20 20 2a  e an fsync().  *
16340 2a 20 6f 6e 20 74 68 65 20 6a 6f 75 72 6e 61 6c  * on the journal
16350 20 66 69 6c 65 20 74 68 65 6e 20 66 73 79 6e 63   file then fsync
16360 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
16370 65 2e 20 20 54 68 69 73 20 69 73 20 61 0a 20 20  e.  This is a.  
16380 2a 2a 20 76 65 72 79 20 73 6c 6f 77 20 6f 70 65  ** very slow ope
16390 72 61 74 69 6f 6e 2c 20 73 6f 20 77 65 20 77 6f  ration, so we wo
163a0 72 6b 20 68 61 72 64 20 74 6f 20 61 76 6f 69 64  rk hard to avoid
163b0 20 69 74 2e 20 20 42 75 74 20 73 6f 6d 65 74 69   it.  But someti
163c0 6d 65 73 0a 20 20 2a 2a 20 69 74 20 63 61 6e 27  mes.  ** it can'
163d0 74 20 62 65 20 68 65 6c 70 65 64 2e 0a 20 20 2a  t be helped..  *
163e0 2f 0a 20 20 69 66 28 20 70 50 67 3d 3d 30 20 26  /.  if( pPg==0 &
163f0 26 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  & pPager->pFirst
16400 20 26 26 20 73 79 6e 63 4f 6b 20 26 26 20 21 4d   && syncOk && !M
16410 45 4d 44 42 29 7b 0a 20 20 20 20 69 6e 74 20 72  EMDB){.    int r
16420 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61 6c 28  c = syncJournal(
16430 70 50 61 67 65 72 29 3b 0a 20 20 20 20 69 66 28  pPager);.    if(
16440 20 72 63 21 3d 30 20 29 7b 0a 20 20 20 20 20 20   rc!=0 ){.      
16450 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
16460 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
16470 3e 66 75 6c 6c 53 79 6e 63 20 29 7b 0a 20 20 20  >fullSync ){.   
16480 20 20 20 2f 2a 20 49 66 20 69 6e 20 66 75 6c 6c     /* If in full
16490 2d 73 79 6e 63 20 6d 6f 64 65 2c 20 77 72 69 74  -sync mode, writ
164a0 65 20 61 20 6e 65 77 20 6a 6f 75 72 6e 61 6c 20  e a new journal 
164b0 68 65 61 64 65 72 20 69 6e 74 6f 20 74 68 65 0a  header into the.
164c0 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c        ** journal
164d0 20 66 69 6c 65 2e 20 54 68 69 73 20 69 73 20 64   file. This is d
164e0 6f 6e 65 20 74 6f 20 61 76 6f 69 64 20 65 76 65  one to avoid eve
164f0 72 20 6d 6f 64 69 66 79 69 6e 67 20 61 20 6a 6f  r modifying a jo
16500 75 72 6e 61 6c 0a 20 20 20 20 20 20 2a 2a 20 68  urnal.      ** h
16510 65 61 64 65 72 20 74 68 61 74 20 69 73 20 69 6e  eader that is in
16520 76 6f 6c 76 65 64 20 69 6e 20 74 68 65 20 72 6f  volved in the ro
16530 6c 6c 62 61 63 6b 20 6f 66 20 70 61 67 65 73 20  llback of pages 
16540 74 68 61 74 20 68 61 76 65 0a 20 20 20 20 20 20  that have.      
16550 2a 2a 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20  ** already been 
16560 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 64  written to the d
16570 61 74 61 62 61 73 65 20 28 69 6e 20 63 61 73 65  atabase (in case
16580 20 74 68 65 20 68 65 61 64 65 72 20 69 73 0a 20   the header is. 
16590 20 20 20 20 20 2a 2a 20 74 72 61 73 68 65 64 20       ** trashed 
165a0 77 68 65 6e 20 74 68 65 20 6e 52 65 63 20 66 69  when the nRec fi
165b0 65 6c 64 20 69 73 20 75 70 64 61 74 65 64 29 2e  eld is updated).
165c0 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
165d0 70 50 61 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30  pPager->nRec = 0
165e0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
165f0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
16600 66 66 20 3e 20 30 20 29 3b 0a 20 20 20 20 20 20  ff > 0 );.      
16610 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
16620 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30 20 29 3b 0a  doNotSync==0 );.
16630 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74 65        rc = write
16640 4a 6f 75 72 6e 61 6c 48 64 72 28 70 50 61 67 65  JournalHdr(pPage
16650 72 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  r);.      if( rc
16660 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  !=0 ){.        r
16670 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
16680 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 20  }.    }.    pPg 
16690 3d 20 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74  = pPager->pFirst
166a0 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 67 3d  ;.  }.  if( pPg=
166b0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
166c0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a   SQLITE_OK;.  }.
166d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
166e0 6e 52 65 66 3d 3d 30 20 29 3b 0a 0a 20 20 2f 2a  nRef==0 );..  /*
166f0 20 57 72 69 74 65 20 74 68 65 20 70 61 67 65 20   Write the page 
16700 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 20  to the database 
16710 66 69 6c 65 20 69 66 20 69 74 20 69 73 20 64 69  file if it is di
16720 72 74 79 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  rty..  */.  if( 
16730 70 50 67 2d 3e 64 69 72 74 79 20 29 7b 0a 20 20  pPg->dirty ){.  
16740 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 61 73    int rc;.    as
16750 73 65 72 74 28 20 70 50 67 2d 3e 6e 65 65 64 53  sert( pPg->needS
16760 79 6e 63 3d 3d 30 20 29 3b 0a 20 20 20 20 6d 61  ync==0 );.    ma
16770 6b 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20  keClean(pPg);.  
16780 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
16790 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
167a0 79 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  y = 0;.    rc = 
167b0 70 61 67 65 72 5f 77 72 69 74 65 5f 70 61 67 65  pager_write_page
167c0 6c 69 73 74 28 20 70 50 67 20 29 3b 0a 20 20 20  list( pPg );.   
167d0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
167e0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  OK ){.      retu
167f0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn rc;.    }.  }
16800 0a 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e  .  assert( pPg->
16810 64 69 72 74 79 3d 3d 30 20 29 3b 0a 0a 20 20 2f  dirty==0 );..  /
16820 2a 20 49 66 20 74 68 65 20 70 61 67 65 20 77 65  * If the page we
16830 20 61 72 65 20 72 65 63 79 63 6c 69 6e 67 20 69   are recycling i
16840 73 20 6d 61 72 6b 65 64 20 61 73 20 61 6c 77 61  s marked as alwa
16850 79 73 52 6f 6c 6c 62 61 63 6b 2c 20 74 68 65 6e  ysRollback, then
16860 0a 20 20 2a 2a 20 73 65 74 20 74 68 65 20 67 6c  .  ** set the gl
16870 6f 62 61 6c 20 61 6c 77 61 79 73 52 6f 6c 6c 62  obal alwaysRollb
16880 61 63 6b 20 66 6c 61 67 2c 20 74 68 75 73 20 64  ack flag, thus d
16890 69 73 61 62 6c 69 6e 67 20 74 68 65 0a 20 20 2a  isabling the.  *
168a0 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  * sqlite3PagerDo
168b0 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 6f 70 74  ntRollback() opt
168c0 69 6d 69 7a 61 74 69 6f 6e 20 66 6f 72 20 74 68  imization for th
168d0 65 20 72 65 73 74 20 6f 66 20 74 68 69 73 20 74  e rest of this t
168e0 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 2a 2a  ransaction..  **
168f0 20 49 74 20 69 73 20 6e 65 63 65 73 73 61 72 79   It is necessary
16900 20 74 6f 20 64 6f 20 74 68 69 73 20 62 65 63 61   to do this beca
16910 75 73 65 20 74 68 65 20 70 61 67 65 20 6d 61 72  use the page mar
16920 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61  ked alwaysRollba
16930 63 6b 0a 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  ck.  ** might be
16940 20 72 65 6c 6f 61 64 65 64 20 61 74 20 61 20 6c   reloaded at a l
16950 61 74 65 72 20 74 69 6d 65 20 62 75 74 20 61 74  ater time but at
16960 20 74 68 61 74 20 70 6f 69 6e 74 20 77 65 20 77   that point we w
16970 6f 6e 27 74 20 72 65 6d 65 6d 62 65 72 0a 20 20  on't remember.  
16980 2a 2a 20 74 68 61 74 20 69 73 20 77 61 73 20 6d  ** that is was m
16990 61 72 6b 65 64 20 61 6c 77 61 79 73 52 6f 6c 6c  arked alwaysRoll
169a0 62 61 63 6b 2e 20 20 54 68 69 73 20 6d 65 61 6e  back.  This mean
169b0 73 20 74 68 61 74 20 61 6c 6c 20 70 61 67 65 73  s that all pages
169c0 20 6d 75 73 74 0a 20 20 2a 2a 20 62 65 20 6d 61   must.  ** be ma
169d0 72 6b 65 64 20 61 73 20 61 6c 77 61 79 73 52 6f  rked as alwaysRo
169e0 6c 6c 62 61 63 6b 20 66 72 6f 6d 20 68 65 72 65  llback from here
169f0 20 6f 6e 20 6f 75 74 2e 0a 20 20 2a 2f 0a 20 20   on out..  */.  
16a00 69 66 28 20 70 50 67 2d 3e 61 6c 77 61 79 73 52  if( pPg->alwaysR
16a10 6f 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 49  ollback ){.    I
16a20 4f 54 52 41 43 45 28 28 22 41 4c 57 41 59 53 5f  OTRACE(("ALWAYS_
16a30 52 4f 4c 4c 42 41 43 4b 20 25 70 5c 6e 22 2c 20  ROLLBACK %p\n", 
16a40 70 50 61 67 65 72 29 29 0a 20 20 20 20 70 50 61  pPager)).    pPa
16a50 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62  ger->alwaysRollb
16a60 61 63 6b 20 3d 20 31 3b 0a 20 20 7d 0a 0a 20 20  ack = 1;.  }..  
16a70 2f 2a 20 55 6e 6c 69 6e 6b 20 74 68 65 20 6f 6c  /* Unlink the ol
16a80 64 20 70 61 67 65 20 66 72 6f 6d 20 74 68 65 20  d page from the 
16a90 66 72 65 65 20 6c 69 73 74 20 61 6e 64 20 74 68  free list and th
16aa0 65 20 68 61 73 68 20 74 61 62 6c 65 0a 20 20 2a  e hash table.  *
16ab0 2f 0a 20 20 75 6e 6c 69 6e 6b 50 61 67 65 28 70  /.  unlinkPage(p
16ac0 50 67 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  Pg);.  assert( p
16ad0 50 67 2d 3e 70 67 6e 6f 3d 3d 30 20 29 3b 0a 0a  Pg->pgno==0 );..
16ae0 20 20 2a 70 70 50 67 20 3d 20 70 50 67 3b 0a 20    *ppPg = pPg;. 
16af0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
16b00 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K;.}../*.** This
16b10 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
16b20 6c 65 64 20 74 6f 20 66 72 65 65 20 73 75 70 65  led to free supe
16b30 72 66 6c 75 6f 75 73 20 64 79 6e 61 6d 69 63 61  rfluous dynamica
16b40 6c 6c 79 20 61 6c 6c 6f 63 61 74 65 64 20 6d 65  lly allocated me
16b50 6d 6f 72 79 0a 2a 2a 20 68 65 6c 64 20 62 79 20  mory.** held by 
16b60 74 68 65 20 70 61 67 65 72 20 73 79 73 74 65 6d  the pager system
16b70 2e 20 4d 65 6d 6f 72 79 20 69 6e 20 75 73 65 20  . Memory in use 
16b80 62 79 20 61 6e 79 20 53 51 4c 69 74 65 20 70 61  by any SQLite pa
16b90 67 65 72 20 61 6c 6c 6f 63 61 74 65 64 0a 2a 2a  ger allocated.**
16ba0 20 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20   by the current 
16bb0 74 68 72 65 61 64 20 6d 61 79 20 62 65 20 73 71  thread may be sq
16bc0 6c 69 74 65 46 72 65 65 28 29 65 64 2e 0a 2a 2a  liteFree()ed..**
16bd0 0a 2a 2a 20 6e 52 65 71 20 69 73 20 74 68 65 20  .** nReq is the 
16be0 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20  number of bytes 
16bf0 6f 66 20 6d 65 6d 6f 72 79 20 72 65 71 75 69 72  of memory requir
16c00 65 64 2e 20 4f 6e 63 65 20 74 68 69 73 20 6d 75  ed. Once this mu
16c10 63 68 20 68 61 73 0a 2a 2a 20 62 65 65 6e 20 72  ch has.** been r
16c20 65 6c 65 61 73 65 64 2c 20 74 68 65 20 66 75 6e  eleased, the fun
16c30 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 2e 20 41  ction returns. A
16c40 20 6e 65 67 61 74 69 76 65 20 76 61 6c 75 65 20   negative value 
16c50 66 6f 72 20 6e 52 65 71 20 6d 65 61 6e 73 0a 2a  for nReq means.*
16c60 2a 20 66 72 65 65 20 61 73 20 6d 75 63 68 20 6d  * free as much m
16c70 65 6d 6f 72 79 20 61 73 20 70 6f 73 73 69 62 6c  emory as possibl
16c80 65 2e 20 54 68 65 20 72 65 74 75 72 6e 20 76 61  e. The return va
16c90 6c 75 65 20 69 73 20 74 68 65 20 74 6f 74 61 6c  lue is the total
16ca0 20 6e 75 6d 62 65 72 20 0a 2a 2a 20 6f 66 20 62   number .** of b
16cb0 79 74 65 73 20 6f 66 20 6d 65 6d 6f 72 79 20 72  ytes of memory r
16cc0 65 6c 65 61 73 65 64 2e 0a 2a 2f 0a 23 69 66 20  eleased..*/.#if 
16cd0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
16ce0 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41 4e  NABLE_MEMORY_MAN
16cf0 41 47 45 4d 45 4e 54 29 20 26 26 20 21 64 65 66  AGEMENT) && !def
16d00 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
16d10 5f 44 49 53 4b 49 4f 29 0a 69 6e 74 20 73 71 6c  _DISKIO).int sql
16d20 69 74 65 33 50 61 67 65 72 52 65 6c 65 61 73 65  ite3PagerRelease
16d30 4d 65 6d 6f 72 79 28 69 6e 74 20 6e 52 65 71 29  Memory(int nReq)
16d40 7b 0a 20 20 63 6f 6e 73 74 20 54 68 72 65 61 64  {.  const Thread
16d50 44 61 74 61 20 2a 70 54 73 64 72 6f 20 3d 20 73  Data *pTsdro = s
16d60 71 6c 69 74 65 33 54 68 72 65 61 64 44 61 74 61  qlite3ThreadData
16d70 52 65 61 64 4f 6e 6c 79 28 29 3b 0a 20 20 69 6e  ReadOnly();.  in
16d80 74 20 6e 52 65 6c 65 61 73 65 64 20 3d 20 30 3b  t nReleased = 0;
16d90 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20  .  int i;..  /* 
16da0 49 66 20 74 68 65 20 74 68 65 20 67 6c 6f 62 61  If the the globa
16db0 6c 20 6d 75 74 65 78 20 69 73 20 68 65 6c 64 2c  l mutex is held,
16dc0 20 74 68 69 73 20 73 75 62 72 6f 75 74 69 6e 65   this subroutine
16dd0 20 62 65 63 6f 6d 65 73 20 61 0a 20 20 2a 2a 20   becomes a.  ** 
16de0 6f 2d 6f 70 3b 20 7a 65 72 6f 20 62 79 74 65 73  o-op; zero bytes
16df0 20 6f 66 20 6d 65 6d 6f 72 79 20 61 72 65 20 66   of memory are f
16e00 72 65 65 64 2e 20 20 54 68 69 73 20 69 73 20 62  reed.  This is b
16e10 65 63 61 75 73 65 0a 20 20 2a 2a 20 73 6f 6d 65  ecause.  ** some
16e20 20 6f 66 20 74 68 65 20 63 6f 64 65 20 69 6e 76   of the code inv
16e30 6f 6b 65 64 20 62 79 20 74 68 69 73 20 66 75 6e  oked by this fun
16e40 63 74 69 6f 6e 20 6d 61 79 20 61 6c 73 6f 0a 20  ction may also. 
16e50 20 2a 2a 20 74 72 79 20 74 6f 20 6f 62 74 61 69   ** try to obtai
16e60 6e 20 74 68 65 20 6d 75 74 65 78 2c 20 72 65 73  n the mutex, res
16e70 75 6c 74 69 6e 67 20 69 6e 20 61 20 64 65 61 64  ulting in a dead
16e80 6c 6f 63 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  lock..  */.  if(
16e90 20 73 71 6c 69 74 65 33 4f 73 49 6e 4d 75 74 65   sqlite3OsInMute
16ea0 78 28 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  x(0) ){.    retu
16eb0 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rn 0;.  }..  /* 
16ec0 4f 75 74 65 72 6d 6f 73 74 20 6c 6f 6f 70 20 72  Outermost loop r
16ed0 75 6e 73 20 66 6f 72 20 61 74 20 6d 6f 73 74 20  uns for at most 
16ee0 74 77 6f 20 69 74 65 72 61 74 69 6f 6e 73 2e 20  two iterations. 
16ef0 46 69 72 73 74 20 69 74 65 72 61 74 69 6f 6e 20  First iteration 
16f00 77 65 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 66  we.  ** try to f
16f10 69 6e 64 20 6d 65 6d 6f 72 79 20 74 68 61 74 20  ind memory that 
16f20 63 61 6e 20 62 65 20 72 65 6c 65 61 73 65 64 20  can be released 
16f30 77 69 74 68 6f 75 74 20 63 61 6c 6c 69 6e 67 20  without calling 
16f40 66 73 79 6e 63 28 29 2e 20 53 65 63 6f 6e 64 0a  fsync(). Second.
16f50 20 20 2a 2a 20 69 74 65 72 61 74 69 6f 6e 20 28    ** iteration (
16f60 77 68 69 63 68 20 6f 6e 6c 79 20 72 75 6e 73 20  which only runs 
16f70 69 66 20 74 68 65 20 66 69 72 73 74 20 66 61 69  if the first fai
16f80 6c 65 64 20 74 6f 20 66 72 65 65 20 6e 52 65 71  led to free nReq
16f90 20 62 79 74 65 73 20 6f 66 0a 20 20 2a 2a 20 6d   bytes of.  ** m
16fa0 65 6d 6f 72 79 29 20 69 73 20 70 65 72 6d 69 74  emory) is permit
16fb0 74 65 64 20 74 6f 20 63 61 6c 6c 20 66 73 79 6e  ted to call fsyn
16fc0 63 28 29 2e 20 54 68 69 73 20 69 73 20 6f 66 20  c(). This is of 
16fd0 63 6f 75 72 73 65 20 6d 75 63 68 20 6d 6f 72 65  course much more
16fe0 20 0a 20 20 2a 2a 20 65 78 70 65 6e 73 69 76 65   .  ** expensive
16ff0 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30  ..  */.  for(i=0
17000 3b 20 69 3c 3d 31 3b 20 69 2b 2b 29 7b 0a 0a 20  ; i<=1; i++){.. 
17010 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
17020 67 68 20 61 6c 6c 20 74 68 65 20 53 51 4c 69 74  gh all the SQLit
17030 65 20 70 61 67 65 72 73 20 6f 70 65 6e 65 64 20  e pagers opened 
17040 62 79 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  by the current t
17050 68 72 65 61 64 2e 20 2a 2f 0a 20 20 20 20 50 61  hread. */.    Pa
17060 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 54  ger *pPager = pT
17070 73 64 72 6f 2d 3e 70 50 61 67 65 72 3b 0a 20 20  sdro->pPager;.  
17080 20 20 66 6f 72 28 20 3b 20 70 50 61 67 65 72 20    for( ; pPager 
17090 26 26 20 28 6e 52 65 71 3c 30 20 7c 7c 20 6e 52  && (nReq<0 || nR
170a0 65 6c 65 61 73 65 64 3c 6e 52 65 71 29 3b 20 70  eleased<nReq); p
170b0 50 61 67 65 72 3d 70 50 61 67 65 72 2d 3e 70 4e  Pager=pPager->pN
170c0 65 78 74 29 7b 0a 20 20 20 20 20 20 50 67 48 64  ext){.      PgHd
170d0 72 20 2a 70 50 67 3b 0a 20 20 20 20 20 20 69 6e  r *pPg;.      in
170e0 74 20 72 63 3b 0a 0a 20 20 20 20 20 20 69 66 28  t rc;..      if(
170f0 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20   MEMDB ){.      
17100 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
17110 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 6f    }..      /* Fo
17120 72 20 65 61 63 68 20 70 61 67 65 72 2c 20 74 72  r each pager, tr
17130 79 20 74 6f 20 66 72 65 65 20 61 73 20 6d 61 6e  y to free as man
17140 79 20 70 61 67 65 73 20 61 73 20 70 6f 73 73 69  y pages as possi
17150 62 6c 65 20 28 77 69 74 68 6f 75 74 20 0a 20 20  ble (without .  
17160 20 20 20 20 2a 2a 20 63 61 6c 6c 69 6e 67 20 66      ** calling f
17170 73 79 6e 63 28 29 20 69 66 20 74 68 69 73 20 69  sync() if this i
17180 73 20 74 68 65 20 66 69 72 73 74 20 69 74 65 72  s the first iter
17190 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6f 75 74  ation of the out
171a0 65 72 6d 6f 73 74 20 0a 20 20 20 20 20 20 2a 2a  ermost .      **
171b0 20 6c 6f 6f 70 29 2e 0a 20 20 20 20 20 20 2a 2f   loop)..      */
171c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 53 51  .      while( SQ
171d0 4c 49 54 45 5f 4f 4b 3d 3d 28 72 63 20 3d 20 70  LITE_OK==(rc = p
171e0 61 67 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61  ager_recycle(pPa
171f0 67 65 72 2c 20 69 2c 20 26 70 50 67 29 29 20 26  ger, i, &pPg)) &
17200 26 20 70 50 67 29 20 7b 0a 20 20 20 20 20 20 20  & pPg) {.       
17210 20 2f 2a 20 57 65 27 76 65 20 66 6f 75 6e 64 20   /* We've found 
17220 61 20 70 61 67 65 20 74 6f 20 66 72 65 65 2e 20  a page to free. 
17230 41 74 20 74 68 69 73 20 70 6f 69 6e 74 20 74 68  At this point th
17240 65 20 70 61 67 65 20 68 61 73 20 62 65 65 6e 20  e page has been 
17250 0a 20 20 20 20 20 20 20 20 2a 2a 20 72 65 6d 6f  .        ** remo
17260 76 65 64 20 66 72 6f 6d 20 74 68 65 20 70 61 67  ved from the pag
17270 65 20 68 61 73 68 2d 74 61 62 6c 65 2c 20 66 72  e hash-table, fr
17280 65 65 2d 6c 69 73 74 20 61 6e 64 20 73 79 6e 63  ee-list and sync
17290 65 64 2d 6c 69 73 74 20 0a 20 20 20 20 20 20 20  ed-list .       
172a0 20 2a 2a 20 28 70 46 69 72 73 74 53 79 6e 63 65   ** (pFirstSynce
172b0 64 29 2e 20 49 74 20 69 73 20 73 74 69 6c 6c 20  d). It is still 
172c0 69 6e 20 74 68 65 20 61 6c 6c 20 70 61 67 65 73  in the all pages
172d0 20 28 70 41 6c 6c 29 20 6c 69 73 74 2e 20 0a 20   (pAll) list. . 
172e0 20 20 20 20 20 20 20 2a 2a 20 52 65 6d 6f 76 65         ** Remove
172f0 20 69 74 20 66 72 6f 6d 20 74 68 69 73 20 6c 69   it from this li
17300 73 74 20 62 65 66 6f 72 65 20 66 72 65 65 69 6e  st before freein
17310 67 2e 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  g..        **.  
17320 20 20 20 20 20 20 2a 2a 20 54 6f 64 6f 3a 20 43        ** Todo: C
17330 68 65 63 6b 20 74 68 65 20 50 61 67 65 72 2e 70  heck the Pager.p
17340 53 74 6d 74 20 6c 69 73 74 20 74 6f 20 6d 61 6b  Stmt list to mak
17350 65 20 73 75 72 65 20 74 68 69 73 20 69 73 20 4f  e sure this is O
17360 6b 2e 20 49 74 20 0a 20 20 20 20 20 20 20 20 2a  k. It .        *
17370 2a 20 70 72 6f 62 61 62 6c 79 20 69 73 20 74 68  * probably is th
17380 6f 75 67 68 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ough..        */
17390 0a 20 20 20 20 20 20 20 20 50 67 48 64 72 20 2a  .        PgHdr *
173a0 70 54 6d 70 3b 0a 20 20 20 20 20 20 20 20 61 73  pTmp;.        as
173b0 73 65 72 74 28 20 70 50 67 20 29 3b 0a 20 20 20  sert( pPg );.   
173c0 20 20 20 20 20 69 66 28 20 70 50 67 3d 3d 70 50       if( pPg==pP
173d0 61 67 65 72 2d 3e 70 41 6c 6c 20 29 7b 0a 20 20  ager->pAll ){.  
173e0 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
173f0 3e 70 41 6c 6c 20 3d 20 70 50 67 2d 3e 70 4e 65  >pAll = pPg->pNe
17400 78 74 41 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d  xtAll;.        }
17410 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
17420 66 6f 72 28 20 70 54 6d 70 3d 70 50 61 67 65 72  for( pTmp=pPager
17430 2d 3e 70 41 6c 6c 3b 20 70 54 6d 70 2d 3e 70 4e  ->pAll; pTmp->pN
17440 65 78 74 41 6c 6c 21 3d 70 50 67 3b 20 70 54 6d  extAll!=pPg; pTm
17450 70 3d 70 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c  p=pTmp->pNextAll
17460 20 29 7b 7d 0a 20 20 20 20 20 20 20 20 20 20 70   ){}.          p
17470 54 6d 70 2d 3e 70 4e 65 78 74 41 6c 6c 20 3d 20  Tmp->pNextAll = 
17480 70 50 67 2d 3e 70 4e 65 78 74 41 6c 6c 3b 0a 20  pPg->pNextAll;. 
17490 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
174a0 20 6e 52 65 6c 65 61 73 65 64 20 2b 3d 20 73 71   nReleased += sq
174b0 6c 69 74 65 41 6c 6c 6f 63 53 69 7a 65 28 70 50  liteAllocSize(pP
174c0 67 29 3b 0a 20 20 20 20 20 20 20 20 49 4f 54 52  g);.        IOTR
174d0 41 43 45 28 28 22 50 47 46 52 45 45 20 25 70 20  ACE(("PGFREE %p 
174e0 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70  %d\n", pPager, p
174f0 50 67 2d 3e 70 67 6e 6f 29 29 3b 0a 20 20 20 20  Pg->pgno));.    
17500 20 20 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73      PAGER_INCR(s
17510 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 70 67 66  qlite3_pager_pgf
17520 72 65 65 5f 63 6f 75 6e 74 29 3b 0a 20 20 20 20  ree_count);.    
17530 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
17540 50 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  Pg);.      }..  
17550 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
17560 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
17570 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20 6f 63 63   /* An error occ
17580 75 72 65 64 20 77 68 69 6c 73 74 20 77 72 69 74  ured whilst writ
17590 69 6e 67 20 74 6f 20 74 68 65 20 64 61 74 61 62  ing to the datab
175a0 61 73 65 20 66 69 6c 65 20 6f 72 20 0a 20 20 20  ase file or .   
175b0 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e 61 6c 20       ** journal 
175c0 69 6e 20 70 61 67 65 72 5f 72 65 63 79 63 6c 65  in pager_recycle
175d0 28 29 2e 20 54 68 65 20 65 72 72 6f 72 20 69 73  (). The error is
175e0 20 6e 6f 74 20 72 65 74 75 72 6e 65 64 20 74 6f   not returned to
175f0 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 2a 2a   the .        **
17600 20 63 61 6c 6c 65 72 20 6f 66 20 74 68 69 73 20   caller of this 
17610 66 75 6e 63 74 69 6f 6e 2e 20 49 6e 73 74 65 61  function. Instea
17620 64 2c 20 73 65 74 20 74 68 65 20 50 61 67 65 72  d, set the Pager
17630 2e 65 72 72 43 6f 64 65 20 76 61 72 69 61 62 6c  .errCode variabl
17640 65 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 54 68  e..        ** Th
17650 65 20 65 72 72 6f 72 20 77 69 6c 6c 20 62 65 20  e error will be 
17660 72 65 74 75 72 6e 65 64 20 74 6f 20 74 68 65 20  returned to the 
17670 75 73 65 72 20 28 6f 72 20 75 73 65 72 73 2c 20  user (or users, 
17680 69 6e 20 74 68 65 20 63 61 73 65 20 0a 20 20 20  in the case .   
17690 20 20 20 20 20 2a 2a 20 6f 66 20 61 20 73 68 61       ** of a sha
176a0 72 65 64 20 70 61 67 65 72 20 63 61 63 68 65 29  red pager cache)
176b0 20 6f 66 20 74 68 65 20 70 61 67 65 72 20 66 6f   of the pager fo
176c0 72 20 77 68 69 63 68 20 74 68 65 20 65 72 72 6f  r which the erro
176d0 72 20 6f 63 63 75 72 65 64 2e 0a 20 20 20 20 20  r occured..     
176e0 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 61 73     */.        as
176f0 73 65 72 74 28 20 28 72 63 26 30 78 66 66 29 3d  sert( (rc&0xff)=
17700 3d 53 51 4c 49 54 45 5f 49 4f 45 52 52 20 7c 7c  =SQLITE_IOERR ||
17710 20 72 63 3d 3d 53 51 4c 49 54 45 5f 46 55 4c 4c   rc==SQLITE_FULL
17720 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
17730 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  rt( pPager->stat
17740 65 3e 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e>=PAGER_RESERVE
17750 44 20 29 3b 0a 20 20 20 20 20 20 20 20 70 61 67  D );.        pag
17760 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
17770 20 72 63 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   rc);.      }.  
17780 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
17790 6e 20 6e 52 65 6c 65 61 73 65 64 3b 0a 7d 0a 23  n nReleased;.}.#
177a0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
177b0 45 4e 41 42 4c 45 5f 4d 45 4d 4f 52 59 5f 4d 41  ENABLE_MEMORY_MA
177c0 4e 41 47 45 4d 45 4e 54 20 26 26 20 21 53 51 4c  NAGEMENT && !SQL
177d0 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f 20  ITE_OMIT_DISKIO 
177e0 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74  */../*.** Read t
177f0 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 70 61  he content of pa
17800 67 65 20 70 50 67 20 6f 75 74 20 6f 66 20 74 68  ge pPg out of th
17810 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
17820 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
17830 65 61 64 44 62 50 61 67 65 28 50 61 67 65 72 20  eadDbPage(Pager 
17840 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20 2a  *pPager, PgHdr *
17850 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e 6f 29 7b  pPg, Pgno pgno){
17860 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 61 73 73  .  int rc;.  ass
17870 65 72 74 28 20 4d 45 4d 44 42 3d 3d 30 20 29 3b  ert( MEMDB==0 );
17880 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f  .  rc = sqlite3O
17890 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
178a0 2c 20 28 70 67 6e 6f 2d 31 29 2a 28 69 36 34 29  , (pgno-1)*(i64)
178b0 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
178c0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
178d0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
178e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 52 65 61 64   = sqlite3OsRead
178f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 50 47 48  (pPager->fd, PGH
17900 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 2c  DR_TO_DATA(pPg),
17910 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
17920 20 20 20 20 20 20 20 20 20 20 20 70 50 61 67 65             pPage
17930 72 2d 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20  r->pageSize);.  
17940 7d 0a 20 20 50 41 47 45 52 5f 49 4e 43 52 28 73  }.  PAGER_INCR(s
17950 71 6c 69 74 65 33 5f 70 61 67 65 72 5f 72 65 61  qlite3_pager_rea
17960 64 64 62 5f 63 6f 75 6e 74 29 3b 0a 20 20 50 41  ddb_count);.  PA
17970 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
17980 3e 6e 52 65 61 64 29 3b 0a 20 20 49 4f 54 52 41  >nRead);.  IOTRA
17990 43 45 28 28 22 50 47 49 4e 20 25 70 20 25 64 5c  CE(("PGIN %p %d\
179a0 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e 6f  n", pPager, pgno
179b0 29 29 3b 0a 20 20 69 66 28 20 70 67 6e 6f 3d 3d  ));.  if( pgno==
179c0 31 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28  1 ){.    memcpy(
179d0 26 70 50 61 67 65 72 2d 3e 64 62 46 69 6c 65 56  &pPager->dbFileV
179e0 65 72 73 2c 20 26 28 28 75 38 2a 29 50 47 48 44  ers, &((u8*)PGHD
179f0 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29 29 5b  R_TO_DATA(pPg))[
17a00 32 34 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  24],.           
17a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17a30 20 20 20 73 69 7a 65 6f 66 28 70 50 61 67 65 72     sizeof(pPager
17a40 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 29 3b 0a  ->dbFileVers));.
17a50 20 20 7d 0a 20 20 43 4f 44 45 43 31 28 70 50 61    }.  CODEC1(pPa
17a60 67 65 72 2c 20 50 47 48 44 52 5f 54 4f 5f 44 41  ger, PGHDR_TO_DA
17a70 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 70 67  TA(pPg), pPg->pg
17a80 6e 6f 2c 20 33 29 3b 0a 20 20 50 41 47 45 52 54  no, 3);.  PAGERT
17a90 52 41 43 45 34 28 22 46 45 54 43 48 20 25 64 20  RACE4("FETCH %d 
17aa0 70 61 67 65 20 25 64 20 68 61 73 68 28 25 30 38  page %d hash(%08
17ab0 78 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  x)\n",.         
17ac0 20 20 20 20 20 20 50 41 47 45 52 49 44 28 70 50        PAGERID(pP
17ad0 61 67 65 72 29 2c 20 70 50 67 2d 3e 70 67 6e 6f  ager), pPg->pgno
17ae0 2c 20 70 61 67 65 72 5f 70 61 67 65 68 61 73 68  , pager_pagehash
17af0 28 70 50 67 29 29 3b 0a 20 20 72 65 74 75 72 6e  (pPg));.  return
17b00 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
17b10 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
17b20 63 61 6c 6c 65 64 20 74 6f 20 6f 62 74 61 69 6e  called to obtain
17b30 20 74 68 65 20 73 68 61 72 65 64 20 6c 6f 63 6b   the shared lock
17b40 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
17b50 0a 2a 2a 20 64 61 74 61 20 6d 61 79 20 62 65 20  .** data may be 
17b60 72 65 61 64 20 66 72 6f 6d 20 74 68 65 20 70 61  read from the pa
17b70 67 65 72 20 63 61 63 68 65 2e 20 49 66 20 74 68  ger cache. If th
17b80 65 20 73 68 61 72 65 64 20 6c 6f 63 6b 20 68 61  e shared lock ha
17b90 73 20 61 6c 72 65 61 64 79 0a 2a 2a 20 62 65 65  s already.** bee
17ba0 6e 20 6f 62 74 61 69 6e 65 64 2c 20 74 68 69 73  n obtained, this
17bb0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 20 6e   function is a n
17bc0 6f 2d 6f 70 2e 0a 2a 2a 0a 2a 2a 20 49 6d 6d 65  o-op..**.** Imme
17bd0 64 69 61 74 65 6c 79 20 61 66 74 65 72 20 6f 62  diately after ob
17be0 74 61 69 6e 69 6e 67 20 74 68 65 20 73 68 61 72  taining the shar
17bf0 65 64 20 6c 6f 63 6b 20 28 69 66 20 72 65 71 75  ed lock (if requ
17c00 69 72 65 64 29 2c 20 74 68 69 73 20 66 75 6e 63  ired), this func
17c10 74 69 6f 6e 0a 2a 2a 20 63 68 65 63 6b 73 20 66  tion.** checks f
17c20 6f 72 20 61 20 68 6f 74 2d 6a 6f 75 72 6e 61 6c  or a hot-journal
17c30 20 66 69 6c 65 2e 20 49 66 20 6f 6e 65 20 69 73   file. If one is
17c40 20 66 6f 75 6e 64 2c 20 61 6e 20 65 6d 65 72 67   found, an emerg
17c50 65 6e 63 79 20 72 6f 6c 6c 62 61 63 6b 0a 2a 2a  ency rollback.**
17c60 20 69 73 20 70 65 72 66 6f 72 6d 65 64 20 69 6d   is performed im
17c70 6d 65 64 69 61 74 65 6c 79 2e 0a 2a 2f 0a 73 74  mediately..*/.st
17c80 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 53 68  atic int pagerSh
17c90 61 72 65 64 4c 6f 63 6b 28 50 61 67 65 72 20 2a  aredLock(Pager *
17ca0 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72  pPager){.  int r
17cb0 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a  c = SQLITE_OK;..
17cc0 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
17cd0 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
17ce0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 21 4d 45  K ){.    if( !ME
17cf0 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 61 73 73  MDB ){.      ass
17d00 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e 52 65  ert( pPager->nRe
17d10 66 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 66  f==0 );.      if
17d20 28 20 21 70 50 61 67 65 72 2d 3e 6e 6f 52 65 61  ( !pPager->noRea
17d30 64 6c 6f 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  dlock ){.       
17d40 20 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74   rc = pager_wait
17d50 5f 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c  _on_lock(pPager,
17d60 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 0a 20   SHARED_LOCK);. 
17d70 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
17d80 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
17d90 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 61 67        return pag
17da0 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
17db0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a   rc);.        }.
17dc0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17dd0 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 53  pPager->state>=S
17de0 48 41 52 45 44 5f 4c 4f 43 4b 20 29 3b 0a 20 20  HARED_LOCK );.  
17df0 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 20 20 2f      }.  .      /
17e00 2a 20 49 66 20 61 20 6a 6f 75 72 6e 61 6c 20 66  * If a journal f
17e10 69 6c 65 20 65 78 69 73 74 73 2c 20 61 6e 64 20  ile exists, and 
17e20 74 68 65 72 65 20 69 73 20 6e 6f 20 52 45 53 45  there is no RESE
17e30 52 56 45 44 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  RVED lock on the
17e40 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
17e50 73 65 20 66 69 6c 65 2c 20 74 68 65 6e 20 69 74  se file, then it
17e60 20 65 69 74 68 65 72 20 6e 65 65 64 73 20 74 6f   either needs to
17e70 20 62 65 20 70 6c 61 79 65 64 20 62 61 63 6b 20   be played back 
17e80 6f 72 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  or deleted..    
17e90 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 68    */.      if( h
17ea0 61 73 48 6f 74 4a 6f 75 72 6e 61 6c 28 70 50 61  asHotJournal(pPa
17eb0 67 65 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ger) ){.        
17ec0 2f 2a 20 47 65 74 20 61 6e 20 45 58 43 4c 55 53  /* Get an EXCLUS
17ed0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
17ee0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 41  database file. A
17ef0 74 20 74 68 69 73 20 70 6f 69 6e 74 20 69 74 20  t this point it 
17f00 69 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 6d  is.        ** im
17f10 70 6f 72 74 61 6e 74 20 74 68 61 74 20 61 20 52  portant that a R
17f20 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 69 73 20  ESERVED lock is 
17f30 6e 6f 74 20 6f 62 74 61 69 6e 65 64 20 6f 6e 20  not obtained on 
17f40 74 68 65 20 77 61 79 20 74 6f 20 74 68 65 0a 20  the way to the. 
17f50 20 20 20 20 20 20 20 2a 2a 20 45 58 43 4c 55 53         ** EXCLUS
17f60 49 56 45 20 6c 6f 63 6b 2e 20 49 66 20 69 74 20  IVE lock. If it 
17f70 77 65 72 65 2c 20 61 6e 6f 74 68 65 72 20 70 72  were, another pr
17f80 6f 63 65 73 73 20 6d 69 67 68 74 20 6f 70 65 6e  ocess might open
17f90 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
17fa0 64 61 74 61 62 61 73 65 20 66 69 6c 65 2c 20 64  database file, d
17fb0 65 74 65 63 74 20 74 68 65 20 52 45 53 45 52 56  etect the RESERV
17fc0 45 44 20 6c 6f 63 6b 2c 20 61 6e 64 20 63 6f 6e  ED lock, and con
17fd0 63 6c 75 64 65 20 74 68 61 74 20 74 68 65 0a 20  clude that the. 
17fe0 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61         ** databa
17ff0 73 65 20 69 73 20 73 61 66 65 20 74 6f 20 72 65  se is safe to re
18000 61 64 20 77 68 69 6c 65 20 74 68 69 73 20 70 72  ad while this pr
18010 6f 63 65 73 73 20 69 73 20 73 74 69 6c 6c 20 72  ocess is still r
18020 6f 6c 6c 69 6e 67 20 69 74 20 0a 20 20 20 20 20  olling it .     
18030 20 20 20 2a 2a 20 62 61 63 6b 2e 0a 20 20 20 20     ** back..    
18040 20 20 20 20 2a 2a 20 0a 20 20 20 20 20 20 20 20      ** .        
18050 2a 2a 20 42 65 63 61 75 73 65 20 74 68 65 20 69  ** Because the i
18060 6e 74 65 72 6d 65 64 69 61 74 65 20 52 45 53 45  ntermediate RESE
18070 52 56 45 44 20 6c 6f 63 6b 20 69 73 20 6e 6f 74  RVED lock is not
18080 20 72 65 71 75 65 73 74 65 64 2c 20 74 68 65 0a   requested, the.
18090 20 20 20 20 20 20 20 20 2a 2a 20 73 65 63 6f 6e          ** secon
180a0 64 20 70 72 6f 63 65 73 73 20 77 69 6c 6c 20 67  d process will g
180b0 65 74 20 74 6f 20 74 68 69 73 20 70 6f 69 6e 74  et to this point
180c0 20 69 6e 20 74 68 65 20 63 6f 64 65 20 61 6e 64   in the code and
180d0 20 66 61 69 6c 20 74 6f 0a 20 20 20 20 20 20 20   fail to.       
180e0 20 2a 2a 20 6f 62 74 61 69 6e 20 69 74 27 73 20   ** obtain it's 
180f0 6f 77 6e 20 45 58 43 4c 55 53 49 56 45 20 6c 6f  own EXCLUSIVE lo
18100 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
18110 73 65 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  se file..       
18120 20 2a 2f 0a 20 20 20 20 20 20 20 20 72 63 20 3d   */.        rc =
18130 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 28 70   sqlite3OsLock(p
18140 50 61 67 65 72 2d 3e 66 64 2c 20 45 58 43 4c 55  Pager->fd, EXCLU
18150 53 49 56 45 5f 4c 4f 43 4b 29 3b 0a 20 20 20 20  SIVE_LOCK);.    
18160 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
18170 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
18180 20 20 20 70 61 67 65 72 5f 75 6e 6c 6f 63 6b 28     pager_unlock(
18190 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20  pPager);.       
181a0 20 20 20 72 65 74 75 72 6e 20 70 61 67 65 72 5f     return pager_
181b0 65 72 72 6f 72 28 70 50 61 67 65 72 2c 20 72 63  error(pPager, rc
181c0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
181d0 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74 61       pPager->sta
181e0 74 65 20 3d 20 50 41 47 45 52 5f 45 58 43 4c 55  te = PAGER_EXCLU
181f0 53 49 56 45 3b 0a 20 0a 20 20 20 20 20 20 20 20  SIVE;. .        
18200 2f 2a 20 4f 70 65 6e 20 74 68 65 20 6a 6f 75 72  /* Open the jour
18210 6e 61 6c 20 66 6f 72 20 72 65 61 64 69 6e 67 20  nal for reading 
18220 6f 6e 6c 79 2e 20 20 52 65 74 75 72 6e 20 53 51  only.  Return SQ
18230 4c 49 54 45 5f 42 55 53 59 20 69 66 0a 20 20 20  LITE_BUSY if.   
18240 20 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 75       ** we are u
18250 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 74 68  nable to open th
18260 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2e 20  e journal file. 
18270 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
18280 20 20 20 20 2a 2a 20 54 68 65 20 6a 6f 75 72 6e      ** The journ
18290 61 6c 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f 74  al file does not
182a0 20 6e 65 65 64 20 74 6f 20 62 65 20 6c 6f 63 6b   need to be lock
182b0 65 64 20 69 74 73 65 6c 66 2e 20 20 54 68 65 0a  ed itself.  The.
182c0 20 20 20 20 20 20 20 20 2a 2a 20 6a 6f 75 72 6e          ** journ
182d0 61 6c 20 66 69 6c 65 20 69 73 20 6e 65 76 65 72  al file is never
182e0 20 6f 70 65 6e 20 75 6e 6c 65 73 73 20 74 68 65   open unless the
182f0 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 66   main database f
18300 69 6c 65 20 68 6f 6c 64 73 0a 20 20 20 20 20 20  ile holds.      
18310 20 20 2a 2a 20 61 20 77 72 69 74 65 20 6c 6f 63    ** a write loc
18320 6b 2c 20 73 6f 20 74 68 65 72 65 20 69 73 20 6e  k, so there is n
18330 65 76 65 72 20 61 6e 79 20 63 68 61 6e 63 65 20  ever any chance 
18340 6f 66 20 74 77 6f 20 6f 72 20 6d 6f 72 65 0a 20  of two or more. 
18350 20 20 20 20 20 20 20 2a 2a 20 70 72 6f 63 65 73         ** proces
18360 73 65 73 20 6f 70 65 6e 69 6e 67 20 74 68 65 20  ses opening the 
18370 6a 6f 75 72 6e 61 6c 20 61 74 20 74 68 65 20 73  journal at the s
18380 61 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 20  ame time..      
18390 20 20 2a 2a 0a 09 2a 2a 20 4f 70 65 6e 20 74 68    **..** Open th
183a0 65 20 6a 6f 75 72 6e 61 6c 20 66 6f 72 20 72 65  e journal for re
183b0 61 64 2f 77 72 69 74 65 20 61 63 63 65 73 73 2e  ad/write access.
183c0 20 54 68 69 73 20 69 73 20 62 65 63 61 75 73 65   This is because
183d0 20 69 6e 20 0a 09 2a 2a 20 65 78 63 6c 75 73 69   in ..** exclusi
183e0 76 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 74  ve-access mode t
183f0 68 65 20 66 69 6c 65 20 64 65 73 63 72 69 70 74  he file descript
18400 6f 72 20 77 69 6c 6c 20 62 65 20 6b 65 70 74 20  or will be kept 
18410 6f 70 65 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  open and.       
18420 20 2a 2a 20 70 6f 73 73 69 62 6c 79 20 75 73 65   ** possibly use
18430 64 20 66 6f 72 20 61 20 74 72 61 6e 73 61 63 74  d for a transact
18440 69 6f 6e 20 6c 61 74 65 72 20 6f 6e 2e 20 4f 6e  ion later on. On
18450 20 73 6f 6d 65 20 73 79 73 74 65 6d 73 2c 20 74   some systems, t
18460 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 4f 73  he.        ** Os
18470 54 72 75 6e 63 61 74 65 28 29 20 63 61 6c 6c 20  Truncate() call 
18480 75 73 65 64 20 69 6e 20 65 78 63 6c 75 73 69 76  used in exclusiv
18490 65 2d 61 63 63 65 73 73 20 6d 6f 64 65 20 61 6c  e-access mode al
184a0 73 6f 20 72 65 71 75 69 72 65 73 0a 20 20 20 20  so requires.    
184b0 20 20 20 20 2a 2a 20 61 20 72 65 61 64 2f 77 72      ** a read/wr
184c0 69 74 65 20 66 69 6c 65 20 68 61 6e 64 6c 65 2e  ite file handle.
184d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
184e0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
184f0 42 55 53 59 3b 0a 20 20 20 20 20 20 20 20 69 66  BUSY;.        if
18500 28 20 73 71 6c 69 74 65 33 4f 73 46 69 6c 65 45  ( sqlite3OsFileE
18510 78 69 73 74 73 28 70 50 61 67 65 72 2d 3e 7a 4a  xists(pPager->zJ
18520 6f 75 72 6e 61 6c 29 20 29 7b 0a 20 20 20 20 20  ournal) ){.     
18530 20 20 20 20 20 69 6e 74 20 72 6f 3b 0a 20 20 20       int ro;.   
18540 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
18550 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
18560 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63   );.          rc
18570 20 3d 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e   = sqlite3OsOpen
18580 52 65 61 64 57 72 69 74 65 28 70 50 61 67 65 72  ReadWrite(pPager
18590 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20 26 70 50 61  ->zJournal, &pPa
185a0 67 65 72 2d 3e 6a 66 64 2c 20 26 72 6f 29 3b 0a  ger->jfd, &ro);.
185b0 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
185c0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
185d0 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 66 64 20 29  || pPager->jfd )
185e0 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
185f0 72 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ro ){.          
18600 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 42 55    rc = SQLITE_BU
18610 53 59 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  SY;.            
18620 73 71 6c 69 74 65 33 4f 73 43 6c 6f 73 65 28 26  sqlite3OsClose(&
18630 70 50 61 67 65 72 2d 3e 6a 66 64 29 3b 0a 20 20  pPager->jfd);.  
18640 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18650 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
18660 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18670 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65 72  .          pager
18680 5f 75 6e 6c 6f 63 6b 28 70 50 61 67 65 72 29 3b  _unlock(pPager);
18690 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
186a0 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20  n SQLITE_BUSY;. 
186b0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
186c0 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
186d0 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
186e0 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61    pPager->journa
186f0 6c 53 74 61 72 74 65 64 20 3d 20 30 3b 0a 20 20  lStarted = 0;.  
18700 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f        pPager->jo
18710 75 72 6e 61 6c 4f 66 66 20 3d 20 30 3b 0a 20 20  urnalOff = 0;.  
18720 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e 73 65        pPager->se
18730 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20 20 20  tMaster = 0;.   
18740 20 20 20 20 20 70 50 61 67 65 72 2d 3e 6a 6f 75       pPager->jou
18750 72 6e 61 6c 48 64 72 20 3d 20 30 3b 0a 20 0a 20  rnalHdr = 0;. . 
18760 20 20 20 20 20 20 20 2f 2a 20 50 6c 61 79 62 61         /* Playba
18770 63 6b 20 61 6e 64 20 64 65 6c 65 74 65 20 74 68  ck and delete th
18780 65 20 6a 6f 75 72 6e 61 6c 2e 20 20 44 72 6f 70  e journal.  Drop
18790 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77 72   the database wr
187a0 69 74 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6c  ite.        ** l
187b0 6f 63 6b 20 61 6e 64 20 72 65 61 63 71 75 69 72  ock and reacquir
187c0 65 20 74 68 65 20 72 65 61 64 20 6c 6f 63 6b 2e  e the read lock.
187d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
187e0 20 20 20 20 72 63 20 3d 20 70 61 67 65 72 5f 70      rc = pager_p
187f0 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 2c 20  layback(pPager, 
18800 31 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  1);.        if( 
18810 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
18820 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
18830 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70 50  n pager_error(pP
18840 61 67 65 72 2c 20 72 63 29 3b 0a 20 20 20 20 20  ager, rc);.     
18850 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73     }.        ass
18860 65 72 74 28 70 50 61 67 65 72 2d 3e 73 74 61 74  ert(pPager->stat
18870 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45 44 20  e==PAGER_SHARED 
18880 7c 7c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  || .            
18890 28 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73 69  (pPager->exclusi
188a0 76 65 4d 6f 64 65 20 26 26 20 70 50 61 67 65 72  veMode && pPager
188b0 2d 3e 73 74 61 74 65 3e 50 41 47 45 52 5f 53 48  ->state>PAGER_SH
188c0 41 52 45 44 29 0a 20 20 20 20 20 20 20 20 29 3b  ARED).        );
188d0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
188e0 69 66 28 20 70 50 61 67 65 72 2d 3e 70 41 6c 6c  if( pPager->pAll
188f0 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 54   ){.        /* T
18900 68 65 20 73 68 61 72 65 64 2d 6c 6f 63 6b 20 68  he shared-lock h
18910 61 73 20 6a 75 73 74 20 62 65 65 6e 20 61 63 71  as just been acq
18920 75 69 72 65 64 20 6f 6e 20 74 68 65 20 64 61 74  uired on the dat
18930 61 62 61 73 65 20 66 69 6c 65 0a 20 20 20 20 20  abase file.     
18940 20 20 20 2a 2a 20 61 6e 64 20 74 68 65 72 65 20     ** and there 
18950 61 72 65 20 61 6c 72 65 61 64 79 20 70 61 67 65  are already page
18960 73 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 28  s in the cache (
18970 66 72 6f 6d 20 61 20 70 72 65 76 69 6f 75 73 0a  from a previous.
18980 20 20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20          ** read 
18990 6f 72 20 77 72 69 74 65 20 74 72 61 6e 73 61 63  or write transac
189a0 74 69 6f 6e 29 2e 20 20 43 68 65 63 6b 20 74 6f  tion).  Check to
189b0 20 73 65 65 20 69 66 20 74 68 65 20 64 61 74 61   see if the data
189c0 62 61 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20  base.        ** 
189d0 68 61 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65  has been modifie
189e0 64 2e 20 20 49 66 20 74 68 65 20 64 61 74 61 62  d.  If the datab
189f0 61 73 65 20 68 61 73 20 63 68 61 6e 67 65 64 2c  ase has changed,
18a00 20 66 6c 75 73 68 20 74 68 65 0a 20 20 20 20 20   flush the.     
18a10 20 20 20 2a 2a 20 63 61 63 68 65 2e 0a 20 20 20     ** cache..   
18a20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20       **.        
18a30 2a 2a 20 44 61 74 61 62 61 73 65 20 63 68 61 6e  ** Database chan
18a40 67 65 73 20 69 73 20 64 65 74 65 63 74 65 64 20  ges is detected 
18a50 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 31 35  by looking at 15
18a60 20 62 79 74 65 73 20 62 65 67 69 6e 6e 69 6e 67   bytes beginning
18a70 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 74 20 6f  .        ** at o
18a80 66 66 73 65 74 20 32 34 20 69 6e 74 6f 20 74 68  ffset 24 into th
18a90 65 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 72  e file.  The fir
18aa0 73 74 20 34 20 6f 66 20 74 68 65 73 65 20 31 36  st 4 of these 16
18ab0 20 62 79 74 65 73 20 61 72 65 0a 20 20 20 20 20   bytes are.     
18ac0 20 20 20 2a 2a 20 61 20 33 32 2d 62 69 74 20 63     ** a 32-bit c
18ad0 6f 75 6e 74 65 72 20 74 68 61 74 20 69 73 20 69  ounter that is i
18ae0 6e 63 72 65 6d 65 6e 74 65 64 20 77 69 74 68 20  ncremented with 
18af0 65 61 63 68 20 63 68 61 6e 67 65 2e 20 20 54 68  each change.  Th
18b00 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 74 68  e.        ** oth
18b10 65 72 20 62 79 74 65 73 20 63 68 61 6e 67 65 20  er bytes change 
18b20 72 61 6e 64 6f 6d 6c 79 20 77 69 74 68 20 65 61  randomly with ea
18b30 63 68 20 66 69 6c 65 20 63 68 61 6e 67 65 20 77  ch file change w
18b40 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  hen.        ** a
18b50 20 63 6f 64 65 63 20 69 73 20 69 6e 20 75 73 65   codec is in use
18b60 2e 0a 20 20 20 20 20 20 20 20 2a 2a 20 0a 20 20  ..        ** .  
18b70 20 20 20 20 20 20 2a 2a 20 54 68 65 72 65 20 69        ** There i
18b80 73 20 61 20 76 61 6e 69 73 68 69 6e 67 6c 79 20  s a vanishingly 
18b90 73 6d 61 6c 6c 20 63 68 61 6e 63 65 20 74 68 61  small chance tha
18ba0 74 20 61 20 63 68 61 6e 67 65 20 77 69 6c 6c 20  t a change will 
18bb0 6e 6f 74 20 62 65 20 0a 20 20 20 20 20 20 20 20  not be .        
18bc0 2a 2a 20 64 65 74 65 63 74 65 64 2e 20 20 54 68  ** detected.  Th
18bd0 65 20 63 68 61 6e 63 65 20 6f 66 20 61 6e 20 75  e chance of an u
18be0 6e 64 65 74 65 63 74 65 64 20 63 68 61 6e 67 65  ndetected change
18bf0 20 69 73 20 73 6f 20 73 6d 61 6c 6c 20 74 68 61   is so small tha
18c00 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20  t.        ** it 
18c10 63 61 6e 20 62 65 20 6e 65 67 6c 65 63 74 65 64  can be neglected
18c20 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
18c30 20 20 20 20 20 63 68 61 72 20 64 62 46 69 6c 65       char dbFile
18c40 56 65 72 73 5b 73 69 7a 65 6f 66 28 70 50 61 67  Vers[sizeof(pPag
18c50 65 72 2d 3e 64 62 46 69 6c 65 56 65 72 73 29 5d  er->dbFileVers)]
18c60 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
18c70 33 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28  3PagerPagecount(
18c80 70 50 61 67 65 72 29 3b 0a 0a 20 20 20 20 20 20  pPager);..      
18c90 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72    if( pPager->er
18ca0 72 43 6f 64 65 20 29 7b 0a 20 20 20 20 20 20 20  rCode ){.       
18cb0 20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72     return pPager
18cc0 2d 3e 65 72 72 43 6f 64 65 3b 0a 20 20 20 20 20  ->errCode;.     
18cd0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
18ce0 28 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65  ( pPager->dbSize
18cf0 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
18d00 49 4f 54 52 41 43 45 28 28 22 43 4b 56 45 52 53  IOTRACE(("CKVERS
18d10 20 25 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65   %p %d\n", pPage
18d20 72 2c 20 73 69 7a 65 6f 66 28 64 62 46 69 6c 65  r, sizeof(dbFile
18d30 56 65 72 73 29 29 29 3b 0a 20 20 20 20 20 20 20  Vers)));.       
18d40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18d50 73 53 65 65 6b 28 70 50 61 67 65 72 2d 3e 66 64  sSeek(pPager->fd
18d60 2c 20 32 34 29 3b 0a 20 20 20 20 20 20 20 20 20  , 24);.         
18d70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
18d80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
18d90 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
18da0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
18db0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
18dc0 73 52 65 61 64 28 70 50 61 67 65 72 2d 3e 66 64  sRead(pPager->fd
18dd0 2c 20 26 64 62 46 69 6c 65 56 65 72 73 2c 20 73  , &dbFileVers, s
18de0 69 7a 65 6f 66 28 64 62 46 69 6c 65 56 65 72 73  izeof(dbFileVers
18df0 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ));.          if
18e00 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
18e10 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
18e20 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20  eturn rc;.      
18e30 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
18e40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6d  lse{.          m
18e50 65 6d 73 65 74 28 64 62 46 69 6c 65 56 65 72 73  emset(dbFileVers
18e60 2c 20 30 2c 20 73 69 7a 65 6f 66 28 64 62 46 69  , 0, sizeof(dbFi
18e70 6c 65 56 65 72 73 29 29 3b 0a 20 20 20 20 20 20  leVers));.      
18e80 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
18e90 20 6d 65 6d 63 6d 70 28 70 50 61 67 65 72 2d 3e   memcmp(pPager->
18ea0 64 62 46 69 6c 65 56 65 72 73 2c 20 64 62 46 69  dbFileVers, dbFi
18eb0 6c 65 56 65 72 73 2c 20 73 69 7a 65 6f 66 28 64  leVers, sizeof(d
18ec0 62 46 69 6c 65 56 65 72 73 29 29 21 3d 30 20 29  bFileVers))!=0 )
18ed0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 61 67 65  {.          page
18ee0 72 5f 72 65 73 65 74 28 70 50 61 67 65 72 29 3b  r_reset(pPager);
18ef0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
18f00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73   }.    }.    ass
18f10 65 72 74 28 20 70 50 61 67 65 72 2d 3e 65 78 63  ert( pPager->exc
18f20 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c 20 70 50  lusiveMode || pP
18f30 61 67 65 72 2d 3e 73 74 61 74 65 3c 3d 50 41 47  ager->state<=PAG
18f40 45 52 5f 53 48 41 52 45 44 20 29 3b 0a 20 20 20  ER_SHARED );.   
18f50 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
18f60 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43 4b  te==PAGER_UNLOCK
18f70 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
18f80 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
18f90 53 48 41 52 45 44 3b 0a 20 20 20 20 7d 0a 20 20  SHARED;.    }.  
18fa0 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
18fb0 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74  }../*.** Allocat
18fc0 65 20 61 20 50 67 48 64 72 20 6f 62 6a 65 63 74  e a PgHdr object
18fd0 2e 20 20 20 45 69 74 68 65 72 20 63 72 65 61 74  .   Either creat
18fe0 65 20 61 20 6e 65 77 20 6f 6e 65 20 6f 72 20 72  e a new one or r
18ff0 65 75 73 65 0a 2a 2a 20 61 6e 20 65 78 69 73 74  euse.** an exist
19000 69 6e 67 20 6f 6e 65 20 74 68 61 74 20 69 73 20  ing one that is 
19010 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 69 6e  not otherwise in
19020 20 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 41 20 6e 65   use..**.** A ne
19030 77 20 50 67 48 64 72 20 73 74 72 75 63 74 75 72  w PgHdr structur
19040 65 20 69 73 20 63 72 65 61 74 65 64 20 69 66 20  e is created if 
19050 61 6e 79 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  any of the follo
19060 77 69 6e 67 20 61 72 65 0a 2a 2a 20 74 72 75 65  wing are.** true
19070 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
19080 20 57 65 20 68 61 76 65 20 6e 6f 74 20 65 78 63   We have not exc
19090 65 65 64 65 64 20 6f 75 72 20 6d 61 78 69 6d 75  eeded our maximu
190a0 6d 20 61 6c 6c 6f 63 61 74 65 64 20 63 61 63 68  m allocated cach
190b0 65 20 73 69 7a 65 0a 2a 2a 20 20 20 20 20 20 20  e size.**       
190c0 20 20 20 61 73 20 73 65 74 20 62 79 20 74 68 65     as set by the
190d0 20 22 50 52 41 47 4d 41 20 63 61 63 68 65 5f 73   "PRAGMA cache_s
190e0 69 7a 65 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  ize" command..**
190f0 0a 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65  .**     (2)  The
19100 72 65 20 61 72 65 20 6e 6f 20 75 6e 75 73 65 64  re are no unused
19110 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 61   PgHdr objects a
19120 76 61 69 6c 61 62 6c 65 20 61 74 20 74 68 69 73  vailable at this
19130 20 74 69 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20   time..**.**    
19140 20 28 33 29 20 20 54 68 69 73 20 69 73 20 61 6e   (3)  This is an
19150 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62   in-memory datab
19160 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28  ase..**.**     (
19170 34 29 20 20 54 68 65 72 65 20 61 72 65 20 6e 6f  4)  There are no
19180 20 50 67 48 64 72 20 6f 62 6a 65 63 74 73 20 74   PgHdr objects t
19190 68 61 74 20 64 6f 20 6e 6f 74 20 72 65 71 75 69  hat do not requi
191a0 72 65 20 61 20 6a 6f 75 72 6e 61 6c 0a 2a 2a 20  re a journal.** 
191b0 20 20 20 20 20 20 20 20 20 66 69 6c 65 20 73 79           file sy
191c0 6e 63 20 61 6e 64 20 61 20 73 79 6e 63 20 6f 66  nc and a sync of
191d0 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
191e0 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 0a 2a  e is currently.*
191f0 2a 20 20 20 20 20 20 20 20 20 20 70 72 6f 68 69  *          prohi
19200 62 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 4f 74 68  bited..**.** Oth
19210 65 72 77 69 73 65 2c 20 72 65 75 73 65 20 61 6e  erwise, reuse an
19220 20 65 78 69 73 74 69 6e 67 20 50 67 48 64 72 2e   existing PgHdr.
19230 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
19240 2c 20 72 65 75 73 65 20 61 6e 0a 2a 2a 20 65 78  , reuse an.** ex
19250 69 73 74 69 6e 67 20 50 67 48 64 72 20 69 66 20  isting PgHdr if 
19260 61 6c 6c 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f  all of the follo
19270 77 69 6e 67 20 61 72 65 20 74 72 75 65 3a 0a 2a  wing are true:.*
19280 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20 20 57 65  *.**     (1)  We
19290 20 68 61 76 65 20 72 65 61 63 68 65 64 20 6f 72   have reached or
192a0 20 65 78 63 65 65 64 65 64 20 74 68 65 20 6d 61   exceeded the ma
192b0 78 69 6d 75 6d 20 63 61 63 68 65 20 73 69 7a 65  ximum cache size
192c0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 61 6c 6c  .**          all
192d0 6f 77 65 64 20 62 79 20 22 50 52 41 47 4d 41 20  owed by "PRAGMA 
192e0 63 61 63 68 65 5f 73 69 7a 65 22 2e 0a 2a 2a 0a  cache_size"..**.
192f0 2a 2a 20 20 20 20 20 28 32 29 20 20 54 68 65 72  **     (2)  Ther
19300 65 20 69 73 20 61 20 50 67 48 64 72 20 61 76 61  e is a PgHdr ava
19310 69 6c 61 62 6c 65 20 77 69 74 68 20 50 67 48 64  ilable with PgHd
19320 72 2d 3e 6e 52 65 66 3d 3d 30 0a 2a 2a 0a 2a 2a  r->nRef==0.**.**
19330 20 20 20 20 20 28 33 29 20 20 57 65 20 61 72 65       (3)  We are
19340 20 6e 6f 74 20 69 6e 20 61 6e 20 69 6e 2d 6d 65   not in an in-me
19350 6d 6f 72 79 20 64 61 74 61 62 61 73 65 0a 2a 2a  mory database.**
19360 0a 2a 2a 20 20 20 20 20 28 34 29 20 20 45 69 74  .**     (4)  Eit
19370 68 65 72 20 74 68 65 72 65 20 69 73 20 61 6e 20  her there is an 
19380 61 76 61 69 6c 61 62 6c 65 20 50 67 48 64 72 20  available PgHdr 
19390 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20 6e 65  that does not ne
193a0 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 74  ed.**          t
193b0 6f 20 62 65 20 73 79 6e 63 65 64 20 74 6f 20 64  o be synced to d
193c0 69 73 6b 20 6f 72 20 65 6c 73 65 20 64 69 73 6b  isk or else disk
193d0 20 73 79 6e 63 69 6e 67 20 69 73 20 63 75 72 72   syncing is curr
193e0 65 6e 74 6c 79 0a 2a 2a 20 20 20 20 20 20 20 20  ently.**        
193f0 20 20 61 6c 6c 6f 77 65 64 2e 0a 2a 2f 0a 73 74    allowed..*/.st
19400 61 74 69 63 20 69 6e 74 20 70 61 67 65 72 41 6c  atic int pagerAl
19410 6c 6f 63 61 74 65 50 61 67 65 28 50 61 67 65 72  locatePage(Pager
19420 20 2a 70 50 61 67 65 72 2c 20 50 67 48 64 72 20   *pPager, PgHdr 
19430 2a 2a 70 70 50 67 29 7b 0a 20 20 69 6e 74 20 72  **ppPg){.  int r
19440 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
19450 20 50 67 48 64 72 20 2a 70 50 67 3b 0a 0a 20 20   PgHdr *pPg;..  
19460 2f 2a 20 43 72 65 61 74 65 20 61 20 6e 65 77 20  /* Create a new 
19470 50 67 48 64 72 20 69 66 20 61 6e 79 20 6f 66 20  PgHdr if any of 
19480 74 68 65 20 66 6f 75 72 20 63 6f 6e 64 69 74 69  the four conditi
19490 6f 6e 73 20 64 65 66 69 6e 65 64 20 0a 20 20 2a  ons defined .  *
194a0 2a 20 61 62 6f 76 65 20 69 73 20 6d 65 74 3a 20  * above is met: 
194b0 2a 2f 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  */.  if( pPager-
194c0 3e 6e 50 61 67 65 3c 70 50 61 67 65 72 2d 3e 6d  >nPage<pPager->m
194d0 78 50 61 67 65 0a 20 20 20 7c 7c 20 70 50 61 67  xPage.   || pPag
194e0 65 72 2d 3e 70 46 69 72 73 74 3d 3d 30 20 0a 20  er->pFirst==0 . 
194f0 20 20 7c 7c 20 4d 45 4d 44 42 0a 20 20 20 7c 7c    || MEMDB.   ||
19500 20 28 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74   (pPager->pFirst
19510 53 79 6e 63 65 64 3d 3d 30 20 26 26 20 70 50 61  Synced==0 && pPa
19520 67 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 29 0a  ger->doNotSync).
19530 20 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61    ){.    if( pPa
19540 67 65 72 2d 3e 6e 50 61 67 65 3e 3d 70 50 61 67  ger->nPage>=pPag
19550 65 72 2d 3e 6e 48 61 73 68 20 29 7b 0a 20 20 20  er->nHash ){.   
19560 20 20 20 70 61 67 65 72 5f 72 65 73 69 7a 65 5f     pager_resize_
19570 68 61 73 68 5f 74 61 62 6c 65 28 70 50 61 67 65  hash_table(pPage
19580 72 2c 0a 20 20 20 20 20 20 20 20 20 70 50 61 67  r,.         pPag
19590 65 72 2d 3e 6e 48 61 73 68 3c 32 35 36 20 3f 20  er->nHash<256 ? 
195a0 32 35 36 20 3a 20 70 50 61 67 65 72 2d 3e 6e 48  256 : pPager->nH
195b0 61 73 68 2a 32 29 3b 0a 20 20 20 20 20 20 69 66  ash*2);.      if
195c0 28 20 70 50 61 67 65 72 2d 3e 6e 48 61 73 68 3d  ( pPager->nHash=
195d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  =0 ){.        rc
195e0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
195f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 70 61  .        goto pa
19600 67 65 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74  ger_allocate_out
19610 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
19620 20 20 20 20 70 50 67 20 3d 20 73 71 6c 69 74 65      pPg = sqlite
19630 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
19640 66 28 2a 70 50 67 29 20 2b 20 70 50 61 67 65 72  f(*pPg) + pPager
19650 2d 3e 70 61 67 65 53 69 7a 65 0a 20 20 20 20 20  ->pageSize.     
19660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19670 20 20 20 20 20 20 20 2b 20 73 69 7a 65 6f 66 28         + sizeof(
19680 75 33 32 29 20 2b 20 70 50 61 67 65 72 2d 3e 6e  u32) + pPager->n
19690 45 78 74 72 61 0a 20 20 20 20 20 20 20 20 20 20  Extra.          
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
196b0 20 20 2b 20 4d 45 4d 44 42 2a 73 69 7a 65 6f 66    + MEMDB*sizeof
196c0 28 50 67 48 69 73 74 6f 72 79 29 20 29 3b 0a 20  (PgHistory) );. 
196d0 20 20 20 69 66 28 20 70 50 67 3d 3d 30 20 29 7b     if( pPg==0 ){
196e0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
196f0 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20  TE_NOMEM;.      
19700 67 6f 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63  goto pager_alloc
19710 61 74 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20  ate_out;.    }. 
19720 20 20 20 6d 65 6d 73 65 74 28 70 50 67 2c 20 30     memset(pPg, 0
19730 2c 20 73 69 7a 65 6f 66 28 2a 70 50 67 29 29 3b  , sizeof(*pPg));
19740 0a 20 20 20 20 69 66 28 20 4d 45 4d 44 42 20 29  .    if( MEMDB )
19750 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 50  {.      memset(P
19760 47 48 44 52 5f 54 4f 5f 48 49 53 54 28 70 50 67  GHDR_TO_HIST(pPg
19770 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20 73 69  , pPager), 0, si
19780 7a 65 6f 66 28 50 67 48 69 73 74 6f 72 79 29 29  zeof(PgHistory))
19790 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 67 2d  ;.    }.    pPg-
197a0 3e 70 50 61 67 65 72 20 3d 20 70 50 61 67 65 72  >pPager = pPager
197b0 3b 0a 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74  ;.    pPg->pNext
197c0 41 6c 6c 20 3d 20 70 50 61 67 65 72 2d 3e 70 41  All = pPager->pA
197d0 6c 6c 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e  ll;.    pPager->
197e0 70 41 6c 6c 20 3d 20 70 50 67 3b 0a 20 20 20 20  pAll = pPg;.    
197f0 70 50 61 67 65 72 2d 3e 6e 50 61 67 65 2b 2b 3b  pPager->nPage++;
19800 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
19810 20 52 65 63 79 63 6c 65 20 61 6e 20 65 78 69 73   Recycle an exis
19820 74 69 6e 67 20 70 61 67 65 20 77 69 74 68 20 61  ting page with a
19830 20 7a 65 72 6f 20 72 65 66 2d 63 6f 75 6e 74 2e   zero ref-count.
19840 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20 70 61 67   */.    rc = pag
19850 65 72 5f 72 65 63 79 63 6c 65 28 70 50 61 67 65  er_recycle(pPage
19860 72 2c 20 31 2c 20 26 70 50 67 29 3b 0a 20 20 20  r, 1, &pPg);.   
19870 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19880 42 55 53 59 20 29 7b 0a 20 20 20 20 20 20 72 63  BUSY ){.      rc
19890 20 3d 20 53 51 4c 49 54 45 5f 49 4f 45 52 52 5f   = SQLITE_IOERR_
198a0 42 4c 4f 43 4b 45 44 3b 0a 20 20 20 20 7d 0a 20  BLOCKED;.    }. 
198b0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
198c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 67 6f  E_OK ){.      go
198d0 74 6f 20 70 61 67 65 72 5f 61 6c 6c 6f 63 61 74  to pager_allocat
198e0 65 5f 6f 75 74 3b 0a 20 20 20 20 7d 0a 20 20 20  e_out;.    }.   
198f0 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
19900 3e 73 74 61 74 65 3e 3d 53 48 41 52 45 44 5f 4c  >state>=SHARED_L
19910 4f 43 4b 20 29 3b 0a 20 20 20 20 61 73 73 65 72  OCK );.    asser
19920 74 28 70 50 67 29 3b 0a 20 20 7d 0a 20 20 2a 70  t(pPg);.  }.  *p
19930 70 50 67 20 3d 20 70 50 67 3b 0a 0a 70 61 67 65  pPg = pPg;..page
19940 72 5f 61 6c 6c 6f 63 61 74 65 5f 6f 75 74 3a 0a  r_allocate_out:.
19950 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
19960 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73 75 72 65 20  /*.** Make sure 
19970 77 65 20 68 61 76 65 20 74 68 65 20 63 6f 6e 74  we have the cont
19980 65 6e 74 20 66 6f 72 20 61 20 70 61 67 65 2e 20  ent for a page. 
19990 20 49 66 20 74 68 65 20 70 61 67 65 20 77 61 73   If the page was
199a0 0a 2a 2a 20 70 72 65 76 69 6f 75 73 6c 79 20 61  .** previously a
199b0 63 71 75 69 72 65 64 20 77 69 74 68 20 6e 6f 43  cquired with noC
199c0 6f 6e 74 65 6e 74 3d 3d 31 2c 20 74 68 65 6e 20  ontent==1, then 
199d0 74 68 65 20 63 6f 6e 74 65 6e 74 20 77 61 73 0a  the content was.
199e0 2a 2a 20 6a 75 73 74 20 69 6e 69 74 69 61 6c 69  ** just initiali
199f0 7a 65 64 20 74 6f 20 7a 65 72 6f 73 20 69 6e 73  zed to zeros ins
19a00 74 65 61 64 20 6f 66 20 62 65 69 6e 67 20 72 65  tead of being re
19a10 61 64 20 66 72 6f 6d 20 64 69 73 6b 2e 0a 2a 2a  ad from disk..**
19a20 20 42 75 74 20 6e 6f 77 20 77 65 20 6e 65 65 64   But now we need
19a30 20 74 68 65 20 72 65 61 6c 20 64 61 74 61 20 6f   the real data o
19a40 66 66 20 6f 66 20 64 69 73 6b 2e 20 20 53 6f 20  ff of disk.  So 
19a50 6d 61 6b 65 20 73 75 72 65 20 77 65 0a 2a 2a 20  make sure we.** 
19a60 68 61 76 65 20 69 74 2e 20 20 52 65 61 64 20 69  have it.  Read i
19a70 74 20 69 6e 20 69 66 20 77 65 20 64 6f 20 6e 6f  t in if we do no
19a80 74 20 68 61 76 65 20 69 74 20 61 6c 72 65 61 64  t have it alread
19a90 79 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  y..*/.static int
19aa0 20 70 61 67 65 72 5f 67 65 74 5f 63 6f 6e 74 65   pager_get_conte
19ab0 6e 74 28 50 67 48 64 72 20 2a 70 50 67 29 7b 0a  nt(PgHdr *pPg){.
19ac0 20 20 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 52    if( pPg->needR
19ad0 65 61 64 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  ead ){.    int r
19ae0 63 20 3d 20 72 65 61 64 44 62 50 61 67 65 28 70  c = readDbPage(p
19af0 50 67 2d 3e 70 50 61 67 65 72 2c 20 70 50 67 2c  Pg->pPager, pPg,
19b00 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
19b10 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
19b20 4f 4b 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  OK ){.      pPg-
19b30 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
19b40 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
19b50 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
19b60 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51  .  }.  return SQ
19b70 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
19b80 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67 65  * Acquire a page
19b90 2e 0a 2a 2a 0a 2a 2a 20 41 20 72 65 61 64 20 6c  ..**.** A read l
19ba0 6f 63 6b 20 6f 6e 20 74 68 65 20 64 69 73 6b 20  ock on the disk 
19bb0 66 69 6c 65 20 69 73 20 6f 62 74 61 69 6e 65 64  file is obtained
19bc0 20 77 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   when the first 
19bd0 70 61 67 65 20 69 73 20 61 63 71 75 69 72 65 64  page is acquired
19be0 2e 20 0a 2a 2a 20 54 68 69 73 20 72 65 61 64 20  . .** This read 
19bf0 6c 6f 63 6b 20 69 73 20 64 72 6f 70 70 65 64 20  lock is dropped 
19c00 77 68 65 6e 20 74 68 65 20 6c 61 73 74 20 70 61  when the last pa
19c10 67 65 20 69 73 20 72 65 6c 65 61 73 65 64 2e 0a  ge is released..
19c20 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
19c30 6e 65 20 77 6f 72 6b 73 20 66 6f 72 20 61 6e 79  ne works for any
19c40 20 70 61 67 65 20 6e 75 6d 62 65 72 20 67 72 65   page number gre
19c50 61 74 65 72 20 74 68 61 6e 20 30 2e 20 20 49 66  ater than 0.  If
19c60 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 2a 2a   the database.**
19c70 20 66 69 6c 65 20 69 73 20 73 6d 61 6c 6c 65 72   file is smaller
19c80 20 74 68 61 6e 20 74 68 65 20 72 65 71 75 65 73   than the reques
19c90 74 65 64 20 70 61 67 65 2c 20 74 68 65 6e 20 6e  ted page, then n
19ca0 6f 20 61 63 74 75 61 6c 20 64 69 73 6b 0a 2a 2a  o actual disk.**
19cb0 20 72 65 61 64 20 6f 63 63 75 72 73 20 61 6e 64   read occurs and
19cc0 20 74 68 65 20 6d 65 6d 6f 72 79 20 69 6d 61 67   the memory imag
19cd0 65 20 6f 66 20 74 68 65 20 70 61 67 65 20 69 73  e of the page is
19ce0 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 0a   initialized to.
19cf0 2a 2a 20 61 6c 6c 20 7a 65 72 6f 73 2e 20 20 54  ** all zeros.  T
19d00 68 65 20 65 78 74 72 61 20 64 61 74 61 20 61 70  he extra data ap
19d10 70 65 6e 64 65 64 20 74 6f 20 61 20 70 61 67 65  pended to a page
19d20 20 69 73 20 61 6c 77 61 79 73 20 69 6e 69 74 69   is always initi
19d30 61 6c 69 7a 65 64 0a 2a 2a 20 74 6f 20 7a 65 72  alized.** to zer
19d40 6f 73 20 74 68 65 20 66 69 72 73 74 20 74 69 6d  os the first tim
19d50 65 20 61 20 70 61 67 65 20 69 73 20 6c 6f 61 64  e a page is load
19d60 65 64 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 2e 0a  ed into memory..
19d70 2a 2a 0a 2a 2a 20 54 68 65 20 61 63 71 75 69 73  **.** The acquis
19d80 69 74 69 6f 6e 20 6d 69 67 68 74 20 66 61 69 6c  ition might fail
19d90 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 65 61   for several rea
19da0 73 6f 6e 73 2e 20 20 49 6e 20 61 6c 6c 20 63 61  sons.  In all ca
19db0 73 65 73 2c 0a 2a 2a 20 61 6e 20 61 70 70 72 6f  ses,.** an appro
19dc0 70 72 69 61 74 65 20 65 72 72 6f 72 20 63 6f 64  priate error cod
19dd0 65 20 69 73 20 72 65 74 75 72 6e 65 64 20 61 6e  e is returned an
19de0 64 20 2a 70 70 50 61 67 65 20 69 73 20 73 65 74  d *ppPage is set
19df0 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20   to NULL..**.** 
19e00 53 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33  See also sqlite3
19e10 50 61 67 65 72 4c 6f 6f 6b 75 70 28 29 2e 20 20  PagerLookup().  
19e20 42 6f 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  Both this routin
19e30 65 20 61 6e 64 20 4c 6f 6f 6b 75 70 28 29 20 61  e and Lookup() a
19e40 74 74 65 6d 70 74 0a 2a 2a 20 74 6f 20 66 69 6e  ttempt.** to fin
19e50 64 20 61 20 70 61 67 65 20 69 6e 20 74 68 65 20  d a page in the 
19e60 69 6e 2d 6d 65 6d 6f 72 79 20 63 61 63 68 65 20  in-memory cache 
19e70 66 69 72 73 74 2e 20 20 49 66 20 74 68 65 20 70  first.  If the p
19e80 61 67 65 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  age is not alrea
19e90 64 79 0a 2a 2a 20 69 6e 20 6d 65 6d 6f 72 79 2c  dy.** in memory,
19ea0 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 67 6f   this routine go
19eb0 65 73 20 74 6f 20 64 69 73 6b 20 74 6f 20 72 65  es to disk to re
19ec0 61 64 20 69 74 20 69 6e 20 77 68 65 72 65 61 73  ad it in whereas
19ed0 20 4c 6f 6f 6b 75 70 28 29 0a 2a 2a 20 6a 75 73   Lookup().** jus
19ee0 74 20 72 65 74 75 72 6e 73 20 30 2e 20 20 54 68  t returns 0.  Th
19ef0 69 73 20 72 6f 75 74 69 6e 65 20 61 63 71 75 69  is routine acqui
19f00 72 65 73 20 61 20 72 65 61 64 2d 6c 6f 63 6b 20  res a read-lock 
19f10 74 68 65 20 66 69 72 73 74 20 74 69 6d 65 20 69  the first time i
19f20 74 0a 2a 2a 20 68 61 73 20 74 6f 20 67 6f 20 74  t.** has to go t
19f30 6f 20 64 69 73 6b 2c 20 61 6e 64 20 63 6f 75 6c  o disk, and coul
19f40 64 20 61 6c 73 6f 20 70 6c 61 79 62 61 63 6b 20  d also playback 
19f50 61 6e 20 6f 6c 64 20 6a 6f 75 72 6e 61 6c 20 69  an old journal i
19f60 66 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 20  f necessary..** 
19f70 53 69 6e 63 65 20 4c 6f 6f 6b 75 70 28 29 20 6e  Since Lookup() n
19f80 65 76 65 72 20 67 6f 65 73 20 74 6f 20 64 69 73  ever goes to dis
19f90 6b 2c 20 69 74 20 6e 65 76 65 72 20 68 61 73 20  k, it never has 
19fa0 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6c 6f 63  to deal with loc
19fb0 6b 73 0a 2a 2a 20 6f 72 20 6a 6f 75 72 6e 61 6c  ks.** or journal
19fc0 20 66 69 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 49 66   files..**.** If
19fd0 20 6e 6f 43 6f 6e 74 65 6e 74 20 69 73 20 66 61   noContent is fa
19fe0 6c 73 65 2c 20 74 68 65 20 70 61 67 65 20 63 6f  lse, the page co
19ff0 6e 74 65 6e 74 73 20 61 72 65 20 61 63 74 75 61  ntents are actua
1a000 6c 6c 79 20 72 65 61 64 20 66 72 6f 6d 20 64 69  lly read from di
1a010 73 6b 2e 0a 2a 2a 20 49 66 20 6e 6f 43 6f 6e 74  sk..** If noCont
1a020 65 6e 74 20 69 73 20 74 72 75 65 2c 20 69 74 20  ent is true, it 
1a030 6d 65 61 6e 73 20 74 68 61 74 20 77 65 20 64 6f  means that we do
1a040 20 6e 6f 74 20 63 61 72 65 20 61 62 6f 75 74 20   not care about 
1a050 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 2a 2a 20  the contents.** 
1a060 6f 66 20 74 68 65 20 70 61 67 65 20 61 74 20 74  of the page at t
1a070 68 69 73 20 74 69 6d 65 2c 20 73 6f 20 64 6f 20  his time, so do 
1a080 6e 6f 74 20 64 6f 20 61 20 64 69 73 6b 20 72 65  not do a disk re
1a090 61 64 2e 20 20 4a 75 73 74 20 66 69 6c 6c 20 69  ad.  Just fill i
1a0a0 6e 20 74 68 65 0a 2a 2a 20 70 61 67 65 20 63 6f  n the.** page co
1a0b0 6e 74 65 6e 74 20 77 69 74 68 20 7a 65 72 6f 73  ntent with zeros
1a0c0 2e 20 20 42 75 74 20 6d 61 72 6b 20 74 68 65 20  .  But mark the 
1a0d0 66 61 63 74 20 74 68 61 74 20 77 65 20 68 61 76  fact that we hav
1a0e0 65 20 6e 6f 74 20 72 65 61 64 20 74 68 65 0a 2a  e not read the.*
1a0f0 2a 20 63 6f 6e 74 65 6e 74 20 62 79 20 73 65 74  * content by set
1a100 74 69 6e 67 20 74 68 65 20 50 67 48 64 72 2e 6e  ting the PgHdr.n
1a110 65 65 64 52 65 61 64 20 66 6c 61 67 2e 20 20 4c  eedRead flag.  L
1a120 61 74 65 72 20 6f 6e 2c 20 69 66 20 0a 2a 2a 20  ater on, if .** 
1a130 73 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74  sqlite3PagerWrit
1a140 65 28 29 20 69 73 20 63 61 6c 6c 65 64 20 6f 6e  e() is called on
1a150 20 74 68 69 73 20 70 61 67 65 20 6f 72 20 69 66   this page or if
1a160 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
1a170 0a 2a 2a 20 63 61 6c 6c 65 64 20 61 67 61 69 6e  .** called again
1a180 20 77 69 74 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d   with noContent=
1a190 3d 30 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74  =0, that means t
1a1a0 68 61 74 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  hat the content 
1a1b0 69 73 20 6e 65 65 64 65 64 0a 2a 2a 20 61 6e 64  is needed.** and
1a1c0 20 74 68 65 20 64 69 73 6b 20 72 65 61 64 20 73   the disk read s
1a1d0 68 6f 75 6c 64 20 6f 63 63 75 72 20 61 74 20 74  hould occur at t
1a1e0 68 61 74 20 70 6f 69 6e 74 2e 0a 2a 2f 0a 69 6e  hat point..*/.in
1a1f0 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 41 63  t sqlite3PagerAc
1a200 71 75 69 72 65 28 0a 20 20 50 61 67 65 72 20 2a  quire(.  Pager *
1a210 70 50 61 67 65 72 2c 20 20 20 20 20 20 2f 2a 20  pPager,      /* 
1a220 54 68 65 20 70 61 67 65 72 20 6f 70 65 6e 20 6f  The pager open o
1a230 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  n the database f
1a240 69 6c 65 20 2a 2f 0a 20 20 50 67 6e 6f 20 70 67  ile */.  Pgno pg
1a250 6e 6f 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20  no,          /* 
1a260 50 61 67 65 20 6e 75 6d 62 65 72 20 74 6f 20 66  Page number to f
1a270 65 74 63 68 20 2a 2f 0a 20 20 44 62 50 61 67 65  etch */.  DbPage
1a280 20 2a 2a 70 70 50 61 67 65 2c 20 20 20 20 2f 2a   **ppPage,    /*
1a290 20 57 72 69 74 65 20 61 20 70 6f 69 6e 74 65 72   Write a pointer
1a2a0 20 74 6f 20 74 68 65 20 70 61 67 65 20 68 65 72   to the page her
1a2b0 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 43 6f 6e  e */.  int noCon
1a2c0 74 65 6e 74 20 20 20 20 20 20 20 2f 2a 20 44 6f  tent       /* Do
1a2d0 20 6e 6f 74 20 62 6f 74 68 65 72 20 72 65 61 64   not bother read
1a2e0 69 6e 67 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  ing content from
1a2f0 20 64 69 73 6b 20 69 66 20 74 72 75 65 20 2a 2f   disk if true */
1a300 0a 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  .){.  PgHdr *pPg
1a310 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  ;.  int rc;..  a
1a320 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
1a330 74 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f  tate==PAGER_UNLO
1a340 43 4b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6e 52  CK || pPager->nR
1a350 65 66 3e 30 20 7c 7c 20 70 67 6e 6f 3d 3d 31 20  ef>0 || pgno==1 
1a360 29 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 6d 61 78  );..  /* The max
1a370 69 6d 75 6d 20 70 61 67 65 20 6e 75 6d 62 65 72  imum page number
1a380 20 69 73 20 32 5e 33 31 2e 20 52 65 74 75 72 6e   is 2^31. Return
1a390 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
1a3a0 69 66 20 61 20 70 61 67 65 0a 20 20 2a 2a 20 6e  if a page.  ** n
1a3b0 75 6d 62 65 72 20 67 72 65 61 74 65 72 20 74 68  umber greater th
1a3c0 61 6e 20 74 68 69 73 2c 20 6f 72 20 7a 65 72 6f  an this, or zero
1a3d0 2c 20 69 73 20 72 65 71 75 65 73 74 65 64 2e 0a  , is requested..
1a3e0 20 20 2a 2f 0a 20 20 69 66 28 20 70 67 6e 6f 3e    */.  if( pgno>
1a3f0 50 41 47 45 52 5f 4d 41 58 5f 50 47 4e 4f 20 7c  PAGER_MAX_PGNO |
1a400 7c 20 70 67 6e 6f 3d 3d 30 20 7c 7c 20 70 67 6e  | pgno==0 || pgn
1a410 6f 3d 3d 50 41 47 45 52 5f 4d 4a 5f 50 47 4e 4f  o==PAGER_MJ_PGNO
1a420 28 70 50 61 67 65 72 29 20 29 7b 0a 20 20 20 20  (pPager) ){.    
1a430 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 43 4f  return SQLITE_CO
1a440 52 52 55 50 54 5f 42 4b 50 54 3b 0a 20 20 7d 0a  RRUPT_BKPT;.  }.
1a450 0a 20 20 2f 2a 20 4d 61 6b 65 20 73 75 72 65 20  .  /* Make sure 
1a460 77 65 20 68 61 76 65 20 6e 6f 74 20 68 69 74 20  we have not hit 
1a470 61 6e 79 20 63 72 69 74 69 63 61 6c 20 65 72 72  any critical err
1a480 6f 72 73 2e 0a 20 20 2a 2f 20 0a 20 20 61 73 73  ors..  */ .  ass
1a490 65 72 74 28 20 70 50 61 67 65 72 21 3d 30 20 29  ert( pPager!=0 )
1a4a0 3b 0a 20 20 2a 70 70 50 61 67 65 20 3d 20 30 3b  ;.  *ppPage = 0;
1a4b0 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65  .  if( pPager->e
1a4c0 72 72 43 6f 64 65 20 26 26 20 70 50 61 67 65 72  rrCode && pPager
1a4d0 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51 4c 49 54  ->errCode!=SQLIT
1a4e0 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20 20 72 65  E_FULL ){.    re
1a4f0 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 65 72 72  turn pPager->err
1a500 43 6f 64 65 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  Code;.  }..  /* 
1a510 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1a520 69 72 73 74 20 70 61 67 65 20 61 63 63 65 73 73  irst page access
1a530 65 64 2c 20 74 68 65 6e 20 67 65 74 20 61 20 53  ed, then get a S
1a540 48 41 52 45 44 20 6c 6f 63 6b 0a 20 20 2a 2a 20  HARED lock.  ** 
1a550 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  on the database 
1a560 66 69 6c 65 2e 20 70 61 67 65 72 53 68 61 72 65  file. pagerShare
1a570 64 4c 6f 63 6b 28 29 20 69 73 20 61 20 6e 6f 2d  dLock() is a no-
1a580 6f 70 20 69 66 20 0a 20 20 2a 2a 20 61 20 64 61  op if .  ** a da
1a590 74 61 62 61 73 65 20 6c 6f 63 6b 20 69 73 20 61  tabase lock is a
1a5a0 6c 72 65 61 64 79 20 68 65 6c 64 2e 0a 20 20 2a  lready held..  *
1a5b0 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 53 68  /.  rc = pagerSh
1a5c0 61 72 65 64 4c 6f 63 6b 28 70 50 61 67 65 72 29  aredLock(pPager)
1a5d0 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
1a5e0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 65 74  TE_OK ){.    ret
1a5f0 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 61 73  urn rc;.  }.  as
1a600 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73 74  sert( pPager->st
1a610 61 74 65 21 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate!=PAGER_UNLOC
1a620 4b 20 29 3b 0a 0a 20 20 70 50 67 20 3d 20 70 61  K );..  pPg = pa
1a630 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61 67 65  ger_lookup(pPage
1a640 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66 28 20  r, pgno);.  if( 
1a650 70 50 67 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a  pPg==0 ){.    /*
1a660 20 54 68 65 20 72 65 71 75 65 73 74 65 64 20 70   The requested p
1a670 61 67 65 20 69 73 20 6e 6f 74 20 69 6e 20 74 68  age is not in th
1a680 65 20 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f  e page cache. */
1a690 0a 20 20 20 20 69 6e 74 20 6e 4d 61 78 3b 0a 20  .    int nMax;. 
1a6a0 20 20 20 69 6e 74 20 68 3b 0a 20 20 20 20 50 41     int h;.    PA
1a6b0 47 45 52 5f 49 4e 43 52 28 70 50 61 67 65 72 2d  GER_INCR(pPager-
1a6c0 3e 6e 4d 69 73 73 29 3b 0a 20 20 20 20 72 63 20  >nMiss);.    rc 
1a6d0 3d 20 70 61 67 65 72 41 6c 6c 6f 63 61 74 65 50  = pagerAllocateP
1a6e0 61 67 65 28 70 50 61 67 65 72 2c 20 26 70 50 67  age(pPager, &pPg
1a6f0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  );.    if( rc!=S
1a700 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
1a710 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20    return rc;.   
1a720 20 7d 0a 0a 20 20 20 20 70 50 67 2d 3e 70 67 6e   }..    pPg->pgn
1a730 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 20 20 61 73  o = pgno;.    as
1a740 73 65 72 74 28 20 21 4d 45 4d 44 42 20 7c 7c 20  sert( !MEMDB || 
1a750 70 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 73 74 6d  pgno>pPager->stm
1a760 74 53 69 7a 65 20 29 3b 0a 20 20 20 20 69 66 28  tSize );.    if(
1a770 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1a780 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f  nal && (int)pgno
1a790 3c 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  <=pPager->origDb
1a7a0 53 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 73 71  Size ){.      sq
1a7b0 6c 69 74 65 33 43 68 65 63 6b 4d 65 6d 6f 72 79  lite3CheckMemory
1a7c0 28 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72  (pPager->aInJour
1a7d0 6e 61 6c 2c 20 70 67 6e 6f 2f 38 29 3b 0a 20 20  nal, pgno/8);.  
1a7e0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1a7f0 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
1a800 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e  );.      pPg->in
1a810 4a 6f 75 72 6e 61 6c 20 3d 20 28 70 50 61 67 65  Journal = (pPage
1a820 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 67  r->aInJournal[pg
1a830 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28 70 67 6e  no/8] & (1<<(pgn
1a840 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20 20 20 20  o&7)))!=0;.     
1a850 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d   pPg->needSync =
1a860 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
1a870 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72       pPg->inJour
1a880 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  nal = 0;.      p
1a890 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 30  Pg->needSync = 0
1a8a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 61 6b  ;.    }..    mak
1a8b0 65 43 6c 65 61 6e 28 70 50 67 29 3b 0a 20 20 20  eClean(pPg);.   
1a8c0 20 70 50 67 2d 3e 6e 52 65 66 20 3d 20 31 3b 0a   pPg->nRef = 1;.
1a8d0 20 20 20 20 52 45 46 49 4e 46 4f 28 70 50 67 29      REFINFO(pPg)
1a8e0 3b 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 6e  ;..    pPager->n
1a8f0 52 65 66 2b 2b 3b 0a 20 20 20 20 69 66 28 20 70  Ref++;.    if( p
1a900 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 3e 30 20  Pager->nExtra>0 
1a910 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  ){.      memset(
1a920 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41 28 70  PGHDR_TO_EXTRA(p
1a930 50 67 2c 20 70 50 61 67 65 72 29 2c 20 30 2c 20  Pg, pPager), 0, 
1a940 70 50 61 67 65 72 2d 3e 6e 45 78 74 72 61 29 3b  pPager->nExtra);
1a950 0a 20 20 20 20 7d 0a 20 20 20 20 6e 4d 61 78 20  .    }.    nMax 
1a960 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50 61  = sqlite3PagerPa
1a970 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29 3b  gecount(pPager);
1a980 0a 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d  .    if( pPager-
1a990 3e 65 72 72 43 6f 64 65 20 29 7b 0a 20 20 20 20  >errCode ){.    
1a9a0 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e    sqlite3PagerUn
1a9b0 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20 20  ref(pPg);.      
1a9c0 72 63 20 3d 20 70 50 61 67 65 72 2d 3e 65 72 72  rc = pPager->err
1a9d0 43 6f 64 65 3b 0a 20 20 20 20 20 20 72 65 74 75  Code;.      retu
1a9e0 72 6e 20 72 63 3b 0a 20 20 20 20 7d 0a 0a 20 20  rn rc;.    }..  
1a9f0 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
1aa00 65 20 70 61 67 65 20 77 69 74 68 20 64 61 74 61  e page with data
1aa10 2c 20 65 69 74 68 65 72 20 62 79 20 72 65 61 64  , either by read
1aa20 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 64 61 74  ing from the dat
1aa30 61 62 61 73 65 0a 20 20 20 20 2a 2a 20 66 69 6c  abase.    ** fil
1aa40 65 2c 20 6f 72 20 62 79 20 73 65 74 74 69 6e 67  e, or by setting
1aa50 20 74 68 65 20 65 6e 74 69 72 65 20 70 61 67 65   the entire page
1aa60 20 74 6f 20 7a 65 72 6f 2e 0a 20 20 20 20 2a 2f   to zero..    */
1aa70 0a 20 20 20 20 69 66 28 20 6e 4d 61 78 3c 28 69  .    if( nMax<(i
1aa80 6e 74 29 70 67 6e 6f 20 7c 7c 20 4d 45 4d 44 42  nt)pgno || MEMDB
1aa90 20 7c 7c 20 28 6e 6f 43 6f 6e 74 65 6e 74 20 26   || (noContent &
1aaa0 26 20 21 70 50 61 67 65 72 2d 3e 61 6c 77 61 79  & !pPager->alway
1aab0 73 52 6f 6c 6c 62 61 63 6b 29 20 29 7b 0a 20 20  sRollback) ){.  
1aac0 20 20 20 20 69 66 28 20 70 67 6e 6f 3e 70 50 61      if( pgno>pPa
1aad0 67 65 72 2d 3e 6d 78 50 67 6e 6f 20 29 7b 0a 20  ger->mxPgno ){. 
1aae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 50 61         sqlite3Pa
1aaf0 67 65 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20  gerUnref(pPg);. 
1ab00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51         return SQ
1ab10 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20 20 20 20 20  LITE_FULL;.     
1ab20 20 7d 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28   }.      memset(
1ab30 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
1ab40 67 29 2c 20 30 2c 20 70 50 61 67 65 72 2d 3e 70  g), 0, pPager->p
1ab50 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
1ab60 70 50 67 2d 3e 6e 65 65 64 52 65 61 64 20 3d 20  pPg->needRead = 
1ab70 6e 6f 43 6f 6e 74 65 6e 74 20 26 26 20 21 70 50  noContent && !pP
1ab80 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  ager->alwaysRoll
1ab90 62 61 63 6b 3b 0a 20 20 20 20 20 20 49 4f 54 52  back;.      IOTR
1aba0 41 43 45 28 28 22 5a 45 52 4f 20 25 70 20 25 64  ACE(("ZERO %p %d
1abb0 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 67 6e  \n", pPager, pgn
1abc0 6f 29 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  o));.    }else{.
1abd0 20 20 20 20 20 20 72 63 20 3d 20 72 65 61 64 44        rc = readD
1abe0 62 50 61 67 65 28 70 50 61 67 65 72 2c 20 70 50  bPage(pPager, pP
1abf0 67 2c 20 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20  g, pgno);.      
1ac00 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
1ac10 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
1ac20 49 4f 45 52 52 5f 53 48 4f 52 54 5f 52 45 41 44  IOERR_SHORT_READ
1ac30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d   ){.        pPg-
1ac40 3e 70 67 6e 6f 20 3d 20 30 3b 0a 20 20 20 20 20  >pgno = 0;.     
1ac50 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
1ac60 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
1ac70 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
1ac80 20 20 20 20 7d 0a 20 20 20 20 20 20 70 50 67 2d      }.      pPg-
1ac90 3e 6e 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20  >needRead = 0;. 
1aca0 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4c 69 6e     }..    /* Lin
1acb0 6b 20 74 68 65 20 70 61 67 65 20 69 6e 74 6f 20  k the page into 
1acc0 74 68 65 20 70 61 67 65 20 68 61 73 68 20 74 61  the page hash ta
1acd0 62 6c 65 20 2a 2f 0a 20 20 20 20 68 20 3d 20 70  ble */.    h = p
1ace0 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d 3e 6e  gno & (pPager->n
1acf0 48 61 73 68 2d 31 29 3b 0a 20 20 20 20 61 73 73  Hash-1);.    ass
1ad00 65 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a  ert( pgno!=0 );.
1ad10 20 20 20 20 70 50 67 2d 3e 70 4e 65 78 74 48 61      pPg->pNextHa
1ad20 73 68 20 3d 20 70 50 61 67 65 72 2d 3e 61 48 61  sh = pPager->aHa
1ad30 73 68 5b 68 5d 3b 0a 20 20 20 20 70 50 61 67 65  sh[h];.    pPage
1ad40 72 2d 3e 61 48 61 73 68 5b 68 5d 20 3d 20 70 50  r->aHash[h] = pP
1ad50 67 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e  g;.    if( pPg->
1ad60 70 4e 65 78 74 48 61 73 68 20 29 7b 0a 20 20 20  pNextHash ){.   
1ad70 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
1ad80 70 4e 65 78 74 48 61 73 68 2d 3e 70 50 72 65 76  pNextHash->pPrev
1ad90 48 61 73 68 3d 3d 30 20 29 3b 0a 20 20 20 20 20  Hash==0 );.     
1ada0 20 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 2d   pPg->pNextHash-
1adb0 3e 70 50 72 65 76 48 61 73 68 20 3d 20 70 50 67  >pPrevHash = pPg
1adc0 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 64 65 66 20  ;.    }..#ifdef 
1add0 53 51 4c 49 54 45 5f 43 48 45 43 4b 5f 50 41 47  SQLITE_CHECK_PAG
1ade0 45 53 0a 20 20 20 20 70 50 67 2d 3e 70 61 67 65  ES.    pPg->page
1adf0 48 61 73 68 20 3d 20 70 61 67 65 72 5f 70 61 67  Hash = pager_pag
1ae00 65 68 61 73 68 28 70 50 67 29 3b 0a 23 65 6e 64  ehash(pPg);.#end
1ae10 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1ae20 2f 2a 20 54 68 65 20 72 65 71 75 65 73 74 65 64  /* The requested
1ae30 20 70 61 67 65 20 69 73 20 69 6e 20 74 68 65 20   page is in the 
1ae40 70 61 67 65 20 63 61 63 68 65 2e 20 2a 2f 0a 20  page cache. */. 
1ae50 20 20 20 61 73 73 65 72 74 28 70 50 61 67 65 72     assert(pPager
1ae60 2d 3e 6e 52 65 66 3e 30 20 7c 7c 20 70 67 6e 6f  ->nRef>0 || pgno
1ae70 3d 3d 31 29 3b 0a 20 20 20 20 50 41 47 45 52 5f  ==1);.    PAGER_
1ae80 49 4e 43 52 28 70 50 61 67 65 72 2d 3e 6e 48 69  INCR(pPager->nHi
1ae90 74 29 3b 0a 20 20 20 20 69 66 28 20 21 6e 6f 43  t);.    if( !noC
1aea0 6f 6e 74 65 6e 74 20 29 7b 0a 20 20 20 20 20 20  ontent ){.      
1aeb0 72 63 20 3d 20 70 61 67 65 72 5f 67 65 74 5f 63  rc = pager_get_c
1aec0 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20 20  ontent(pPg);.   
1aed0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1aee0 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a       return rc;.
1aef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1af00 20 20 70 61 67 65 5f 72 65 66 28 70 50 67 29 3b    page_ref(pPg);
1af10 0a 20 20 7d 0a 20 20 2a 70 70 50 61 67 65 20 3d  .  }.  *ppPage =
1af20 20 70 50 67 3b 0a 20 20 72 65 74 75 72 6e 20 53   pPg;.  return S
1af30 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
1af40 2a 2a 20 41 63 71 75 69 72 65 20 61 20 70 61 67  ** Acquire a pag
1af50 65 20 69 66 20 69 74 20 69 73 20 61 6c 72 65 61  e if it is alrea
1af60 64 79 20 69 6e 20 74 68 65 20 69 6e 2d 6d 65 6d  dy in the in-mem
1af70 6f 72 79 20 63 61 63 68 65 2e 20 20 44 6f 0a 2a  ory cache.  Do.*
1af80 2a 20 6e 6f 74 20 72 65 61 64 20 74 68 65 20 70  * not read the p
1af90 61 67 65 20 66 72 6f 6d 20 64 69 73 6b 2e 20 20  age from disk.  
1afa0 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1afb0 20 74 6f 20 74 68 65 20 70 61 67 65 2c 0a 2a 2a   to the page,.**
1afc0 20 6f 72 20 30 20 69 66 20 74 68 65 20 70 61 67   or 0 if the pag
1afd0 65 20 69 73 20 6e 6f 74 20 69 6e 20 63 61 63 68  e is not in cach
1afe0 65 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  e..**.** See als
1aff0 6f 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65  o sqlite3PagerGe
1b000 74 28 29 2e 20 20 54 68 65 20 64 69 66 66 65 72  t().  The differ
1b010 65 6e 63 65 20 62 65 74 77 65 65 6e 20 74 68 69  ence between thi
1b020 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 61 6e 64  s routine.** and
1b030 20 73 71 6c 69 74 65 33 50 61 67 65 72 47 65 74   sqlite3PagerGet
1b040 28 29 20 69 73 20 74 68 61 74 20 5f 67 65 74 28  () is that _get(
1b050 29 20 77 69 6c 6c 20 67 6f 20 74 6f 20 74 68 65  ) will go to the
1b060 20 64 69 73 6b 20 61 6e 64 20 72 65 61 64 0a 2a   disk and read.*
1b070 2a 20 69 6e 20 74 68 65 20 70 61 67 65 20 69 66  * in the page if
1b080 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1b090 20 61 6c 72 65 61 64 79 20 69 6e 20 63 61 63 68   already in cach
1b0a0 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65  e.  This routine
1b0b0 0a 2a 2a 20 72 65 74 75 72 6e 73 20 4e 55 4c 4c  .** returns NULL
1b0c0 20 69 66 20 74 68 65 20 70 61 67 65 20 69 73 20   if the page is 
1b0d0 6e 6f 74 20 69 6e 20 63 61 63 68 65 20 6f 72 20  not in cache or 
1b0e0 69 66 20 61 20 64 69 73 6b 20 49 2f 4f 20 65 72  if a disk I/O er
1b0f0 72 6f 72 20 0a 2a 2a 20 68 61 73 20 65 76 65 72  ror .** has ever
1b100 20 68 61 70 70 65 6e 65 64 2e 0a 2a 2f 0a 44 62   happened..*/.Db
1b110 50 61 67 65 20 2a 73 71 6c 69 74 65 33 50 61 67  Page *sqlite3Pag
1b120 65 72 4c 6f 6f 6b 75 70 28 50 61 67 65 72 20 2a  erLookup(Pager *
1b130 70 50 61 67 65 72 2c 20 50 67 6e 6f 20 70 67 6e  pPager, Pgno pgn
1b140 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
1b150 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  ;..  assert( pPa
1b160 67 65 72 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ger!=0 );.  asse
1b170 72 74 28 20 70 67 6e 6f 21 3d 30 20 29 3b 0a 0a  rt( pgno!=0 );..
1b180 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1b190 61 74 65 3d 3d 50 41 47 45 52 5f 55 4e 4c 4f 43  ate==PAGER_UNLOC
1b1a0 4b 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  K ){.    assert(
1b1b0 20 21 70 50 61 67 65 72 2d 3e 70 41 6c 6c 20 7c   !pPager->pAll |
1b1c0 7c 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73  | pPager->exclus
1b1d0 69 76 65 4d 6f 64 65 20 29 3b 0a 20 20 20 20 72  iveMode );.    r
1b1e0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1b1f0 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1b200 64 65 20 26 26 20 70 50 61 67 65 72 2d 3e 65 72  de && pPager->er
1b210 72 43 6f 64 65 21 3d 53 51 4c 49 54 45 5f 46 55  rCode!=SQLITE_FU
1b220 4c 4c 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  LL ){.    return
1b230 20 30 3b 0a 20 20 7d 0a 20 20 70 50 67 20 3d 20   0;.  }.  pPg = 
1b240 70 61 67 65 72 5f 6c 6f 6f 6b 75 70 28 70 50 61  pager_lookup(pPa
1b250 67 65 72 2c 20 70 67 6e 6f 29 3b 0a 20 20 69 66  ger, pgno);.  if
1b260 28 20 70 50 67 3d 3d 30 20 29 20 72 65 74 75 72  ( pPg==0 ) retur
1b270 6e 20 30 3b 0a 20 20 70 61 67 65 5f 72 65 66 28  n 0;.  page_ref(
1b280 70 50 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 70  pPg);.  return p
1b290 50 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c  Pg;.}../*.** Rel
1b2a0 65 61 73 65 20 61 20 70 61 67 65 2e 0a 2a 2a 0a  ease a page..**.
1b2b0 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
1b2c0 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74   of references t
1b2d0 6f 20 74 68 65 20 70 61 67 65 20 64 72 6f 70 20  o the page drop 
1b2e0 74 6f 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  to zero, then th
1b2f0 65 0a 2a 2a 20 70 61 67 65 20 69 73 20 61 64 64  e.** page is add
1b300 65 64 20 74 6f 20 74 68 65 20 4c 52 55 20 6c 69  ed to the LRU li
1b310 73 74 2e 20 20 57 68 65 6e 20 61 6c 6c 20 72 65  st.  When all re
1b320 66 65 72 65 6e 63 65 73 20 74 6f 20 61 6c 6c 20  ferences to all 
1b330 70 61 67 65 73 0a 2a 2a 20 61 72 65 20 72 65 6c  pages.** are rel
1b340 65 61 73 65 64 2c 20 61 20 72 6f 6c 6c 62 61 63  eased, a rollbac
1b350 6b 20 6f 63 63 75 72 73 20 61 6e 64 20 74 68 65  k occurs and the
1b360 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74   lock on the dat
1b370 61 62 61 73 65 20 69 73 0a 2a 2a 20 72 65 6d 6f  abase is.** remo
1b380 76 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ved..*/.int sqli
1b390 74 65 33 50 61 67 65 72 55 6e 72 65 66 28 44 62  te3PagerUnref(Db
1b3a0 50 61 67 65 20 2a 70 50 67 29 7b 0a 0a 20 20 2f  Page *pPg){..  /
1b3b0 2a 20 44 65 63 72 65 6d 65 6e 74 20 74 68 65 20  * Decrement the 
1b3c0 72 65 66 65 72 65 6e 63 65 20 63 6f 75 6e 74 20  reference count 
1b3d0 66 6f 72 20 74 68 69 73 20 70 61 67 65 0a 20 20  for this page.  
1b3e0 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 50 67  */.  assert( pPg
1b3f0 2d 3e 6e 52 65 66 3e 30 20 29 3b 0a 20 20 70 50  ->nRef>0 );.  pP
1b400 67 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 52 45 46  g->nRef--;.  REF
1b410 49 4e 46 4f 28 70 50 67 29 3b 0a 0a 20 20 43 48  INFO(pPg);..  CH
1b420 45 43 4b 5f 50 41 47 45 28 70 50 67 29 3b 0a 0a  ECK_PAGE(pPg);..
1b430 20 20 2f 2a 20 57 68 65 6e 20 74 68 65 20 6e 75    /* When the nu
1b440 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
1b450 65 73 20 74 6f 20 61 20 70 61 67 65 20 72 65 61  es to a page rea
1b460 63 68 20 30 2c 20 63 61 6c 6c 20 74 68 65 0a 20  ch 0, call the. 
1b470 20 2a 2a 20 64 65 73 74 72 75 63 74 6f 72 20 61   ** destructor a
1b480 6e 64 20 61 64 64 20 74 68 65 20 70 61 67 65 20  nd add the page 
1b490 74 6f 20 74 68 65 20 66 72 65 65 6c 69 73 74 2e  to the freelist.
1b4a0 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 50 67 2d  .  */.  if( pPg-
1b4b0 3e 6e 52 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20  >nRef==0 ){.    
1b4c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 3b 0a 20  Pager *pPager;. 
1b4d0 20 20 20 70 50 61 67 65 72 20 3d 20 70 50 67 2d     pPager = pPg-
1b4e0 3e 70 50 61 67 65 72 3b 0a 20 20 20 20 70 50 67  >pPager;.    pPg
1b4f0 2d 3e 70 4e 65 78 74 46 72 65 65 20 3d 20 30 3b  ->pNextFree = 0;
1b500 0a 20 20 20 20 70 50 67 2d 3e 70 50 72 65 76 46  .    pPg->pPrevF
1b510 72 65 65 20 3d 20 70 50 61 67 65 72 2d 3e 70 4c  ree = pPager->pL
1b520 61 73 74 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  ast;.    pPager-
1b530 3e 70 4c 61 73 74 20 3d 20 70 50 67 3b 0a 20 20  >pLast = pPg;.  
1b540 20 20 69 66 28 20 70 50 67 2d 3e 70 50 72 65 76    if( pPg->pPrev
1b550 46 72 65 65 20 29 7b 0a 20 20 20 20 20 20 70 50  Free ){.      pP
1b560 67 2d 3e 70 50 72 65 76 46 72 65 65 2d 3e 70 4e  g->pPrevFree->pN
1b570 65 78 74 46 72 65 65 20 3d 20 70 50 67 3b 0a 20  extFree = pPg;. 
1b580 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1b590 70 50 61 67 65 72 2d 3e 70 46 69 72 73 74 20 3d  pPager->pFirst =
1b5a0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1b5b0 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
1b5c0 63 3d 3d 30 20 26 26 20 70 50 61 67 65 72 2d 3e  c==0 && pPager->
1b5d0 70 46 69 72 73 74 53 79 6e 63 65 64 3d 3d 30 20  pFirstSynced==0 
1b5e0 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d  ){.      pPager-
1b5f0 3e 70 46 69 72 73 74 53 79 6e 63 65 64 20 3d 20  >pFirstSynced = 
1b600 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  pPg;.    }.    i
1b610 66 28 20 70 50 61 67 65 72 2d 3e 78 44 65 73 74  f( pPager->xDest
1b620 72 75 63 74 6f 72 20 29 7b 0a 20 20 20 20 20 20  ructor ){.      
1b630 70 50 61 67 65 72 2d 3e 78 44 65 73 74 72 75 63  pPager->xDestruc
1b640 74 6f 72 28 70 50 67 2c 20 70 50 61 67 65 72 2d  tor(pPg, pPager-
1b650 3e 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20  >pageSize);.    
1b660 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 57 68 65 6e  }.  .    /* When
1b670 20 61 6c 6c 20 70 61 67 65 73 20 72 65 61 63 68   all pages reach
1b680 20 74 68 65 20 66 72 65 65 6c 69 73 74 2c 20 64   the freelist, d
1b690 72 6f 70 20 74 68 65 20 72 65 61 64 20 6c 6f 63  rop the read loc
1b6a0 6b 20 66 72 6f 6d 0a 20 20 20 20 2a 2a 20 74 68  k from.    ** th
1b6b0 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
1b6c0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 50 61 67  .    */.    pPag
1b6d0 65 72 2d 3e 6e 52 65 66 2d 2d 3b 0a 20 20 20 20  er->nRef--;.    
1b6e0 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
1b6f0 6e 52 65 66 3e 3d 30 20 29 3b 0a 20 20 20 20 69  nRef>=0 );.    i
1b700 66 28 20 70 50 61 67 65 72 2d 3e 6e 52 65 66 3d  f( pPager->nRef=
1b710 3d 30 20 26 26 20 28 21 70 50 61 67 65 72 2d 3e  =0 && (!pPager->
1b720 65 78 63 6c 75 73 69 76 65 4d 6f 64 65 20 7c 7c  exclusiveMode ||
1b730 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1b740 4f 66 66 3e 30 29 20 29 7b 0a 20 20 20 20 20 20  Off>0) ){.      
1b750 70 61 67 65 72 55 6e 6c 6f 63 6b 41 6e 64 52 6f  pagerUnlockAndRo
1b760 6c 6c 62 61 63 6b 28 70 50 61 67 65 72 29 3b 0a  llback(pPager);.
1b770 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1b780 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
1b790 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74 65 20 61 20  ./*.** Create a 
1b7a0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 66 6f 72  journal file for
1b7b0 20 70 50 61 67 65 72 2e 20 20 54 68 65 72 65 20   pPager.  There 
1b7c0 73 68 6f 75 6c 64 20 61 6c 72 65 61 64 79 20 62  should already b
1b7d0 65 20 61 20 52 45 53 45 52 56 45 44 0a 2a 2a 20  e a RESERVED.** 
1b7e0 6f 72 20 45 58 43 4c 55 53 49 56 45 20 6c 6f 63  or EXCLUSIVE loc
1b7f0 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61 73  k on the databas
1b800 65 20 66 69 6c 65 20 77 68 65 6e 20 74 68 69 73  e file when this
1b810 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
1b820 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ed..**.** Return
1b830 20 53 51 4c 49 54 45 5f 4f 4b 20 69 66 20 65 76   SQLITE_OK if ev
1b840 65 72 79 74 68 69 6e 67 2e 20 20 52 65 74 75 72  erything.  Retur
1b850 6e 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65 20  n an error code 
1b860 61 6e 64 20 72 65 6c 65 61 73 65 20 74 68 65 0a  and release the.
1b870 2a 2a 20 77 72 69 74 65 20 6c 6f 63 6b 20 69 66  ** write lock if
1b880 20 61 6e 79 74 68 69 6e 67 20 67 6f 65 73 20 77   anything goes w
1b890 72 6f 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rong..*/.static 
1b8a0 69 6e 74 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a  int pager_open_j
1b8b0 6f 75 72 6e 61 6c 28 50 61 67 65 72 20 2a 70 50  ournal(Pager *pP
1b8c0 61 67 65 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ager){.  int rc;
1b8d0 0a 20 20 61 73 73 65 72 74 28 20 21 4d 45 4d 44  .  assert( !MEMD
1b8e0 42 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  B );.  assert( p
1b8f0 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41  Pager->state>=PA
1b900 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a  GER_RESERVED );.
1b910 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72    assert( pPager
1b920 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30  ->journalOpen==0
1b930 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b940 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1b950 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50   );.  assert( pP
1b960 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1b970 3d 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74 65 33  ==0 );.  sqlite3
1b980 50 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70  PagerPagecount(p
1b990 50 61 67 65 72 29 3b 0a 20 20 70 50 61 67 65 72  Pager);.  pPager
1b9a0 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20 73  ->aInJournal = s
1b9b0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
1b9c0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
1b9d0 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
1b9e0 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1b9f0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c   ){.    rc = SQL
1ba00 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 67  ITE_NOMEM;.    g
1ba10 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1ba20 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1ba30 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73    rc = sqlite3Os
1ba40 4f 70 65 6e 45 78 63 6c 75 73 69 76 65 28 70 50  OpenExclusive(pP
1ba50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e 61 6c 2c 20  ager->zJournal, 
1ba60 26 70 50 61 67 65 72 2d 3e 6a 66 64 2c 0a 20 20  &pPager->jfd,.  
1ba70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ba80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1ba90 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65 29  Pager->tempFile)
1baa0 3b 0a 20 20 61 73 73 65 72 74 28 20 72 63 21 3d  ;.  assert( rc!=
1bab0 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 70 50 61  SQLITE_OK || pPa
1bac0 67 65 72 2d 3e 6a 66 64 20 29 3b 0a 20 20 70 50  ger->jfd );.  pP
1bad0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1bae0 20 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e   = 0;.  pPager->
1baf0 73 65 74 4d 61 73 74 65 72 20 3d 20 30 3b 0a 20  setMaster = 0;. 
1bb00 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c   pPager->journal
1bb10 48 64 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 72  Hdr = 0;.  if( r
1bb20 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
1bb30 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
1bb40 54 45 5f 4e 4f 4d 45 4d 20 29 7b 0a 20 20 20 20  TE_NOMEM ){.    
1bb50 20 20 73 71 6c 69 74 65 33 4f 73 44 65 6c 65 74    sqlite3OsDelet
1bb60 65 28 70 50 61 67 65 72 2d 3e 7a 4a 6f 75 72 6e  e(pPager->zJourn
1bb70 61 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 67  al);.    }.    g
1bb80 6f 74 6f 20 66 61 69 6c 65 64 5f 74 6f 5f 6f 70  oto failed_to_op
1bb90 65 6e 5f 6a 6f 75 72 6e 61 6c 3b 0a 20 20 7d 0a  en_journal;.  }.
1bba0 20 20 73 71 6c 69 74 65 33 4f 73 53 65 74 46 75    sqlite3OsSetFu
1bbb0 6c 6c 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 6a  llSync(pPager->j
1bbc0 66 64 2c 20 70 50 61 67 65 72 2d 3e 66 75 6c 6c  fd, pPager->full
1bbd0 5f 66 73 79 6e 63 29 3b 0a 20 20 73 71 6c 69 74  _fsync);.  sqlit
1bbe0 65 33 4f 73 53 65 74 46 75 6c 6c 53 79 6e 63 28  e3OsSetFullSync(
1bbf0 70 50 61 67 65 72 2d 3e 66 64 2c 20 70 50 61 67  pPager->fd, pPag
1bc00 65 72 2d 3e 66 75 6c 6c 5f 66 73 79 6e 63 29 3b  er->full_fsync);
1bc10 0a 20 20 73 71 6c 69 74 65 33 4f 73 4f 70 65 6e  .  sqlite3OsOpen
1bc20 44 69 72 65 63 74 6f 72 79 28 70 50 61 67 65 72  Directory(pPager
1bc30 2d 3e 6a 66 64 2c 20 70 50 61 67 65 72 2d 3e 7a  ->jfd, pPager->z
1bc40 44 69 72 65 63 74 6f 72 79 29 3b 0a 20 20 70 50  Directory);.  pP
1bc50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65  ager->journalOpe
1bc60 6e 20 3d 20 31 3b 0a 20 20 70 50 61 67 65 72 2d  n = 1;.  pPager-
1bc70 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65 64 20  >journalStarted 
1bc80 3d 20 30 3b 0a 20 20 70 50 61 67 65 72 2d 3e 6e  = 0;.  pPager->n
1bc90 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20 70  eedSync = 0;.  p
1bca0 50 61 67 65 72 2d 3e 61 6c 77 61 79 73 52 6f 6c  Pager->alwaysRol
1bcb0 6c 62 61 63 6b 20 3d 20 30 3b 0a 20 20 70 50 61  lback = 0;.  pPa
1bcc0 67 65 72 2d 3e 6e 52 65 63 20 3d 20 30 3b 0a 20  ger->nRec = 0;. 
1bcd0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72   if( pPager->err
1bce0 43 6f 64 65 20 29 7b 0a 20 20 20 20 72 63 20 3d  Code ){.    rc =
1bcf0 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65   pPager->errCode
1bd00 3b 0a 20 20 20 20 67 6f 74 6f 20 66 61 69 6c 65  ;.    goto faile
1bd10 64 5f 74 6f 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  d_to_open_journa
1bd20 6c 3b 0a 20 20 7d 0a 20 20 70 50 61 67 65 72 2d  l;.  }.  pPager-
1bd30 3e 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50  >origDbSize = pP
1bd40 61 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 0a 20  ager->dbSize;.. 
1bd50 20 72 63 20 3d 20 77 72 69 74 65 4a 6f 75 72 6e   rc = writeJourn
1bd60 61 6c 48 64 72 28 70 50 61 67 65 72 29 3b 0a 0a  alHdr(pPager);..
1bd70 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1bd80 6d 74 41 75 74 6f 6f 70 65 6e 20 26 26 20 72 63  mtAutoopen && rc
1bd90 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1bda0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50     rc = sqlite3P
1bdb0 61 67 65 72 53 74 6d 74 42 65 67 69 6e 28 70 50  agerStmtBegin(pP
1bdc0 61 67 65 72 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ager);.  }.  if(
1bdd0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc!=SQLITE_OK &
1bde0 26 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d  & rc!=SQLITE_NOM
1bdf0 45 4d 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 70  EM ){.    rc = p
1be00 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61 63  ager_end_transac
1be10 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20 20  tion(pPager);.  
1be20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
1be30 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20  _OK ){.      rc 
1be40 3d 20 53 51 4c 49 54 45 5f 46 55 4c 4c 3b 0a 20  = SQLITE_FULL;. 
1be50 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1be60 6e 20 72 63 3b 0a 0a 66 61 69 6c 65 64 5f 74 6f  n rc;..failed_to
1be70 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61 6c 3a 0a 20  _open_journal:. 
1be80 20 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67   sqliteFree(pPag
1be90 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 29 3b  er->aInJournal);
1bea0 0a 20 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f  .  pPager->aInJo
1beb0 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 72 65 74  urnal = 0;.  ret
1bec0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1bed0 20 41 63 71 75 69 72 65 20 61 20 77 72 69 74 65   Acquire a write
1bee0 2d 6c 6f 63 6b 20 6f 6e 20 74 68 65 20 64 61 74  -lock on the dat
1bef0 61 62 61 73 65 2e 20 20 54 68 65 20 6c 6f 63 6b  abase.  The lock
1bf00 20 69 73 20 72 65 6d 6f 76 65 64 20 77 68 65 6e   is removed when
1bf10 0a 2a 2a 20 74 68 65 20 61 6e 79 20 6f 66 20 74  .** the any of t
1bf20 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 68 61 70  he following hap
1bf30 70 65 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 2a 20 20  pen:.**.**   *  
1bf40 73 71 6c 69 74 65 33 50 61 67 65 72 43 6f 6d 6d  sqlite3PagerComm
1bf50 69 74 50 68 61 73 65 54 77 6f 28 29 20 69 73 20  itPhaseTwo() is 
1bf60 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20 20  called..**   *  
1bf70 73 71 6c 69 74 65 33 50 61 67 65 72 52 6f 6c 6c  sqlite3PagerRoll
1bf80 62 61 63 6b 28 29 20 69 73 20 63 61 6c 6c 65 64  back() is called
1bf90 2e 0a 2a 2a 20 20 20 2a 20 20 73 71 6c 69 74 65  ..**   *  sqlite
1bfa0 33 50 61 67 65 72 43 6c 6f 73 65 28 29 20 69 73  3PagerClose() is
1bfb0 20 63 61 6c 6c 65 64 2e 0a 2a 2a 20 20 20 2a 20   called..**   * 
1bfc0 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1bfd0 65 66 28 29 20 69 73 20 63 61 6c 6c 65 64 20 74  ef() is called t
1bfe0 6f 20 6f 6e 20 65 76 65 72 79 20 6f 75 74 73 74  o on every outst
1bff0 61 6e 64 69 6e 67 20 70 61 67 65 2e 0a 2a 2a 0a  anding page..**.
1c000 2a 2a 20 54 68 65 20 66 69 72 73 74 20 70 61 72  ** The first par
1c010 61 6d 65 74 65 72 20 74 6f 20 74 68 69 73 20 72  ameter to this r
1c020 6f 75 74 69 6e 65 20 69 73 20 61 20 70 6f 69 6e  outine is a poin
1c030 74 65 72 20 74 6f 20 61 6e 79 20 6f 70 65 6e 20  ter to any open 
1c040 70 61 67 65 20 6f 66 20 74 68 65 0a 2a 2a 20 64  page of the.** d
1c050 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 20 4e  atabase file.  N
1c060 6f 74 68 69 6e 67 20 63 68 61 6e 67 65 73 20 61  othing changes a
1c070 62 6f 75 74 20 74 68 65 20 70 61 67 65 20 2d 20  bout the page - 
1c080 69 74 20 69 73 20 75 73 65 64 20 6d 65 72 65 6c  it is used merel
1c090 79 20 74 6f 0a 2a 2a 20 61 63 71 75 69 72 65 20  y to.** acquire 
1c0a0 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65  a pointer to the
1c0b0 20 50 61 67 65 72 20 73 74 72 75 63 74 75 72 65   Pager structure
1c0c0 20 61 6e 64 20 61 73 20 70 72 6f 6f 66 20 74 68   and as proof th
1c0d0 61 74 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 61  at there is.** a
1c0e0 6c 72 65 61 64 79 20 61 20 72 65 61 64 2d 6c 6f  lready a read-lo
1c0f0 63 6b 20 6f 6e 20 74 68 65 20 64 61 74 61 62 61  ck on the databa
1c100 73 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 65  se..**.** The se
1c110 63 6f 6e 64 20 70 61 72 61 6d 65 74 65 72 20 69  cond parameter i
1c120 6e 64 69 63 61 74 65 73 20 68 6f 77 20 6d 75 63  ndicates how muc
1c130 68 20 73 70 61 63 65 20 69 6e 20 62 79 74 65 73  h space in bytes
1c140 20 74 6f 20 72 65 73 65 72 76 65 20 66 6f 72 20   to reserve for 
1c150 61 0a 2a 2a 20 6d 61 73 74 65 72 20 6a 6f 75 72  a.** master jour
1c160 6e 61 6c 20 66 69 6c 65 2d 6e 61 6d 65 20 61 74  nal file-name at
1c170 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 74 68   the start of th
1c180 65 20 6a 6f 75 72 6e 61 6c 20 77 68 65 6e 20 69  e journal when i
1c190 74 20 69 73 20 63 72 65 61 74 65 64 2e 0a 2a 2a  t is created..**
1c1a0 0a 2a 2a 20 41 20 6a 6f 75 72 6e 61 6c 20 66 69  .** A journal fi
1c1b0 6c 65 20 69 73 20 6f 70 65 6e 65 64 20 69 66 20  le is opened if 
1c1c0 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 74 65  this is not a te
1c1d0 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e 20 20 46  mporary file.  F
1c1e0 6f 72 20 74 65 6d 70 6f 72 61 72 79 0a 2a 2a 20  or temporary.** 
1c1f0 66 69 6c 65 73 2c 20 74 68 65 20 6f 70 65 6e 69  files, the openi
1c200 6e 67 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e 61  ng of the journa
1c210 6c 20 66 69 6c 65 20 69 73 20 64 65 66 65 72 72  l file is deferr
1c220 65 64 20 75 6e 74 69 6c 20 74 68 65 72 65 20 69  ed until there i
1c230 73 20 61 6e 0a 2a 2a 20 61 63 74 75 61 6c 20 6e  s an.** actual n
1c240 65 65 64 20 74 6f 20 77 72 69 74 65 20 74 6f 20  eed to write to 
1c250 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1c260 2a 2a 20 49 66 20 74 68 65 20 64 61 74 61 62 61  ** If the databa
1c270 73 65 20 69 73 20 61 6c 72 65 61 64 79 20 72 65  se is already re
1c280 73 65 72 76 65 64 20 66 6f 72 20 77 72 69 74 69  served for writi
1c290 6e 67 2c 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ng, this routine
1c2a0 20 69 73 20 61 20 6e 6f 2d 6f 70 2e 0a 2a 2a 0a   is a no-op..**.
1c2b0 2a 2a 20 49 66 20 65 78 46 6c 61 67 20 69 73 20  ** If exFlag is 
1c2c0 74 72 75 65 2c 20 67 6f 20 61 68 65 61 64 20 61  true, go ahead a
1c2d0 6e 64 20 67 65 74 20 61 6e 20 45 58 43 4c 55 53  nd get an EXCLUS
1c2e0 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74 68 65 20  IVE lock on the 
1c2f0 66 69 6c 65 0a 2a 2a 20 69 6d 6d 65 64 69 61 74  file.** immediat
1c300 65 6c 79 20 69 6e 73 74 65 61 64 20 6f 66 20 77  ely instead of w
1c310 61 69 74 69 6e 67 20 75 6e 74 69 6c 20 77 65 20  aiting until we 
1c320 74 72 79 20 74 6f 20 66 6c 75 73 68 20 74 68 65  try to flush the
1c330 20 63 61 63 68 65 2e 20 20 54 68 65 0a 2a 2a 20   cache.  The.** 
1c340 65 78 46 6c 61 67 20 69 73 20 69 67 6e 6f 72 65  exFlag is ignore
1c350 64 20 69 66 20 61 20 74 72 61 6e 73 61 63 74 69  d if a transacti
1c360 6f 6e 20 69 73 20 61 6c 72 65 61 64 79 20 61 63  on is already ac
1c370 74 69 76 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tive..*/.int sql
1c380 69 74 65 33 50 61 67 65 72 42 65 67 69 6e 28 44  ite3PagerBegin(D
1c390 62 50 61 67 65 20 2a 70 50 67 2c 20 69 6e 74 20  bPage *pPg, int 
1c3a0 65 78 46 6c 61 67 29 7b 0a 20 20 50 61 67 65 72  exFlag){.  Pager
1c3b0 20 2a 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e   *pPager = pPg->
1c3c0 70 50 61 67 65 72 3b 0a 20 20 69 6e 74 20 72 63  pPager;.  int rc
1c3d0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
1c3e0 61 73 73 65 72 74 28 20 70 50 67 2d 3e 6e 52 65  assert( pPg->nRe
1c3f0 66 3e 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28  f>0 );.  assert(
1c400 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
1c410 50 41 47 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a  PAGER_UNLOCK );.
1c420 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74    if( pPager->st
1c430 61 74 65 3d 3d 50 41 47 45 52 5f 53 48 41 52 45  ate==PAGER_SHARE
1c440 44 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  D ){.    assert(
1c450 20 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72   pPager->aInJour
1c460 6e 61 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66  nal==0 );.    if
1c470 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20  ( MEMDB ){.     
1c480 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d   pPager->state =
1c490 20 50 41 47 45 52 5f 45 58 43 4c 55 53 49 56 45   PAGER_EXCLUSIVE
1c4a0 3b 0a 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e  ;.      pPager->
1c4b0 6f 72 69 67 44 62 53 69 7a 65 20 3d 20 70 50 61  origDbSize = pPa
1c4c0 67 65 72 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20  ger->dbSize;.   
1c4d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
1c4e0 20 3d 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b   = sqlite3OsLock
1c4f0 28 70 50 61 67 65 72 2d 3e 66 64 2c 20 52 45 53  (pPager->fd, RES
1c500 45 52 56 45 44 5f 4c 4f 43 4b 29 3b 0a 20 20 20  ERVED_LOCK);.   
1c510 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
1c520 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
1c530 70 50 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20  pPager->state = 
1c540 50 41 47 45 52 5f 52 45 53 45 52 56 45 44 3b 0a  PAGER_RESERVED;.
1c550 20 20 20 20 20 20 20 20 69 66 28 20 65 78 46 6c          if( exFl
1c560 61 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ag ){.          
1c570 72 63 20 3d 20 70 61 67 65 72 5f 77 61 69 74 5f  rc = pager_wait_
1c580 6f 6e 5f 6c 6f 63 6b 28 70 50 61 67 65 72 2c 20  on_lock(pPager, 
1c590 45 58 43 4c 55 53 49 56 45 5f 4c 4f 43 4b 29 3b  EXCLUSIVE_LOCK);
1c5a0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1c5b0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 21   }.      if( rc!
1c5c0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1c5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b        return rc;
1c5e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
1c5f0 50 61 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68  Pager->dirtyCach
1c600 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 50 41 47  e = 0;.      PAG
1c610 45 52 54 52 41 43 45 32 28 22 54 52 41 4e 53 41  ERTRACE2("TRANSA
1c620 43 54 49 4f 4e 20 25 64 5c 6e 22 2c 20 50 41 47  CTION %d\n", PAG
1c630 45 52 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20  ERID(pPager));. 
1c640 20 20 20 20 20 69 66 28 20 70 50 61 67 65 72 2d       if( pPager-
1c650 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 26 26 20 21  >useJournal && !
1c660 70 50 61 67 65 72 2d 3e 74 65 6d 70 46 69 6c 65  pPager->tempFile
1c670 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
1c680 20 70 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72   pager_open_jour
1c690 6e 61 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20  nal(pPager);.   
1c6a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
1c6b0 73 65 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  se if( pPager->j
1c6c0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1c6d0 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66  ager->journalOff
1c6e0 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 54 68  ==0 ){.    /* Th
1c6f0 69 73 20 68 61 70 70 65 6e 73 20 77 68 65 6e 20  is happens when 
1c700 74 68 65 20 70 61 67 65 72 20 77 61 73 20 69 6e  the pager was in
1c710 20 65 78 63 6c 75 73 69 76 65 2d 61 63 63 65 73   exclusive-acces
1c720 73 20 6d 6f 64 65 20 6c 61 73 74 0a 20 20 20 20  s mode last.    
1c730 2a 2a 20 74 69 6d 65 20 61 20 28 72 65 61 64 20  ** time a (read 
1c740 6f 72 20 77 72 69 74 65 29 20 74 72 61 6e 73 61  or write) transa
1c750 63 74 69 6f 6e 20 77 61 73 20 73 75 63 63 65 73  ction was succes
1c760 73 66 75 6c 6c 79 20 63 6f 6e 63 6c 75 64 65 64  sfully concluded
1c770 0a 20 20 20 20 2a 2a 20 62 79 20 74 68 69 73 20  .    ** by this 
1c780 63 6f 6e 6e 65 63 74 69 6f 6e 2e 20 49 6e 73 74  connection. Inst
1c790 65 61 64 20 6f 66 20 64 65 6c 65 74 69 6e 67 20  ead of deleting 
1c7a0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
1c7b0 20 69 74 20 77 61 73 20 0a 20 20 20 20 2a 2a 20   it was .    ** 
1c7c0 6b 65 70 74 20 6f 70 65 6e 20 61 6e 64 20 74 72  kept open and tr
1c7d0 75 6e 63 61 74 65 64 20 74 6f 20 30 20 62 79 74  uncated to 0 byt
1c7e0 65 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  es..    */.    a
1c7f0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
1c800 52 65 63 3d 3d 30 20 29 3b 0a 20 20 20 20 61 73  Rec==0 );.    as
1c810 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6f 72  sert( pPager->or
1c820 69 67 44 62 53 69 7a 65 3d 3d 30 20 29 3b 0a 20  igDbSize==0 );. 
1c830 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1c840 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 3d 3d 30  r->aInJournal==0
1c850 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 50   );.    sqlite3P
1c860 61 67 65 72 50 61 67 65 63 6f 75 6e 74 28 70 50  agerPagecount(pP
1c870 61 67 65 72 29 3b 0a 20 20 20 20 70 50 61 67 65  ager);.    pPage
1c880 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 20 3d 20  r->aInJournal = 
1c890 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50  sqliteMalloc( pP
1c8a0 61 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b  ager->dbSize/8 +
1c8b0 20 31 20 29 3b 0a 20 20 20 20 69 66 28 20 21 70   1 );.    if( !p
1c8c0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1c8d0 6c 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  l ){.      rc = 
1c8e0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
1c8f0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
1c900 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a  Pager->origDbSiz
1c910 65 20 3d 20 70 50 61 67 65 72 2d 3e 64 62 53 69  e = pPager->dbSi
1c920 7a 65 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 77  ze;.      rc = w
1c930 72 69 74 65 4a 6f 75 72 6e 61 6c 48 64 72 28 70  riteJournalHdr(p
1c940 50 61 67 65 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Pager);.    }.  
1c950 7d 0a 20 20 61 73 73 65 72 74 28 20 21 70 50 61  }.  assert( !pPa
1c960 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e  ger->journalOpen
1c970 20 7c 7c 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72   || pPager->jour
1c980 6e 61 6c 4f 66 66 3e 30 20 7c 7c 20 72 63 21 3d  nalOff>0 || rc!=
1c990 53 51 4c 49 54 45 5f 4f 4b 20 29 3b 0a 20 20 72  SQLITE_OK );.  r
1c9a0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
1c9b0 2a 2a 20 4d 61 6b 65 20 61 20 70 61 67 65 20 64  ** Make a page d
1c9c0 69 72 74 79 2e 20 20 53 65 74 20 69 74 73 20 64  irty.  Set its d
1c9d0 69 72 74 79 20 66 6c 61 67 20 61 6e 64 20 61 64  irty flag and ad
1c9e0 64 20 69 74 20 74 6f 20 74 68 65 20 64 69 72 74  d it to the dirt
1c9f0 79 0a 2a 2a 20 70 61 67 65 20 6c 69 73 74 2e 0a  y.** page list..
1ca00 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
1ca10 61 6b 65 44 69 72 74 79 28 50 67 48 64 72 20 2a  akeDirty(PgHdr *
1ca20 70 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d  pPg){.  if( pPg-
1ca30 3e 64 69 72 74 79 3d 3d 30 20 29 7b 0a 20 20 20  >dirty==0 ){.   
1ca40 20 50 61 67 65 72 20 2a 70 50 61 67 65 72 20 3d   Pager *pPager =
1ca50 20 70 50 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20   pPg->pPager;.  
1ca60 20 20 70 50 67 2d 3e 64 69 72 74 79 20 3d 20 31    pPg->dirty = 1
1ca70 3b 0a 20 20 20 20 70 50 67 2d 3e 70 44 69 72 74  ;.    pPg->pDirt
1ca80 79 20 3d 20 70 50 61 67 65 72 2d 3e 70 44 69 72  y = pPager->pDir
1ca90 74 79 3b 0a 20 20 20 20 69 66 28 20 70 50 61 67  ty;.    if( pPag
1caa0 65 72 2d 3e 70 44 69 72 74 79 20 29 7b 0a 20 20  er->pDirty ){.  
1cab0 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69 72      pPager->pDir
1cac0 74 79 2d 3e 70 50 72 65 76 44 69 72 74 79 20 3d  ty->pPrevDirty =
1cad0 20 70 50 67 3b 0a 20 20 20 20 7d 0a 20 20 20 20   pPg;.    }.    
1cae0 70 50 67 2d 3e 70 50 72 65 76 44 69 72 74 79 20  pPg->pPrevDirty 
1caf0 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  = 0;.    pPager-
1cb00 3e 70 44 69 72 74 79 20 3d 20 70 50 67 3b 0a 20  >pDirty = pPg;. 
1cb10 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65   }.}../*.** Make
1cb20 20 61 20 70 61 67 65 20 63 6c 65 61 6e 2e 20 20   a page clean.  
1cb30 43 6c 65 61 72 20 69 74 73 20 64 69 72 74 79 20  Clear its dirty 
1cb40 62 69 74 20 61 6e 64 20 72 65 6d 6f 76 65 20 69  bit and remove i
1cb50 74 20 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 64 69  t from the.** di
1cb60 72 74 79 20 70 61 67 65 20 6c 69 73 74 2e 0a 2a  rty page list..*
1cb70 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d 61  /.static void ma
1cb80 6b 65 43 6c 65 61 6e 28 50 67 48 64 72 20 2a 70  keClean(PgHdr *p
1cb90 50 67 29 7b 0a 20 20 69 66 28 20 70 50 67 2d 3e  Pg){.  if( pPg->
1cba0 64 69 72 74 79 20 29 7b 0a 20 20 20 20 70 50 67  dirty ){.    pPg
1cbb0 2d 3e 64 69 72 74 79 20 3d 20 30 3b 0a 20 20 20  ->dirty = 0;.   
1cbc0 20 69 66 28 20 70 50 67 2d 3e 70 44 69 72 74 79   if( pPg->pDirty
1cbd0 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d 3e 70   ){.      pPg->p
1cbe0 44 69 72 74 79 2d 3e 70 50 72 65 76 44 69 72 74  Dirty->pPrevDirt
1cbf0 79 20 3d 20 70 50 67 2d 3e 70 50 72 65 76 44 69  y = pPg->pPrevDi
1cc00 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  rty;.    }.    i
1cc10 66 28 20 70 50 67 2d 3e 70 50 72 65 76 44 69 72  f( pPg->pPrevDir
1cc20 74 79 20 29 7b 0a 20 20 20 20 20 20 70 50 67 2d  ty ){.      pPg-
1cc30 3e 70 50 72 65 76 44 69 72 74 79 2d 3e 70 44 69  >pPrevDirty->pDi
1cc40 72 74 79 20 3d 20 70 50 67 2d 3e 70 44 69 72 74  rty = pPg->pDirt
1cc50 79 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  y;.    }else{.  
1cc60 20 20 20 20 70 50 67 2d 3e 70 50 61 67 65 72 2d      pPg->pPager-
1cc70 3e 70 44 69 72 74 79 20 3d 20 70 50 67 2d 3e 70  >pDirty = pPg->p
1cc80 44 69 72 74 79 3b 0a 20 20 20 20 7d 0a 20 20 7d  Dirty;.    }.  }
1cc90 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  .}.../*.** Mark 
1cca0 61 20 64 61 74 61 20 70 61 67 65 20 61 73 20 77  a data page as w
1ccb0 72 69 74 65 61 62 6c 65 2e 20 20 54 68 65 20 70  riteable.  The p
1ccc0 61 67 65 20 69 73 20 77 72 69 74 74 65 6e 20 69  age is written i
1ccd0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
1cce0 0a 2a 2a 20 69 66 20 69 74 20 69 73 20 6e 6f 74  .** if it is not
1ccf0 20 74 68 65 72 65 20 61 6c 72 65 61 64 79 2e 20   there already. 
1cd00 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 75   This routine mu
1cd10 73 74 20 62 65 20 63 61 6c 6c 65 64 20 62 65 66  st be called bef
1cd20 6f 72 65 20 6d 61 6b 69 6e 67 0a 2a 2a 20 63 68  ore making.** ch
1cd30 61 6e 67 65 73 20 74 6f 20 61 20 70 61 67 65 2e  anges to a page.
1cd40 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
1cd50 20 74 69 6d 65 20 74 68 69 73 20 72 6f 75 74 69   time this routi
1cd60 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 74 68  ne is called, th
1cd70 65 20 70 61 67 65 72 20 63 72 65 61 74 65 73 20  e pager creates 
1cd80 61 20 6e 65 77 0a 2a 2a 20 6a 6f 75 72 6e 61 6c  a new.** journal
1cd90 20 61 6e 64 20 61 63 71 75 69 72 65 73 20 61 20   and acquires a 
1cda0 52 45 53 45 52 56 45 44 20 6c 6f 63 6b 20 6f 6e  RESERVED lock on
1cdb0 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
1cdc0 49 66 20 74 68 65 20 52 45 53 45 52 56 45 44 0a  If the RESERVED.
1cdd0 2a 2a 20 6c 6f 63 6b 20 63 6f 75 6c 64 20 6e 6f  ** lock could no
1cde0 74 20 62 65 20 61 63 71 75 69 72 65 64 2c 20 74  t be acquired, t
1cdf0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1ce00 72 6e 73 20 53 51 4c 49 54 45 5f 42 55 53 59 2e  rns SQLITE_BUSY.
1ce10 20 20 54 68 65 0a 2a 2a 20 63 61 6c 6c 69 6e 67    The.** calling
1ce20 20 72 6f 75 74 69 6e 65 20 6d 75 73 74 20 63 68   routine must ch
1ce30 65 63 6b 20 66 6f 72 20 74 68 61 74 20 72 65 74  eck for that ret
1ce40 75 72 6e 20 76 61 6c 75 65 20 61 6e 64 20 62 65  urn value and be
1ce50 20 63 61 72 65 66 75 6c 20 6e 6f 74 20 74 6f 0a   careful not to.
1ce60 2a 2a 20 63 68 61 6e 67 65 20 61 6e 79 20 70 61  ** change any pa
1ce70 67 65 20 64 61 74 61 20 75 6e 74 69 6c 20 74 68  ge data until th
1ce80 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
1ce90 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2a  ns SQLITE_OK..**
1cea0 0a 2a 2a 20 49 66 20 74 68 65 20 6a 6f 75 72 6e  .** If the journ
1ceb0 61 6c 20 66 69 6c 65 20 63 6f 75 6c 64 20 6e 6f  al file could no
1cec0 74 20 62 65 20 77 72 69 74 74 65 6e 20 62 65 63  t be written bec
1ced0 61 75 73 65 20 74 68 65 20 64 69 73 6b 20 69 73  ause the disk is
1cee0 20 66 75 6c 6c 2c 0a 2a 2a 20 74 68 65 6e 20 74   full,.** then t
1cef0 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75  his routine retu
1cf00 72 6e 73 20 53 51 4c 49 54 45 5f 46 55 4c 4c 20  rns SQLITE_FULL 
1cf10 61 6e 64 20 64 6f 65 73 20 61 6e 20 69 6d 6d 65  and does an imme
1cf20 64 69 61 74 65 20 72 6f 6c 6c 62 61 63 6b 2e 0a  diate rollback..
1cf30 2a 2a 20 41 6c 6c 20 73 75 62 73 65 71 75 65 6e  ** All subsequen
1cf40 74 20 77 72 69 74 65 20 61 74 74 65 6d 70 74 73  t write attempts
1cf50 20 61 6c 73 6f 20 72 65 74 75 72 6e 20 53 51 4c   also return SQL
1cf60 49 54 45 5f 46 55 4c 4c 20 75 6e 74 69 6c 20 74  ITE_FULL until t
1cf70 68 65 72 65 0a 2a 2a 20 69 73 20 61 20 63 61 6c  here.** is a cal
1cf80 6c 20 74 6f 20 73 71 6c 69 74 65 33 50 61 67 65  l to sqlite3Page
1cf90 72 43 6f 6d 6d 69 74 28 29 20 6f 72 20 73 71 6c  rCommit() or sql
1cfa0 69 74 65 33 50 61 67 65 72 52 6f 6c 6c 62 61 63  ite3PagerRollbac
1cfb0 6b 28 29 20 74 6f 0a 2a 2a 20 72 65 73 65 74 2e  k() to.** reset.
1cfc0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70  .*/.static int p
1cfd0 61 67 65 72 5f 77 72 69 74 65 28 50 67 48 64 72  ager_write(PgHdr
1cfe0 20 2a 70 50 67 29 7b 0a 20 20 76 6f 69 64 20 2a   *pPg){.  void *
1cff0 70 44 61 74 61 20 3d 20 50 47 48 44 52 5f 54 4f  pData = PGHDR_TO
1d000 5f 44 41 54 41 28 70 50 67 29 3b 0a 20 20 50 61  _DATA(pPg);.  Pa
1d010 67 65 72 20 2a 70 50 61 67 65 72 20 3d 20 70 50  ger *pPager = pP
1d020 67 2d 3e 70 50 61 67 65 72 3b 0a 20 20 69 6e 74  g->pPager;.  int
1d030 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
1d040 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72  ..  /* Check for
1d050 20 65 72 72 6f 72 73 0a 20 20 2a 2f 0a 20 20 69   errors.  */.  i
1d060 66 28 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f  f( pPager->errCo
1d070 64 65 20 29 7b 20 0a 20 20 20 20 72 65 74 75 72  de ){ .    retur
1d080 6e 20 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64  n pPager->errCod
1d090 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 50 61  e;.  }.  if( pPa
1d0a0 67 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 20 29 7b  ger->readOnly ){
1d0b0 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49  .    return SQLI
1d0c0 54 45 5f 50 45 52 4d 3b 0a 20 20 7d 0a 0a 20 20  TE_PERM;.  }..  
1d0d0 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
1d0e0 3e 73 65 74 4d 61 73 74 65 72 20 29 3b 0a 0a 20  >setMaster );.. 
1d0f0 20 43 48 45 43 4b 5f 50 41 47 45 28 70 50 67 29   CHECK_PAGE(pPg)
1d100 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
1d110 70 61 67 65 20 77 61 73 20 70 72 65 76 69 6f 75  page was previou
1d120 73 6c 79 20 61 63 71 75 69 72 65 64 20 77 69 74  sly acquired wit
1d130 68 20 6e 6f 43 6f 6e 74 65 6e 74 3d 3d 31 2c 20  h noContent==1, 
1d140 74 68 61 74 20 6d 65 61 6e 73 0a 20 20 2a 2a 20  that means.  ** 
1d150 77 65 20 64 69 64 6e 27 74 20 72 65 61 6c 6c 79  we didn't really
1d160 20 72 65 61 64 20 69 6e 20 74 68 65 20 63 6f 6e   read in the con
1d170 74 65 6e 74 20 6f 66 20 74 68 65 20 70 61 67 65  tent of the page
1d180 2e 20 20 54 68 69 73 20 63 61 6e 20 68 61 70 70  .  This can happ
1d190 65 6e 0a 20 20 2a 2a 20 28 66 6f 72 20 65 78 61  en.  ** (for exa
1d1a0 6d 70 6c 65 29 20 77 68 65 6e 20 74 68 65 20 70  mple) when the p
1d1b0 61 67 65 20 69 73 20 62 65 69 6e 67 20 6d 6f 76  age is being mov
1d1c0 65 64 20 74 6f 20 74 68 65 20 66 72 65 65 6c 69  ed to the freeli
1d1d0 73 74 2e 20 20 42 75 74 0a 20 20 2a 2a 20 6e 6f  st.  But.  ** no
1d1e0 77 20 77 65 20 61 72 65 20 28 70 65 72 68 61 70  w we are (perhap
1d1f0 73 29 20 6d 6f 76 69 6e 67 20 74 68 65 20 70 61  s) moving the pa
1d200 67 65 20 6f 66 66 20 6f 66 20 74 68 65 20 66 72  ge off of the fr
1d210 65 65 6c 69 73 74 20 66 6f 72 0a 20 20 2a 2a 20  eelist for.  ** 
1d220 72 65 75 73 65 20 61 6e 64 20 77 65 20 6e 65 65  reuse and we nee
1d230 64 20 74 6f 20 6b 6e 6f 77 20 69 74 73 20 6f 72  d to know its or
1d240 69 67 69 6e 61 6c 20 63 6f 6e 74 65 6e 74 20 73  iginal content s
1d250 6f 20 74 68 61 74 20 63 6f 6e 74 65 6e 74 0a 20  o that content. 
1d260 20 2a 2a 20 63 61 6e 20 62 65 20 73 74 6f 72 65   ** can be store
1d270 64 20 69 6e 20 74 68 65 20 72 6f 6c 6c 62 61 63  d in the rollbac
1d280 6b 20 6a 6f 75 72 6e 61 6c 2e 20 20 53 6f 20 64  k journal.  So d
1d290 6f 20 74 68 65 20 72 65 61 64 20 61 74 20 74 68  o the read at th
1d2a0 69 73 0a 20 20 2a 2a 20 74 69 6d 65 2e 0a 20 20  is.  ** time..  
1d2b0 2a 2f 0a 20 20 72 63 20 3d 20 70 61 67 65 72 5f  */.  rc = pager_
1d2c0 67 65 74 5f 63 6f 6e 74 65 6e 74 28 70 50 67 29  get_content(pPg)
1d2d0 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20  ;.  if( rc ){.  
1d2e0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
1d2f0 0a 0a 20 20 2f 2a 20 4d 61 72 6b 20 74 68 65 20  ..  /* Mark the 
1d300 70 61 67 65 20 61 73 20 64 69 72 74 79 2e 20 20  page as dirty.  
1d310 49 66 20 74 68 65 20 70 61 67 65 20 68 61 73 20  If the page has 
1d320 61 6c 72 65 61 64 79 20 62 65 65 6e 20 77 72 69  already been wri
1d330 74 74 65 6e 0a 20 20 2a 2a 20 74 6f 20 74 68 65  tten.  ** to the
1d340 20 6a 6f 75 72 6e 61 6c 20 74 68 65 6e 20 77 65   journal then we
1d350 20 63 61 6e 20 72 65 74 75 72 6e 20 72 69 67 68   can return righ
1d360 74 20 61 77 61 79 2e 0a 20 20 2a 2f 0a 20 20 6d  t away..  */.  m
1d370 61 6b 65 44 69 72 74 79 28 70 50 67 29 3b 0a 20  akeDirty(pPg);. 
1d380 20 69 66 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72   if( pPg->inJour
1d390 6e 61 6c 20 26 26 20 28 70 61 67 65 49 6e 53 74  nal && (pageInSt
1d3a0 61 74 65 6d 65 6e 74 28 70 50 67 29 20 7c 7c 20  atement(pPg) || 
1d3b0 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73  pPager->stmtInUs
1d3c0 65 3d 3d 30 29 20 29 7b 0a 20 20 20 20 70 50 61  e==0) ){.    pPa
1d3d0 67 65 72 2d 3e 64 69 72 74 79 43 61 63 68 65 20  ger->dirtyCache 
1d3e0 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 0a 20  = 1;.  }else{.. 
1d3f0 20 20 20 2f 2a 20 49 66 20 77 65 20 67 65 74 20     /* If we get 
1d400 74 68 69 73 20 66 61 72 2c 20 69 74 20 6d 65 61  this far, it mea
1d410 6e 73 20 74 68 61 74 20 74 68 65 20 70 61 67 65  ns that the page
1d420 20 6e 65 65 64 73 20 74 6f 20 62 65 0a 20 20 20   needs to be.   
1d430 20 2a 2a 20 77 72 69 74 74 65 6e 20 74 6f 20 74   ** written to t
1d440 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a  he transaction j
1d450 6f 75 72 6e 61 6c 20 6f 72 20 74 68 65 20 63 6b  ournal or the ck
1d460 65 63 6b 70 6f 69 6e 74 20 6a 6f 75 72 6e 61 6c  eckpoint journal
1d470 0a 20 20 20 20 2a 2a 20 6f 72 20 62 6f 74 68 2e  .    ** or both.
1d480 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 46  .    **.    ** F
1d490 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73 65  irst check to se
1d4a0 65 20 74 68 61 74 20 74 68 65 20 74 72 61 6e 73  e that the trans
1d4b0 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 65  action journal e
1d4c0 78 69 73 74 73 20 61 6e 64 0a 20 20 20 20 2a 2a  xists and.    **
1d4d0 20 63 72 65 61 74 65 20 69 74 20 69 66 20 69 74   create it if it
1d4e0 20 64 6f 65 73 20 6e 6f 74 2e 0a 20 20 20 20 2a   does not..    *
1d4f0 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50  /.    assert( pP
1d500 61 67 65 72 2d 3e 73 74 61 74 65 21 3d 50 41 47  ager->state!=PAG
1d510 45 52 5f 55 4e 4c 4f 43 4b 20 29 3b 0a 20 20 20  ER_UNLOCK );.   
1d520 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
1d530 65 72 42 65 67 69 6e 28 70 50 67 2c 20 30 29 3b  erBegin(pPg, 0);
1d540 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
1d550 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1d560 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 7d  return rc;.    }
1d570 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61  .    assert( pPa
1d580 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45  ger->state>=PAGE
1d590 52 5f 52 45 53 45 52 56 45 44 20 29 3b 0a 20 20  R_RESERVED );.  
1d5a0 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e 6a    if( !pPager->j
1d5b0 6f 75 72 6e 61 6c 4f 70 65 6e 20 26 26 20 70 50  ournalOpen && pP
1d5c0 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c  ager->useJournal
1d5d0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70   ){.      rc = p
1d5e0 61 67 65 72 5f 6f 70 65 6e 5f 6a 6f 75 72 6e 61  ager_open_journa
1d5f0 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
1d600 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1d610 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  OK ) return rc;.
1d620 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
1d630 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61  ( pPager->journa
1d640 6c 4f 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72  lOpen || !pPager
1d650 2d 3e 75 73 65 4a 6f 75 72 6e 61 6c 20 29 3b 0a  ->useJournal );.
1d660 20 20 20 20 70 50 61 67 65 72 2d 3e 64 69 72 74      pPager->dirt
1d670 79 43 61 63 68 65 20 3d 20 31 3b 0a 20 20 0a 20  yCache = 1;.  . 
1d680 20 20 20 2f 2a 20 54 68 65 20 74 72 61 6e 73 61     /* The transa
1d690 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c 20 6e 6f  ction journal no
1d6a0 77 20 65 78 69 73 74 73 20 61 6e 64 20 77 65 20  w exists and we 
1d6b0 68 61 76 65 20 61 20 52 45 53 45 52 56 45 44 20  have a RESERVED 
1d6c0 6f 72 20 61 6e 0a 20 20 20 20 2a 2a 20 45 58 43  or an.    ** EXC
1d6d0 4c 55 53 49 56 45 20 6c 6f 63 6b 20 6f 6e 20 74  LUSIVE lock on t
1d6e0 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1d6f0 20 66 69 6c 65 2e 20 20 57 72 69 74 65 20 74 68   file.  Write th
1d700 65 20 63 75 72 72 65 6e 74 20 70 61 67 65 20 74  e current page t
1d710 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 74 72 61  o.    ** the tra
1d720 6e 73 61 63 74 69 6f 6e 20 6a 6f 75 72 6e 61 6c  nsaction journal
1d730 20 69 66 20 69 74 20 69 73 20 6e 6f 74 20 74 68   if it is not th
1d740 65 72 65 20 61 6c 72 65 61 64 79 2e 0a 20 20 20  ere already..   
1d750 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 67   */.    if( !pPg
1d760 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 26 26 20 28  ->inJournal && (
1d770 70 50 61 67 65 72 2d 3e 75 73 65 4a 6f 75 72 6e  pPager->useJourn
1d780 61 6c 20 7c 7c 20 4d 45 4d 44 42 29 20 29 7b 0a  al || MEMDB) ){.
1d790 20 20 20 20 20 20 69 66 28 20 28 69 6e 74 29 70        if( (int)p
1d7a0 50 67 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67  Pg->pgno <= pPag
1d7b0 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29  er->origDbSize )
1d7c0 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a  {.        int sz
1d7d0 50 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  Pg;.        if( 
1d7e0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 20  MEMDB ){.       
1d7f0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
1d800 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
1d810 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
1d820 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41 47 45  ;.          PAGE
1d830 52 54 52 41 43 45 33 28 22 4a 4f 55 52 4e 41 4c  RTRACE3("JOURNAL
1d840 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1d850 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1d860 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1d870 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1d880 48 69 73 74 2d 3e 70 4f 72 69 67 3d 3d 30 20 29  Hist->pOrig==0 )
1d890 3b 0a 20 20 20 20 20 20 20 20 20 20 70 48 69 73  ;.          pHis
1d8a0 74 2d 3e 70 4f 72 69 67 20 3d 20 73 71 6c 69 74  t->pOrig = sqlit
1d8b0 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 50 61 67  eMallocRaw( pPag
1d8c0 65 72 2d 3e 70 61 67 65 53 69 7a 65 20 29 3b 0a  er->pageSize );.
1d8d0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 48            if( pH
1d8e0 69 73 74 2d 3e 70 4f 72 69 67 20 29 7b 0a 20 20  ist->pOrig ){.  
1d8f0 20 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79            memcpy
1d900 28 70 48 69 73 74 2d 3e 70 4f 72 69 67 2c 20 50  (pHist->pOrig, P
1d910 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67  GHDR_TO_DATA(pPg
1d920 29 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53  ), pPager->pageS
1d930 69 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ize);.          
1d940 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  }.        }else{
1d950 0a 20 20 20 20 20 20 20 20 20 20 75 33 32 20 63  .          u32 c
1d960 6b 73 75 6d 2c 20 73 61 76 65 64 3b 0a 20 20 20  ksum, saved;.   
1d970 20 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61         char *pDa
1d980 74 61 32 2c 20 2a 70 45 6e 64 3b 0a 20 20 20 20  ta2, *pEnd;.    
1d990 20 20 20 20 20 20 2f 2a 20 57 65 20 73 68 6f 75        /* We shou
1d9a0 6c 64 20 6e 65 76 65 72 20 77 72 69 74 65 20 74  ld never write t
1d9b0 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69  o the journal fi
1d9c0 6c 65 20 74 68 65 20 70 61 67 65 20 74 68 61 74  le the page that
1d9d0 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f  .          ** co
1d9e0 6e 74 61 69 6e 73 20 74 68 65 20 64 61 74 61 62  ntains the datab
1d9f0 61 73 65 20 6c 6f 63 6b 73 2e 20 20 54 68 65 20  ase locks.  The 
1da00 66 6f 6c 6c 6f 77 69 6e 67 20 61 73 73 65 72 74  following assert
1da10 20 76 65 72 69 66 69 65 73 0a 20 20 20 20 20 20   verifies.      
1da20 20 20 20 20 2a 2a 20 74 68 61 74 20 77 65 20 64      ** that we d
1da30 6f 20 6e 6f 74 2e 20 2a 2f 0a 20 20 20 20 20 20  o not. */.      
1da40 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d      assert( pPg-
1da50 3e 70 67 6e 6f 21 3d 50 41 47 45 52 5f 4d 4a 5f  >pgno!=PAGER_MJ_
1da60 50 47 4e 4f 28 70 50 61 67 65 72 29 20 29 3b 0a  PGNO(pPager) );.
1da70 20 20 20 20 20 20 20 20 20 20 70 44 61 74 61 32            pData2
1da80 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67 65 72   = CODEC2(pPager
1da90 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e 70 67  , pData, pPg->pg
1daa0 6e 6f 2c 20 37 29 3b 0a 20 20 20 20 20 20 20 20  no, 7);.        
1dab0 20 20 63 6b 73 75 6d 20 3d 20 70 61 67 65 72 5f    cksum = pager_
1dac0 63 6b 73 75 6d 28 70 50 61 67 65 72 2c 20 28 75  cksum(pPager, (u
1dad0 38 2a 29 70 44 61 74 61 32 29 3b 0a 20 20 20 20  8*)pData2);.    
1dae0 20 20 20 20 20 20 70 45 6e 64 20 3d 20 70 44 61        pEnd = pDa
1daf0 74 61 32 20 2b 20 70 50 61 67 65 72 2d 3e 70 61  ta2 + pPager->pa
1db00 67 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20  geSize;.        
1db10 20 20 70 44 61 74 61 32 20 2d 3d 20 34 3b 0a 20    pData2 -= 4;. 
1db20 20 20 20 20 20 20 20 20 20 73 61 76 65 64 20 3d           saved =
1db30 20 2a 28 75 33 32 2a 29 70 45 6e 64 3b 0a 20 20   *(u32*)pEnd;.  
1db40 20 20 20 20 20 20 20 20 70 75 74 33 32 62 69 74          put32bit
1db50 73 28 70 45 6e 64 2c 20 63 6b 73 75 6d 29 3b 0a  s(pEnd, cksum);.
1db60 20 20 20 20 20 20 20 20 20 20 73 7a 50 67 20 3d            szPg =
1db70 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a   pPager->pageSiz
1db80 65 2b 38 3b 0a 20 20 20 20 20 20 20 20 20 20 70  e+8;.          p
1db90 75 74 33 32 62 69 74 73 28 70 44 61 74 61 32 2c  ut32bits(pData2,
1dba0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1dbb0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1dbc0 74 65 33 4f 73 57 72 69 74 65 28 70 50 61 67 65  te3OsWrite(pPage
1dbd0 72 2d 3e 6a 66 64 2c 20 70 44 61 74 61 32 2c 20  r->jfd, pData2, 
1dbe0 73 7a 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  szPg);.         
1dbf0 20 49 4f 54 52 41 43 45 28 28 22 4a 4f 55 54 20   IOTRACE(("JOUT 
1dc00 25 70 20 25 64 20 25 6c 6c 64 20 25 64 5c 6e 22  %p %d %lld %d\n"
1dc10 2c 20 70 50 61 67 65 72 2c 20 70 50 67 2d 3e 70  , pPager, pPg->p
1dc20 67 6e 6f 2c 0a 20 20 20 20 20 20 20 20 20 20 20  gno,.           
1dc30 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d 3e          pPager->
1dc40 6a 6f 75 72 6e 61 6c 4f 66 66 2c 20 73 7a 50 67  journalOff, szPg
1dc50 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 50 41  ));.          PA
1dc60 47 45 52 5f 49 4e 43 52 28 73 71 6c 69 74 65 33  GER_INCR(sqlite3
1dc70 5f 70 61 67 65 72 5f 77 72 69 74 65 6a 5f 63 6f  _pager_writej_co
1dc80 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
1dc90 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
1dca0 66 66 20 2b 3d 20 73 7a 50 67 3b 0a 20 20 20 20  ff += szPg;.    
1dcb0 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43 45        PAGERTRACE
1dcc0 35 28 22 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  5("JOURNAL %d pa
1dcd0 67 65 20 25 64 20 6e 65 65 64 53 79 6e 63 3d 25  ge %d needSync=%
1dce0 64 20 68 61 73 68 28 25 30 38 78 29 5c 6e 22 2c  d hash(%08x)\n",
1dcf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1dd00 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1dd10 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d   pPg->pgno, pPg-
1dd20 3e 6e 65 65 64 53 79 6e 63 2c 20 70 61 67 65 72  >needSync, pager
1dd30 5f 70 61 67 65 68 61 73 68 28 70 50 67 29 29 3b  _pagehash(pPg));
1dd40 0a 20 20 20 20 20 20 20 20 20 20 2a 28 75 33 32  .          *(u32
1dd50 2a 29 70 45 6e 64 20 3d 20 73 61 76 65 64 3b 0a  *)pEnd = saved;.
1dd60 0a 09 20 20 2f 2a 20 41 6e 20 65 72 72 6f 72 20  ..  /* An error 
1dd70 68 61 73 20 6f 63 63 75 72 65 64 20 77 72 69 74  has occured writ
1dd80 69 6e 67 20 74 6f 20 74 68 65 20 6a 6f 75 72 6e  ing to the journ
1dd90 61 6c 20 66 69 6c 65 2e 20 54 68 65 20 0a 20 20  al file. The .  
1dda0 20 20 20 20 20 20 20 20 2a 2a 20 74 72 61 6e 73          ** trans
1ddb0 61 63 74 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72  action will be r
1ddc0 6f 6c 6c 65 64 20 62 61 63 6b 20 62 79 20 74 68  olled back by th
1ddd0 65 20 6c 61 79 65 72 20 61 62 6f 76 65 2e 0a 20  e layer above.. 
1dde0 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
1ddf0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1de00 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
1de10 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 63         return rc
1de20 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
1de30 20 20 20 20 20 20 20 20 20 70 50 61 67 65 72 2d           pPager-
1de40 3e 6e 52 65 63 2b 2b 3b 0a 20 20 20 20 20 20 20  >nRec++;.       
1de50 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65     assert( pPage
1de60 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d 30  r->aInJournal!=0
1de70 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50   );.          pP
1de80 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
1de90 5b 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d  [pPg->pgno/8] |=
1dea0 20 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37   1<<(pPg->pgno&7
1deb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 67  );.          pPg
1dec0 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20 21 70 50  ->needSync = !pP
1ded0 61 67 65 72 2d 3e 6e 6f 53 79 6e 63 3b 0a 20 20  ager->noSync;.  
1dee0 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 67          if( pPag
1def0 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b  er->stmtInUse ){
1df00 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
1df10 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1df20 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1df30 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1df40 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1df50 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
1df60 7b 0a 20 20 20 20 20 20 20 20 70 50 67 2d 3e 6e  {.        pPg->n
1df70 65 65 64 53 79 6e 63 20 3d 20 21 70 50 61 67 65  eedSync = !pPage
1df80 72 2d 3e 6a 6f 75 72 6e 61 6c 53 74 61 72 74 65  r->journalStarte
1df90 64 20 26 26 20 21 70 50 61 67 65 72 2d 3e 6e 6f  d && !pPager->no
1dfa0 53 79 6e 63 3b 0a 20 20 20 20 20 20 20 20 50 41  Sync;.        PA
1dfb0 47 45 52 54 52 41 43 45 34 28 22 41 50 50 45 4e  GERTRACE4("APPEN
1dfc0 44 20 25 64 20 70 61 67 65 20 25 64 20 6e 65 65  D %d page %d nee
1dfd0 64 53 79 6e 63 3d 25 64 5c 6e 22 2c 0a 20 20 20  dSync=%d\n",.   
1dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 50 41 47               PAG
1dff0 45 52 49 44 28 70 50 61 67 65 72 29 2c 20 70 50  ERID(pPager), pP
1e000 67 2d 3e 70 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65  g->pgno, pPg->ne
1e010 65 64 53 79 6e 63 29 3b 0a 20 20 20 20 20 20 7d  edSync);.      }
1e020 0a 20 20 20 20 20 20 69 66 28 20 70 50 67 2d 3e  .      if( pPg->
1e030 6e 65 65 64 53 79 6e 63 20 29 7b 0a 20 20 20 20  needSync ){.    
1e040 20 20 20 20 70 50 61 67 65 72 2d 3e 6e 65 65 64      pPager->need
1e050 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  Sync = 1;.      
1e060 7d 0a 20 20 20 20 20 20 70 50 67 2d 3e 69 6e 4a  }.      pPg->inJ
1e070 6f 75 72 6e 61 6c 20 3d 20 31 3b 0a 20 20 20 20  ournal = 1;.    
1e080 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74  }.  .    /* If t
1e090 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75  he statement jou
1e0a0 72 6e 61 6c 20 69 73 20 6f 70 65 6e 20 61 6e 64  rnal is open and
1e0b0 20 74 68 65 20 70 61 67 65 20 69 73 20 6e 6f 74   the page is not
1e0c0 20 69 6e 20 69 74 2c 0a 20 20 20 20 2a 2a 20 74   in it,.    ** t
1e0d0 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 63 75  hen write the cu
1e0e0 72 72 65 6e 74 20 70 61 67 65 20 74 6f 20 74 68  rrent page to th
1e0f0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 6f 75 72  e statement jour
1e100 6e 61 6c 2e 20 20 4e 6f 74 65 20 74 68 61 74 0a  nal.  Note that.
1e110 20 20 20 20 2a 2a 20 74 68 65 20 73 74 61 74 65      ** the state
1e120 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 66 6f 72  ment journal for
1e130 6d 61 74 20 64 69 66 66 65 72 73 20 66 72 6f 6d  mat differs from
1e140 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 6a 6f   the standard jo
1e150 75 72 6e 61 6c 20 66 6f 72 6d 61 74 0a 20 20 20  urnal format.   
1e160 20 2a 2a 20 69 6e 20 74 68 61 74 20 69 74 20 6f   ** in that it o
1e170 6d 69 74 73 20 74 68 65 20 63 68 65 63 6b 73 75  mits the checksu
1e180 6d 73 20 61 6e 64 20 74 68 65 20 68 65 61 64 65  ms and the heade
1e190 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  r..    */.    if
1e1a0 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e  ( pPager->stmtIn
1e1b0 55 73 65 20 0a 20 20 20 20 20 26 26 20 21 70 61  Use .     && !pa
1e1c0 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
1e1d0 67 29 20 0a 20 20 20 20 20 26 26 20 28 69 6e 74  g) .     && (int
1e1e0 29 70 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67  )pPg->pgno<=pPag
1e1f0 65 72 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20  er->stmtSize .  
1e200 20 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72    ){.      asser
1e210 74 28 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61  t( pPg->inJourna
1e220 6c 20 7c 7c 20 28 69 6e 74 29 70 50 67 2d 3e 70  l || (int)pPg->p
1e230 67 6e 6f 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67  gno>pPager->orig
1e240 44 62 53 69 7a 65 20 29 3b 0a 20 20 20 20 20 20  DbSize );.      
1e250 69 66 28 20 4d 45 4d 44 42 20 29 7b 0a 20 20 20  if( MEMDB ){.   
1e260 20 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a       PgHistory *
1e270 70 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f  pHist = PGHDR_TO
1e280 5f 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65  _HIST(pPg, pPage
1e290 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
1e2a0 72 74 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  rt( pHist->pStmt
1e2b0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
1e2c0 48 69 73 74 2d 3e 70 53 74 6d 74 20 3d 20 73 71  Hist->pStmt = sq
1e2d0 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
1e2e0 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65 20  Pager->pageSize 
1e2f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
1e300 48 69 73 74 2d 3e 70 53 74 6d 74 20 29 7b 0a 20  Hist->pStmt ){. 
1e310 20 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79 28           memcpy(
1e320 70 48 69 73 74 2d 3e 70 53 74 6d 74 2c 20 50 47  pHist->pStmt, PG
1e330 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50 67 29  HDR_TO_DATA(pPg)
1e340 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  , pPager->pageSi
1e350 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ze);.        }. 
1e360 20 20 20 20 20 20 20 50 41 47 45 52 54 52 41 43         PAGERTRAC
1e370 45 33 28 22 53 54 4d 54 2d 4a 4f 55 52 4e 41 4c  E3("STMT-JOURNAL
1e380 20 25 64 20 70 61 67 65 20 25 64 5c 6e 22 2c 20   %d page %d\n", 
1e390 50 41 47 45 52 49 44 28 70 50 61 67 65 72 29 2c  PAGERID(pPager),
1e3a0 20 70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 20 20 20   pPg->pgno);.   
1e3b0 20 20 20 20 20 70 61 67 65 5f 61 64 64 5f 74 6f       page_add_to
1e3c0 5f 73 74 6d 74 5f 6c 69 73 74 28 70 50 67 29 3b  _stmt_list(pPg);
1e3d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1e3e0 20 20 20 20 20 20 63 68 61 72 20 2a 70 44 61 74        char *pDat
1e3f0 61 32 20 3d 20 43 4f 44 45 43 32 28 70 50 61 67  a2 = CODEC2(pPag
1e400 65 72 2c 20 70 44 61 74 61 2c 20 70 50 67 2d 3e  er, pData, pPg->
1e410 70 67 6e 6f 2c 20 37 29 2d 34 3b 0a 20 20 20 20  pgno, 7)-4;.    
1e420 20 20 20 20 70 75 74 33 32 62 69 74 73 28 70 44      put32bits(pD
1e430 61 74 61 32 2c 20 70 50 67 2d 3e 70 67 6e 6f 29  ata2, pPg->pgno)
1e440 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
1e450 71 6c 69 74 65 33 4f 73 57 72 69 74 65 28 70 50  qlite3OsWrite(pP
1e460 61 67 65 72 2d 3e 73 74 66 64 2c 20 70 44 61 74  ager->stfd, pDat
1e470 61 32 2c 20 70 50 61 67 65 72 2d 3e 70 61 67 65  a2, pPager->page
1e480 53 69 7a 65 2b 34 29 3b 0a 20 20 20 20 20 20 20  Size+4);.       
1e490 20 50 41 47 45 52 54 52 41 43 45 33 28 22 53 54   PAGERTRACE3("ST
1e4a0 4d 54 2d 4a 4f 55 52 4e 41 4c 20 25 64 20 70 61  MT-JOURNAL %d pa
1e4b0 67 65 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49  ge %d\n", PAGERI
1e4c0 44 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e  D(pPager), pPg->
1e4d0 70 67 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20 69  pgno);.        i
1e4e0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1e4f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65   ){.          re
1e500 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 20  turn rc;.       
1e510 20 7d 0a 20 20 20 20 20 20 20 20 70 50 61 67 65   }.        pPage
1e520 72 2d 3e 73 74 6d 74 4e 52 65 63 2b 2b 3b 0a 20  r->stmtNRec++;. 
1e530 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
1e540 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21 3d  Pager->aInStmt!=
1e550 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61  0 );.        pPa
1e560 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67  ger->aInStmt[pPg
1e570 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c  ->pgno/8] |= 1<<
1e580 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20  (pPg->pgno&7);. 
1e590 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
1e5a0 0a 0a 20 20 2f 2a 20 55 70 64 61 74 65 20 74 68  ..  /* Update th
1e5b0 65 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 20  e database size 
1e5c0 61 6e 64 20 72 65 74 75 72 6e 2e 0a 20 20 2a 2f  and return..  */
1e5d0 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 67 65  .  assert( pPage
1e5e0 72 2d 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f  r->state>=PAGER_
1e5f0 53 48 41 52 45 44 20 29 3b 0a 20 20 69 66 28 20  SHARED );.  if( 
1e600 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3c 28  pPager->dbSize<(
1e610 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 29 7b  int)pPg->pgno ){
1e620 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53  .    pPager->dbS
1e630 69 7a 65 20 3d 20 70 50 67 2d 3e 70 67 6e 6f 3b  ize = pPg->pgno;
1e640 0a 20 20 20 20 69 66 28 20 21 4d 45 4d 44 42 20  .    if( !MEMDB 
1e650 26 26 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a  && pPager->dbSiz
1e660 65 3d 3d 50 45 4e 44 49 4e 47 5f 42 59 54 45 2f  e==PENDING_BYTE/
1e670 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
1e680 20 29 7b 0a 20 20 20 20 20 20 70 50 61 67 65 72   ){.      pPager
1e690 2d 3e 64 62 53 69 7a 65 2b 2b 3b 0a 20 20 20 20  ->dbSize++;.    
1e6a0 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  }.  }.  return r
1e6b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  c;.}../*.** This
1e6c0 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
1e6d0 64 20 74 6f 20 6d 61 72 6b 20 61 20 64 61 74 61  d to mark a data
1e6e0 2d 70 61 67 65 20 61 73 20 77 72 69 74 61 62 6c  -page as writabl
1e6f0 65 2e 20 49 74 20 75 73 65 73 20 0a 2a 2a 20 70  e. It uses .** p
1e700 61 67 65 72 5f 77 72 69 74 65 28 29 20 74 6f 20  ager_write() to 
1e710 6f 70 65 6e 20 61 20 6a 6f 75 72 6e 61 6c 20 66  open a journal f
1e720 69 6c 65 20 28 69 66 20 69 74 20 69 73 20 6e 6f  ile (if it is no
1e730 74 20 61 6c 72 65 61 64 79 20 6f 70 65 6e 29 0a  t already open).
1e740 2a 2a 20 61 6e 64 20 77 72 69 74 65 20 74 68 65  ** and write the
1e750 20 70 61 67 65 20 2a 70 44 61 74 61 20 74 6f 20   page *pData to 
1e760 74 68 65 20 6a 6f 75 72 6e 61 6c 2e 0a 2a 2a 0a  the journal..**.
1e770 2a 2a 20 54 68 65 20 64 69 66 66 65 72 65 6e 63  ** The differenc
1e780 65 20 62 65 74 77 65 65 6e 20 74 68 69 73 20 66  e between this f
1e790 75 6e 63 74 69 6f 6e 20 61 6e 64 20 70 61 67 65  unction and page
1e7a0 72 5f 77 72 69 74 65 28 29 20 69 73 20 74 68 61  r_write() is tha
1e7b0 74 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  t this.** functi
1e7c0 6f 6e 20 61 6c 73 6f 20 64 65 61 6c 73 20 77 69  on also deals wi
1e7d0 74 68 20 74 68 65 20 73 70 65 63 69 61 6c 20 63  th the special c
1e7e0 61 73 65 20 77 68 65 72 65 20 32 20 6f 72 20 6d  ase where 2 or m
1e7f0 6f 72 65 20 70 61 67 65 73 0a 2a 2a 20 66 69 74  ore pages.** fit
1e800 20 6f 6e 20 61 20 73 69 6e 67 6c 65 20 64 69 73   on a single dis
1e810 6b 20 73 65 63 74 6f 72 2e 20 49 6e 20 74 68 69  k sector. In thi
1e820 73 20 63 61 73 65 20 61 6c 6c 20 63 6f 2d 72 65  s case all co-re
1e830 73 69 64 65 6e 74 20 70 61 67 65 73 0a 2a 2a 20  sident pages.** 
1e840 6d 75 73 74 20 68 61 76 65 20 62 65 65 6e 20 77  must have been w
1e850 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 6a 6f  ritten to the jo
1e860 75 72 6e 61 6c 20 66 69 6c 65 20 62 65 66 6f 72  urnal file befor
1e870 65 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2f 0a  e returning..*/.
1e880 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65 72  int sqlite3Pager
1e890 57 72 69 74 65 28 44 62 50 61 67 65 20 2a 70 44  Write(DbPage *pD
1e8a0 62 50 61 67 65 29 7b 0a 20 20 69 6e 74 20 72 63  bPage){.  int rc
1e8b0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 0a 20   = SQLITE_OK;.. 
1e8c0 20 50 67 48 64 72 20 2a 70 50 67 20 3d 20 70 44   PgHdr *pPg = pD
1e8d0 62 50 61 67 65 3b 0a 20 20 50 61 67 65 72 20 2a  bPage;.  Pager *
1e8e0 70 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50  pPager = pPg->pP
1e8f0 61 67 65 72 3b 0a 20 20 50 67 6e 6f 20 6e 50 61  ager;.  Pgno nPa
1e900 67 65 50 65 72 53 65 63 74 6f 72 20 3d 20 28 70  gePerSector = (p
1e910 50 61 67 65 72 2d 3e 73 65 63 74 6f 72 53 69 7a  Pager->sectorSiz
1e920 65 2f 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69  e/pPager->pageSi
1e930 7a 65 29 3b 0a 0a 20 20 69 66 28 20 21 4d 45 4d  ze);..  if( !MEM
1e940 44 42 20 26 26 20 6e 50 61 67 65 50 65 72 53 65  DB && nPagePerSe
1e950 63 74 6f 72 3e 31 20 29 7b 0a 20 20 20 20 50 67  ctor>1 ){.    Pg
1e960 6e 6f 20 6e 50 61 67 65 43 6f 75 6e 74 3b 20 20  no nPageCount;  
1e970 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 74 61 6c          /* Total
1e980 20 6e 75 6d 62 65 72 20 6f 66 20 70 61 67 65 73   number of pages
1e990 20 69 6e 20 64 61 74 61 62 61 73 65 20 66 69 6c   in database fil
1e9a0 65 20 2a 2f 0a 20 20 20 20 50 67 6e 6f 20 70 67  e */.    Pgno pg
1e9b0 31 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  1;              
1e9c0 20 20 20 2f 2a 20 46 69 72 73 74 20 70 61 67 65     /* First page
1e9d0 20 6f 66 20 74 68 65 20 73 65 63 74 6f 72 20 70   of the sector p
1e9e0 50 67 20 69 73 20 6c 6f 63 61 74 65 64 20 6f 6e  Pg is located on
1e9f0 2e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 50 61  . */.    int nPa
1ea00 67 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ge;             
1ea10 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ea20 70 61 67 65 73 20 73 74 61 72 74 69 6e 67 20 61  pages starting a
1ea30 74 20 70 67 31 20 74 6f 20 6a 6f 75 72 6e 61 6c  t pg1 to journal
1ea40 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   */.    int ii;.
1ea50 0a 20 20 20 20 2f 2a 20 53 65 74 20 74 68 65 20  .    /* Set the 
1ea60 64 6f 4e 6f 74 53 79 6e 63 20 66 6c 61 67 20 74  doNotSync flag t
1ea70 6f 20 31 2e 20 54 68 69 73 20 69 73 20 62 65 63  o 1. This is bec
1ea80 61 75 73 65 20 77 65 20 63 61 6e 6e 6f 74 20 61  ause we cannot a
1ea90 6c 6c 6f 77 20 61 20 6a 6f 75 72 6e 61 6c 0a 20  llow a journal. 
1eaa0 20 20 20 2a 2a 20 68 65 61 64 65 72 20 74 6f 20     ** header to 
1eab0 62 65 20 77 72 69 74 74 65 6e 20 62 65 74 77 65  be written betwe
1eac0 65 6e 20 74 68 65 20 70 61 67 65 73 20 6a 6f 75  en the pages jou
1ead0 72 6e 61 6c 65 64 20 62 79 20 74 68 69 73 20 66  rnaled by this f
1eae0 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2f 0a  unction..    */.
1eaf0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1eb00 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 30  er->doNotSync==0
1eb10 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1eb20 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 31 3b 0a 0a  doNotSync = 1;..
1eb30 20 20 20 20 2f 2a 20 54 68 69 73 20 74 72 69 63      /* This tric
1eb40 6b 20 61 73 73 75 6d 65 73 20 74 68 61 74 20 62  k assumes that b
1eb50 6f 74 68 20 74 68 65 20 70 61 67 65 2d 73 69 7a  oth the page-siz
1eb60 65 20 61 6e 64 20 73 65 63 74 6f 72 2d 73 69 7a  e and sector-siz
1eb70 65 20 61 72 65 0a 20 20 20 20 2a 2a 20 61 6e 20  e are.    ** an 
1eb80 69 6e 74 65 67 65 72 20 70 6f 77 65 72 20 6f 66  integer power of
1eb90 20 32 2e 20 49 74 20 73 65 74 73 20 76 61 72 69   2. It sets vari
1eba0 61 62 6c 65 20 70 67 31 20 74 6f 20 74 68 65 20  able pg1 to the 
1ebb0 69 64 65 6e 74 69 66 69 65 72 0a 20 20 20 20 2a  identifier.    *
1ebc0 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 70  * of the first p
1ebd0 61 67 65 20 6f 66 20 74 68 65 20 73 65 63 74 6f  age of the secto
1ebe0 72 20 70 50 67 20 69 73 20 6c 6f 63 61 74 65 64  r pPg is located
1ebf0 20 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20   on..    */.    
1ec00 70 67 31 20 3d 20 28 28 70 50 67 2d 3e 70 67 6e  pg1 = ((pPg->pgn
1ec10 6f 2d 31 29 20 26 20 7e 28 6e 50 61 67 65 50 65  o-1) & ~(nPagePe
1ec20 72 53 65 63 74 6f 72 2d 31 29 29 20 2b 20 31 3b  rSector-1)) + 1;
1ec30 0a 0a 20 20 20 20 6e 50 61 67 65 43 6f 75 6e 74  ..    nPageCount
1ec40 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72 50   = sqlite3PagerP
1ec50 61 67 65 63 6f 75 6e 74 28 70 50 61 67 65 72 29  agecount(pPager)
1ec60 3b 0a 20 20 20 20 69 66 28 20 70 50 67 2d 3e 70  ;.    if( pPg->p
1ec70 67 6e 6f 3e 6e 50 61 67 65 43 6f 75 6e 74 20 29  gno>nPageCount )
1ec80 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d 20  {.      nPage = 
1ec90 28 70 50 67 2d 3e 70 67 6e 6f 20 2d 20 70 67 31  (pPg->pgno - pg1
1eca0 29 2b 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  )+1;.    }else i
1ecb0 66 28 20 28 70 67 31 2b 6e 50 61 67 65 50 65 72  f( (pg1+nPagePer
1ecc0 53 65 63 74 6f 72 2d 31 29 3e 6e 50 61 67 65 43  Sector-1)>nPageC
1ecd0 6f 75 6e 74 20 29 7b 0a 20 20 20 20 20 20 6e 50  ount ){.      nP
1ece0 61 67 65 20 3d 20 6e 50 61 67 65 43 6f 75 6e 74  age = nPageCount
1ecf0 2b 31 2d 70 67 31 3b 0a 20 20 20 20 7d 65 6c 73  +1-pg1;.    }els
1ed00 65 7b 0a 20 20 20 20 20 20 6e 50 61 67 65 20 3d  e{.      nPage =
1ed10 20 6e 50 61 67 65 50 65 72 53 65 63 74 6f 72 3b   nPagePerSector;
1ed20 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
1ed30 74 28 6e 50 61 67 65 3e 30 29 3b 0a 20 20 20 20  t(nPage>0);.    
1ed40 61 73 73 65 72 74 28 70 67 31 3c 3d 70 50 67 2d  assert(pg1<=pPg-
1ed50 3e 70 67 6e 6f 29 3b 0a 20 20 20 20 61 73 73 65  >pgno);.    asse
1ed60 72 74 28 28 70 67 31 2b 6e 50 61 67 65 29 3e 70  rt((pg1+nPage)>p
1ed70 50 67 2d 3e 70 67 6e 6f 29 3b 0a 0a 20 20 20 20  Pg->pgno);..    
1ed80 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e 50 61  for(ii=0; ii<nPa
1ed90 67 65 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45  ge && rc==SQLITE
1eda0 5f 4f 4b 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20  _OK; ii++){.    
1edb0 20 20 50 67 6e 6f 20 70 67 20 3d 20 70 67 31 2b    Pgno pg = pg1+
1edc0 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  ii;.      if( !p
1edd0 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61  Pager->aInJourna
1ede0 6c 20 7c 7c 20 70 67 3d 3d 70 50 67 2d 3e 70 67  l || pg==pPg->pg
1edf0 6e 6f 20 7c 7c 20 0a 20 20 20 20 20 20 20 20 20  no || .         
1ee00 20 70 67 3e 70 50 61 67 65 72 2d 3e 6f 72 69 67   pg>pPager->orig
1ee10 44 62 53 69 7a 65 20 7c 7c 20 21 28 70 50 61 67  DbSize || !(pPag
1ee20 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70  er->aInJournal[p
1ee30 67 2f 38 5d 26 28 31 3c 3c 28 70 67 26 37 29 29  g/8]&(1<<(pg&7))
1ee40 29 0a 20 20 20 20 20 20 29 20 7b 0a 20 20 20 20  ).      ) {.    
1ee50 20 20 20 20 69 66 28 20 70 67 21 3d 50 41 47 45      if( pg!=PAGE
1ee60 52 5f 4d 4a 5f 50 47 4e 4f 28 70 50 61 67 65 72  R_MJ_PGNO(pPager
1ee70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 50  ) ){.          P
1ee80 67 48 64 72 20 2a 70 50 61 67 65 3b 0a 20 20 20  gHdr *pPage;.   
1ee90 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
1eea0 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
1eeb0 65 72 2c 20 70 67 2c 20 26 70 50 61 67 65 29 3b  er, pg, &pPage);
1eec0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72  .          if( r
1eed0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eee0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
1eef0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 50 61   pager_write(pPa
1ef00 67 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ge);.           
1ef10 20 73 71 6c 69 74 65 33 50 61 67 65 72 55 6e 72   sqlite3PagerUnr
1ef20 65 66 28 70 50 61 67 65 29 3b 0a 20 20 20 20 20  ef(pPage);.     
1ef30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1ef40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
1ef50 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1ef60 65 72 2d 3e 64 6f 4e 6f 74 53 79 6e 63 3d 3d 31  er->doNotSync==1
1ef70 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e   );.    pPager->
1ef80 64 6f 4e 6f 74 53 79 6e 63 20 3d 20 30 3b 0a 20  doNotSync = 0;. 
1ef90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d   }else{.    rc =
1efa0 20 70 61 67 65 72 5f 77 72 69 74 65 28 70 44 62   pager_write(pDb
1efb0 50 61 67 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Page);.  }.  ret
1efc0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
1efd0 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
1efe0 74 68 65 20 70 61 67 65 20 67 69 76 65 6e 20 69  the page given i
1eff0 6e 20 74 68 65 20 61 72 67 75 6d 65 6e 74 20 77  n the argument w
1f000 61 73 20 70 72 65 76 69 6f 75 73 6c 79 20 70 61  as previously pa
1f010 73 73 65 64 0a 2a 2a 20 74 6f 20 73 71 6c 69 74  ssed.** to sqlit
1f020 65 33 50 61 67 65 72 57 72 69 74 65 28 29 2e 20  e3PagerWrite(). 
1f030 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c   In other words,
1f040 20 72 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   return TRUE if 
1f050 69 74 20 69 73 20 6f 6b 0a 2a 2a 20 74 6f 20 63  it is ok.** to c
1f060 68 61 6e 67 65 20 74 68 65 20 63 6f 6e 74 65 6e  hange the conten
1f070 74 20 6f 66 20 74 68 65 20 70 61 67 65 2e 0a 2a  t of the page..*
1f080 2f 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  /.#ifndef NDEBUG
1f090 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
1f0a0 72 49 73 77 72 69 74 65 61 62 6c 65 28 44 62 50  rIswriteable(DbP
1f0b0 61 67 65 20 2a 70 50 67 29 7b 0a 20 20 72 65 74  age *pPg){.  ret
1f0c0 75 72 6e 20 70 50 67 2d 3e 64 69 72 74 79 3b 0a  urn pPg->dirty;.
1f0d0 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  }.#endif..#ifnde
1f0e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 41  f SQLITE_OMIT_VA
1f0f0 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 52 65 70 6c 61  CUUM./*.** Repla
1f100 63 65 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ce the content o
1f110 66 20 61 20 73 69 6e 67 6c 65 20 70 61 67 65 20  f a single page 
1f120 77 69 74 68 20 74 68 65 20 69 6e 66 6f 72 6d 61  with the informa
1f130 74 69 6f 6e 20 69 6e 20 74 68 65 20 74 68 69 72  tion in the thir
1f140 64 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  d.** argument..*
1f150 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
1f160 65 72 4f 76 65 72 77 72 69 74 65 28 50 61 67 65  erOverwrite(Page
1f170 72 20 2a 70 50 61 67 65 72 2c 20 50 67 6e 6f 20  r *pPager, Pgno 
1f180 70 67 6e 6f 2c 20 76 6f 69 64 20 2a 70 44 61 74  pgno, void *pDat
1f190 61 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  a){.  PgHdr *pPg
1f1a0 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
1f1b0 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67 65 72  c = sqlite3Pager
1f1c0 47 65 74 28 70 50 61 67 65 72 2c 20 70 67 6e 6f  Get(pPager, pgno
1f1d0 2c 20 26 70 50 67 29 3b 0a 20 20 69 66 28 20 72  , &pPg);.  if( r
1f1e0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f1f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f200 50 61 67 65 72 57 72 69 74 65 28 70 50 67 29 3b  PagerWrite(pPg);
1f210 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
1f220 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
1f230 6d 65 6d 63 70 79 28 73 71 6c 69 74 65 33 50 61  memcpy(sqlite3Pa
1f240 67 65 72 47 65 74 44 61 74 61 28 70 50 67 29 2c  gerGetData(pPg),
1f250 20 70 44 61 74 61 2c 20 70 50 61 67 65 72 2d 3e   pData, pPager->
1f260 70 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 7d  pageSize);.    }
1f270 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67 65  .    sqlite3Page
1f280 72 55 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 7d  rUnref(pPg);.  }
1f290 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
1f2a0 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1f2b0 63 61 6c 6c 20 74 6f 20 74 68 69 73 20 72 6f 75  call to this rou
1f2c0 74 69 6e 65 20 74 65 6c 6c 73 20 74 68 65 20 70  tine tells the p
1f2d0 61 67 65 72 20 74 68 61 74 20 69 74 20 69 73 20  ager that it is 
1f2e0 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f  not necessary to
1f2f0 0a 2a 2a 20 77 72 69 74 65 20 74 68 65 20 69 6e  .** write the in
1f300 66 6f 72 6d 61 74 69 6f 6e 20 6f 6e 20 70 61 67  formation on pag
1f310 65 20 70 50 67 20 62 61 63 6b 20 74 6f 20 74 68  e pPg back to th
1f320 65 20 64 69 73 6b 2c 20 65 76 65 6e 20 74 68 6f  e disk, even tho
1f330 75 67 68 0a 2a 2a 20 74 68 61 74 20 70 61 67 65  ugh.** that page
1f340 20 6d 69 67 68 74 20 62 65 20 6d 61 72 6b 65 64   might be marked
1f350 20 61 73 20 64 69 72 74 79 2e 0a 2a 2a 0a 2a 2a   as dirty..**.**
1f360 20 54 68 65 20 6f 76 65 72 6c 79 69 6e 67 20 73   The overlying s
1f370 6f 66 74 77 61 72 65 20 6c 61 79 65 72 20 63 61  oftware layer ca
1f380 6c 6c 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65  lls this routine
1f390 20 77 68 65 6e 20 61 6c 6c 20 6f 66 20 74 68 65   when all of the
1f3a0 20 64 61 74 61 0a 2a 2a 20 6f 6e 20 74 68 65 20   data.** on the 
1f3b0 67 69 76 65 6e 20 70 61 67 65 20 69 73 20 75 6e  given page is un
1f3c0 75 73 65 64 2e 20 20 54 68 65 20 70 61 67 65 72  used.  The pager
1f3d0 20 6d 61 72 6b 73 20 74 68 65 20 70 61 67 65 20   marks the page 
1f3e0 61 73 20 63 6c 65 61 6e 20 73 6f 0a 2a 2a 20 74  as clean so.** t
1f3f0 68 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  hat it does not 
1f400 67 65 74 20 77 72 69 74 74 65 6e 20 74 6f 20 64  get written to d
1f410 69 73 6b 2e 0a 2a 2a 0a 2a 2a 20 54 65 73 74 73  isk..**.** Tests
1f420 20 73 68 6f 77 20 74 68 61 74 20 74 68 69 73 20   show that this 
1f430 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2c 20 74 6f  optimization, to
1f440 67 65 74 68 65 72 20 77 69 74 68 20 74 68 65 0a  gether with the.
1f450 2a 2a 20 73 71 6c 69 74 65 33 50 61 67 65 72 44  ** sqlite3PagerD
1f460 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28 29 20 62 65  ontRollback() be
1f470 6c 6f 77 2c 20 6d 6f 72 65 20 74 68 61 6e 20 64  low, more than d
1f480 6f 75 62 6c 65 20 74 68 65 20 73 70 65 65 64 0a  ouble the speed.
1f490 2a 2a 20 6f 66 20 6c 61 72 67 65 20 49 4e 53 45  ** of large INSE
1f4a0 52 54 20 6f 70 65 72 61 74 69 6f 6e 73 20 61 6e  RT operations an
1f4b0 64 20 71 75 61 64 72 75 70 6c 65 20 74 68 65 20  d quadruple the 
1f4c0 73 70 65 65 64 20 6f 66 20 6c 61 72 67 65 20 44  speed of large D
1f4d0 45 4c 45 54 45 73 2e 0a 2a 2a 0a 2a 2a 20 57 68  ELETEs..**.** Wh
1f4e0 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  en this routine 
1f4f0 69 73 20 63 61 6c 6c 65 64 2c 20 73 65 74 20 74  is called, set t
1f500 68 65 20 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  he alwaysRollbac
1f510 6b 20 66 6c 61 67 20 74 6f 20 74 72 75 65 2e 0a  k flag to true..
1f520 2a 2a 20 53 75 62 73 65 71 75 65 6e 74 20 63 61  ** Subsequent ca
1f530 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 33 50 61  lls to sqlite3Pa
1f540 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63 6b 28  gerDontRollback(
1f550 29 20 66 6f 72 20 74 68 65 20 73 61 6d 65 20 70  ) for the same p
1f560 61 67 65 0a 2a 2a 20 77 69 6c 6c 20 74 68 65 72  age.** will ther
1f570 65 61 66 74 65 72 20 62 65 20 69 67 6e 6f 72 65  eafter be ignore
1f580 64 2e 20 20 54 68 69 73 20 69 73 20 6e 65 63 65  d.  This is nece
1f590 73 73 61 72 79 20 74 6f 20 61 76 6f 69 64 20 61  ssary to avoid a
1f5a0 20 70 72 6f 62 6c 65 6d 0a 2a 2a 20 77 68 65 72   problem.** wher
1f5b0 65 20 61 20 70 61 67 65 20 77 69 74 68 20 64 61  e a page with da
1f5c0 74 61 20 69 73 20 61 64 64 65 64 20 74 6f 20 74  ta is added to t
1f5d0 68 65 20 66 72 65 65 6c 69 73 74 20 64 75 72 69  he freelist duri
1f5e0 6e 67 20 6f 6e 65 20 70 61 72 74 20 6f 66 0a 2a  ng one part of.*
1f5f0 2a 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  * a transaction 
1f600 74 68 65 6e 20 72 65 6d 6f 76 65 64 20 66 72 6f  then removed fro
1f610 6d 20 74 68 65 20 66 72 65 65 6c 69 73 74 20 64  m the freelist d
1f620 75 72 69 6e 67 20 61 20 6c 61 74 65 72 20 70 61  uring a later pa
1f630 72 74 0a 2a 2a 20 6f 66 20 74 68 65 20 73 61 6d  rt.** of the sam
1f640 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e  e transaction an
1f650 64 20 72 65 75 73 65 64 20 66 6f 72 20 73 6f 6d  d reused for som
1f660 65 20 6f 74 68 65 72 20 70 75 72 70 6f 73 65 2e  e other purpose.
1f670 20 20 57 68 65 6e 20 69 74 0a 2a 2a 20 69 73 20    When it.** is 
1f680 66 69 72 73 74 20 61 64 64 65 64 20 74 6f 20 74  first added to t
1f690 68 65 20 66 72 65 65 6c 69 73 74 2c 20 74 68 69  he freelist, thi
1f6a0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1f6b0 6c 65 64 2e 20 20 57 68 65 6e 20 72 65 75 73 65  led.  When reuse
1f6c0 64 2c 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  d,.** the sqlite
1f6d0 33 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61  3PagerDontRollba
1f6e0 63 6b 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20  ck() routine is 
1f6f0 63 61 6c 6c 65 64 2e 20 20 42 75 74 20 62 65 63  called.  But bec
1f700 61 75 73 65 20 74 68 65 0a 2a 2a 20 70 61 67 65  ause the.** page
1f710 20 63 6f 6e 74 61 69 6e 73 20 63 72 69 74 69 63   contains critic
1f720 61 6c 20 64 61 74 61 2c 20 77 65 20 73 74 69 6c  al data, we stil
1f730 6c 20 6e 65 65 64 20 74 6f 20 62 65 20 73 75 72  l need to be sur
1f740 65 20 69 74 20 67 65 74 73 0a 2a 2a 20 72 6f 6c  e it gets.** rol
1f750 6c 65 64 20 62 61 63 6b 20 69 6e 20 73 70 69 74  led back in spit
1f760 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 33  e of the sqlite3
1f770 50 61 67 65 72 44 6f 6e 74 52 6f 6c 6c 62 61 63  PagerDontRollbac
1f780 6b 28 29 20 63 61 6c 6c 2e 0a 2a 2f 0a 76 6f 69  k() call..*/.voi
1f790 64 20 73 71 6c 69 74 65 33 50 61 67 65 72 44 6f  d sqlite3PagerDo
1f7a0 6e 74 57 72 69 74 65 28 44 62 50 61 67 65 20 2a  ntWrite(DbPage *
1f7b0 70 44 62 50 61 67 65 29 7b 0a 20 20 50 67 48 64  pDbPage){.  PgHd
1f7c0 72 20 2a 70 50 67 20 3d 20 70 44 62 50 61 67 65  r *pPg = pDbPage
1f7d0 3b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  ;.  Pager *pPage
1f7e0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
1f7f0 0a 0a 20 20 69 66 28 20 4d 45 4d 44 42 20 29 20  ..  if( MEMDB ) 
1f800 72 65 74 75 72 6e 3b 0a 20 20 70 50 67 2d 3e 61  return;.  pPg->a
1f810 6c 77 61 79 73 52 6f 6c 6c 62 61 63 6b 20 3d 20  lwaysRollback = 
1f820 31 3b 0a 20 20 69 66 28 20 70 50 67 2d 3e 64 69  1;.  if( pPg->di
1f830 72 74 79 20 26 26 20 21 70 50 61 67 65 72 2d 3e  rty && !pPager->
1f840 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
1f850 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
1f860 3e 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48  >state>=PAGER_SH
1f870 41 52 45 44 20 29 3b 0a 20 20 20 20 69 66 28 20  ARED );.    if( 
1f880 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3d 3d  pPager->dbSize==
1f890 28 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 20 26  (int)pPg->pgno &
1f8a0 26 20 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62  & pPager->origDb
1f8b0 53 69 7a 65 3c 70 50 61 67 65 72 2d 3e 64 62 53  Size<pPager->dbS
1f8c0 69 7a 65 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ize ){.      /* 
1f8d0 49 66 20 74 68 69 73 20 70 61 67 65 73 20 69 73  If this pages is
1f8e0 20 74 68 65 20 6c 61 73 74 20 70 61 67 65 20 69   the last page i
1f8f0 6e 20 74 68 65 20 66 69 6c 65 20 61 6e 64 20 74  n the file and t
1f900 68 65 20 66 69 6c 65 20 68 61 73 20 67 72 6f 77  he file has grow
1f910 6e 0a 20 20 20 20 20 20 2a 2a 20 64 75 72 69 6e  n.      ** durin
1f920 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 72  g the current tr
1f930 61 6e 73 61 63 74 69 6f 6e 2c 20 74 68 65 6e 20  ansaction, then 
1f940 64 6f 20 4e 4f 54 20 6d 61 72 6b 20 74 68 65 20  do NOT mark the 
1f950 70 61 67 65 20 61 73 20 63 6c 65 61 6e 2e 0a 20  page as clean.. 
1f960 20 20 20 20 20 2a 2a 20 57 68 65 6e 20 74 68 65       ** When the
1f970 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 67   database file g
1f980 72 6f 77 73 2c 20 77 65 20 6d 75 73 74 20 6d 61  rows, we must ma
1f990 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
1f9a0 20 6c 61 73 74 20 70 61 67 65 0a 20 20 20 20 20   last page.     
1f9b0 20 2a 2a 20 67 65 74 73 20 77 72 69 74 74 65 6e   ** gets written
1f9c0 20 61 74 20 6c 65 61 73 74 20 6f 6e 63 65 20 73   at least once s
1f9d0 6f 20 74 68 61 74 20 74 68 65 20 64 69 73 6b 20  o that the disk 
1f9e0 66 69 6c 65 20 77 69 6c 6c 20 62 65 20 74 68 65  file will be the
1f9f0 20 63 6f 72 72 65 63 74 0a 20 20 20 20 20 20 2a   correct.      *
1fa00 2a 20 73 69 7a 65 2e 20 49 66 20 79 6f 75 20 64  * size. If you d
1fa10 6f 20 6e 6f 74 20 77 72 69 74 65 20 74 68 69 73  o not write this
1fa20 20 70 61 67 65 20 61 6e 64 20 74 68 65 20 73 69   page and the si
1fa30 7a 65 20 6f 66 20 74 68 65 20 66 69 6c 65 0a 20  ze of the file. 
1fa40 20 20 20 20 20 2a 2a 20 6f 6e 20 74 68 65 20 64       ** on the d
1fa50 69 73 6b 20 65 6e 64 73 20 75 70 20 62 65 69 6e  isk ends up bein
1fa60 67 20 74 6f 6f 20 73 6d 61 6c 6c 2c 20 74 68 61  g too small, tha
1fa70 74 20 63 61 6e 20 6c 65 61 64 20 74 6f 20 64 61  t can lead to da
1fa80 74 61 62 61 73 65 0a 20 20 20 20 20 20 2a 2a 20  tabase.      ** 
1fa90 63 6f 72 72 75 70 74 69 6f 6e 20 64 75 72 69 6e  corruption durin
1faa0 67 20 74 68 65 20 6e 65 78 74 20 74 72 61 6e 73  g the next trans
1fab0 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 2a 2f  action..      */
1fac0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1fad0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 44    PAGERTRACE3("D
1fae0 4f 4e 54 5f 57 52 49 54 45 20 70 61 67 65 20 25  ONT_WRITE page %
1faf0 64 20 6f 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d  d of %d\n", pPg-
1fb00 3e 70 67 6e 6f 2c 20 50 41 47 45 52 49 44 28 70  >pgno, PAGERID(p
1fb10 50 61 67 65 72 29 29 3b 0a 20 20 20 20 20 20 49  Pager));.      I
1fb20 4f 54 52 41 43 45 28 28 22 43 4c 45 41 4e 20 25  OTRACE(("CLEAN %
1fb30 70 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  p %d\n", pPager,
1fb40 20 70 50 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 20   pPg->pgno)).   
1fb50 20 20 20 6d 61 6b 65 43 6c 65 61 6e 28 70 50 67     makeClean(pPg
1fb60 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
1fb70 5f 43 48 45 43 4b 5f 50 41 47 45 53 0a 20 20 20  _CHECK_PAGES.   
1fb80 20 20 20 70 50 67 2d 3e 70 61 67 65 48 61 73 68     pPg->pageHash
1fb90 20 3d 20 70 61 67 65 72 5f 70 61 67 65 68 61 73   = pager_pagehas
1fba0 68 28 70 50 67 29 3b 0a 23 65 6e 64 69 66 0a 20  h(pPg);.#endif. 
1fbb0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
1fbc0 2a 20 41 20 63 61 6c 6c 20 74 6f 20 74 68 69 73  * A call to this
1fbd0 20 72 6f 75 74 69 6e 65 20 74 65 6c 6c 73 20 74   routine tells t
1fbe0 68 65 20 70 61 67 65 72 20 74 68 61 74 20 69 66  he pager that if
1fbf0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 6f 63 63 75   a rollback occu
1fc00 72 73 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  rs,.** it is not
1fc10 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 72 65   necessary to re
1fc20 73 74 6f 72 65 20 74 68 65 20 64 61 74 61 20 6f  store the data o
1fc30 6e 20 74 68 65 20 67 69 76 65 6e 20 70 61 67 65  n the given page
1fc40 2e 20 20 54 68 69 73 0a 2a 2a 20 6d 65 61 6e 73  .  This.** means
1fc50 20 74 68 61 74 20 74 68 65 20 70 61 67 65 72 20   that the pager 
1fc60 64 6f 65 73 20 6e 6f 74 20 68 61 76 65 20 74 6f  does not have to
1fc70 20 72 65 63 6f 72 64 20 74 68 65 20 67 69 76 65   record the give
1fc80 6e 20 70 61 67 65 20 69 6e 20 74 68 65 0a 2a 2a  n page in the.**
1fc90 20 72 6f 6c 6c 62 61 63 6b 20 6a 6f 75 72 6e 61   rollback journa
1fca0 6c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 68  l..**.** If we h
1fcb0 61 76 65 20 6e 6f 74 20 79 65 74 20 61 63 74 75  ave not yet actu
1fcc0 61 6c 6c 79 20 72 65 61 64 20 74 68 65 20 63 6f  ally read the co
1fcd0 6e 74 65 6e 74 20 6f 66 20 74 68 69 73 20 70 61  ntent of this pa
1fce0 67 65 20 28 69 66 0a 2a 2a 20 74 68 65 20 50 67  ge (if.** the Pg
1fcf0 48 64 72 2e 6e 65 65 64 52 65 61 64 20 66 6c 61  Hdr.needRead fla
1fd00 67 20 69 73 20 73 65 74 29 20 74 68 65 6e 20 74  g is set) then t
1fd10 68 69 73 20 72 6f 75 74 69 6e 65 20 61 63 74 73  his routine acts
1fd20 20 61 73 20 61 20 70 72 6f 6d 69 73 65 0a 2a 2a   as a promise.**
1fd30 20 74 68 61 74 20 77 65 20 77 69 6c 6c 20 6e 65   that we will ne
1fd40 76 65 72 20 6e 65 65 64 20 74 6f 20 72 65 61 64  ver need to read
1fd50 20 74 68 65 20 70 61 67 65 20 63 6f 6e 74 65 6e   the page conten
1fd60 74 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2e  t in the future.
1fd70 0a 2a 2a 20 73 6f 20 74 68 65 20 6e 65 65 64 52  .** so the needR
1fd80 65 61 64 20 66 6c 61 67 20 63 61 6e 20 62 65 20  ead flag can be 
1fd90 63 6c 65 61 72 65 64 20 61 74 20 74 68 69 73 20  cleared at this 
1fda0 70 6f 69 6e 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73  point..*/.void s
1fdb0 71 6c 69 74 65 33 50 61 67 65 72 44 6f 6e 74 52  qlite3PagerDontR
1fdc0 6f 6c 6c 62 61 63 6b 28 44 62 50 61 67 65 20 2a  ollback(DbPage *
1fdd0 70 50 67 29 7b 0a 20 20 50 61 67 65 72 20 2a 70  pPg){.  Pager *p
1fde0 50 61 67 65 72 20 3d 20 70 50 67 2d 3e 70 50 61  Pager = pPg->pPa
1fdf0 67 65 72 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  ger;..  assert( 
1fe00 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3e 3d 50  pPager->state>=P
1fe10 41 47 45 52 5f 52 45 53 45 52 56 45 44 20 29 3b  AGER_RESERVED );
1fe20 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e 6a  .  if( pPager->j
1fe30 6f 75 72 6e 61 6c 4f 70 65 6e 3d 3d 30 20 29 20  ournalOpen==0 ) 
1fe40 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 50  return;.  if( pP
1fe50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c 62 61 63  g->alwaysRollbac
1fe60 6b 20 7c 7c 20 70 50 61 67 65 72 2d 3e 61 6c 77  k || pPager->alw
1fe70 61 79 73 52 6f 6c 6c 62 61 63 6b 20 7c 7c 20 4d  aysRollback || M
1fe80 45 4d 44 42 20 29 20 72 65 74 75 72 6e 3b 0a 20  EMDB ) return;. 
1fe90 20 69 66 28 20 21 70 50 67 2d 3e 69 6e 4a 6f 75   if( !pPg->inJou
1fea0 72 6e 61 6c 20 26 26 20 28 69 6e 74 29 70 50 67  rnal && (int)pPg
1feb0 2d 3e 70 67 6e 6f 20 3c 3d 20 70 50 61 67 65 72  ->pgno <= pPager
1fec0 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 7b 0a  ->origDbSize ){.
1fed0 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
1fee0 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c 21 3d  er->aInJournal!=
1fef0 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d  0 );.    pPager-
1ff00 3e 61 49 6e 4a 6f 75 72 6e 61 6c 5b 70 50 67 2d  >aInJournal[pPg-
1ff10 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28  >pgno/8] |= 1<<(
1ff20 70 50 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20  pPg->pgno&7);.  
1ff30 20 20 70 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c    pPg->inJournal
1ff40 20 3d 20 31 3b 0a 20 20 20 20 70 50 67 2d 3e 6e   = 1;.    pPg->n
1ff50 65 65 64 52 65 61 64 20 3d 20 30 3b 0a 20 20 20  eedRead = 0;.   
1ff60 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d   if( pPager->stm
1ff70 74 49 6e 55 73 65 20 29 7b 0a 20 20 20 20 20 20  tInUse ){.      
1ff80 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 5b  pPager->aInStmt[
1ff90 70 50 67 2d 3e 70 67 6e 6f 2f 38 5d 20 7c 3d 20  pPg->pgno/8] |= 
1ffa0 31 3c 3c 28 70 50 67 2d 3e 70 67 6e 6f 26 37 29  1<<(pPg->pgno&7)
1ffb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 50 41 47 45  ;.    }.    PAGE
1ffc0 52 54 52 41 43 45 33 28 22 44 4f 4e 54 5f 52 4f  RTRACE3("DONT_RO
1ffd0 4c 4c 42 41 43 4b 20 70 61 67 65 20 25 64 20 6f  LLBACK page %d o
1ffe0 66 20 25 64 5c 6e 22 2c 20 70 50 67 2d 3e 70 67  f %d\n", pPg->pg
1fff0 6e 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67  no, PAGERID(pPag
20000 65 72 29 29 3b 0a 20 20 20 20 49 4f 54 52 41 43  er));.    IOTRAC
20010 45 28 28 22 47 41 52 42 41 47 45 20 25 70 20 25  E(("GARBAGE %p %
20020 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c 20 70 50  d\n", pPager, pP
20030 67 2d 3e 70 67 6e 6f 29 29 0a 20 20 7d 0a 20 20  g->pgno)).  }.  
20040 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  if( pPager->stmt
20050 49 6e 55 73 65 20 0a 20 20 20 26 26 20 21 70 61  InUse .   && !pa
20060 67 65 49 6e 53 74 61 74 65 6d 65 6e 74 28 70 50  geInStatement(pP
20070 67 29 20 0a 20 20 20 26 26 20 28 69 6e 74 29 70  g) .   && (int)p
20080 50 67 2d 3e 70 67 6e 6f 3c 3d 70 50 61 67 65 72  Pg->pgno<=pPager
20090 2d 3e 73 74 6d 74 53 69 7a 65 20 0a 20 20 29 7b  ->stmtSize .  ){
200a0 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
200b0 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c 20 28  ->inJournal || (
200c0 69 6e 74 29 70 50 67 2d 3e 70 67 6e 6f 3e 70 50  int)pPg->pgno>pP
200d0 61 67 65 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65  ager->origDbSize
200e0 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
200f0 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 21  pPager->aInStmt!
20100 3d 30 20 29 3b 0a 20 20 20 20 70 50 61 67 65 72  =0 );.    pPager
20110 2d 3e 61 49 6e 53 74 6d 74 5b 70 50 67 2d 3e 70  ->aInStmt[pPg->p
20120 67 6e 6f 2f 38 5d 20 7c 3d 20 31 3c 3c 28 70 50  gno/8] |= 1<<(pP
20130 67 2d 3e 70 67 6e 6f 26 37 29 3b 0a 20 20 7d 0a  g->pgno&7);.  }.
20140 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
20150 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
20160 20 74 6f 20 69 6e 63 72 65 6d 65 6e 74 20 74 68   to increment th
20170 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  e database file 
20180 63 68 61 6e 67 65 2d 63 6f 75 6e 74 65 72 2c 0a  change-counter,.
20190 2a 2a 20 73 74 6f 72 65 64 20 61 74 20 62 79 74  ** stored at byt
201a0 65 20 32 34 20 6f 66 20 74 68 65 20 70 61 67 65  e 24 of the page
201b0 72 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  r file..*/.stati
201c0 63 20 69 6e 74 20 70 61 67 65 72 5f 69 6e 63 72  c int pager_incr
201d0 5f 63 68 61 6e 67 65 63 6f 75 6e 74 65 72 28 50  _changecounter(P
201e0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
201f0 20 50 67 48 64 72 20 2a 70 50 67 48 64 72 3b 0a   PgHdr *pPgHdr;.
20200 20 20 75 33 32 20 63 68 61 6e 67 65 5f 63 6f 75    u32 change_cou
20210 6e 74 65 72 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  nter;.  int rc;.
20220 0a 20 20 69 66 28 20 21 70 50 61 67 65 72 2d 3e  .  if( !pPager->
20230 63 68 61 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20  changeCountDone 
20240 29 7b 0a 20 20 20 20 2f 2a 20 4f 70 65 6e 20 70  ){.    /* Open p
20250 61 67 65 20 31 20 6f 66 20 74 68 65 20 66 69 6c  age 1 of the fil
20260 65 20 66 6f 72 20 77 72 69 74 69 6e 67 2e 20 2a  e for writing. *
20270 2f 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  /.    rc = sqlit
20280 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67 65  e3PagerGet(pPage
20290 72 2c 20 31 2c 20 26 70 50 67 48 64 72 29 3b 0a  r, 1, &pPgHdr);.
202a0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
202b0 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72  TE_OK ) return r
202c0 63 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  c;.    rc = sqli
202d0 74 65 33 50 61 67 65 72 57 72 69 74 65 28 70 50  te3PagerWrite(pP
202e0 67 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72  gHdr);.    if( r
202f0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
20300 65 74 75 72 6e 20 72 63 3b 0a 20 20 0a 20 20 20  eturn rc;.  .   
20310 20 2f 2a 20 52 65 61 64 20 74 68 65 20 63 75 72   /* Read the cur
20320 72 65 6e 74 20 76 61 6c 75 65 20 61 74 20 62 79  rent value at by
20330 74 65 20 32 34 2e 20 2a 2f 0a 20 20 20 20 63 68  te 24. */.    ch
20340 61 6e 67 65 5f 63 6f 75 6e 74 65 72 20 3d 20 72  ange_counter = r
20350 65 74 72 69 65 76 65 33 32 62 69 74 73 28 70 50  etrieve32bits(pP
20360 67 48 64 72 2c 20 32 34 29 3b 0a 20 20 0a 20 20  gHdr, 24);.  .  
20370 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
20380 68 65 20 76 61 6c 75 65 20 6a 75 73 74 20 72 65  he value just re
20390 61 64 20 61 6e 64 20 77 72 69 74 65 20 69 74 20  ad and write it 
203a0 62 61 63 6b 20 74 6f 20 62 79 74 65 20 32 34 2e  back to byte 24.
203b0 20 2a 2f 0a 20 20 20 20 63 68 61 6e 67 65 5f 63   */.    change_c
203c0 6f 75 6e 74 65 72 2b 2b 3b 0a 20 20 20 20 70 75  ounter++;.    pu
203d0 74 33 32 62 69 74 73 28 28 28 63 68 61 72 2a 29  t32bits(((char*)
203e0 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
203f0 67 48 64 72 29 29 2b 32 34 2c 20 63 68 61 6e 67  gHdr))+24, chang
20400 65 5f 63 6f 75 6e 74 65 72 29 3b 0a 20 20 20 20  e_counter);.    
20410 2f 2a 20 52 65 6c 65 61 73 65 20 74 68 65 20 70  /* Release the p
20420 61 67 65 20 72 65 66 65 72 65 6e 63 65 2e 20 2a  age reference. *
20430 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 50 61 67  /.    sqlite3Pag
20440 65 72 55 6e 72 65 66 28 70 50 67 48 64 72 29 3b  erUnref(pPgHdr);
20450 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 63 68 61  .    pPager->cha
20460 6e 67 65 43 6f 75 6e 74 44 6f 6e 65 20 3d 20 31  ngeCountDone = 1
20470 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
20480 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
20490 2a 2a 20 53 79 6e 63 20 74 68 65 20 64 61 74 61  ** Sync the data
204a0 62 61 73 65 20 66 69 6c 65 20 66 6f 72 20 74 68  base file for th
204b0 65 20 70 61 67 65 72 20 70 50 61 67 65 72 2e 20  e pager pPager. 
204c0 7a 4d 61 73 74 65 72 20 70 6f 69 6e 74 73 20 74  zMaster points t
204d0 6f 20 74 68 65 20 6e 61 6d 65 0a 2a 2a 20 6f 66  o the name.** of
204e0 20 61 20 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61   a master journa
204f0 6c 20 66 69 6c 65 20 74 68 61 74 20 73 68 6f 75  l file that shou
20500 6c 64 20 62 65 20 77 72 69 74 74 65 6e 20 69 6e  ld be written in
20510 74 6f 20 74 68 65 20 69 6e 64 69 76 69 64 75 61  to the individua
20520 6c 0a 2a 2a 20 6a 6f 75 72 6e 61 6c 20 66 69 6c  l.** journal fil
20530 65 2e 20 7a 4d 61 73 74 65 72 20 6d 61 79 20 62  e. zMaster may b
20540 65 20 4e 55 4c 4c 2c 20 77 68 69 63 68 20 69 73  e NULL, which is
20550 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
20560 6e 6f 20 6d 61 73 74 65 72 0a 2a 2a 20 6a 6f 75  no master.** jou
20570 72 6e 61 6c 20 28 61 20 73 69 6e 67 6c 65 20 64  rnal (a single d
20580 61 74 61 62 61 73 65 20 74 72 61 6e 73 61 63 74  atabase transact
20590 69 6f 6e 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  ion)..**.** This
205a0 20 72 6f 75 74 69 6e 65 20 65 6e 73 75 72 65 73   routine ensures
205b0 20 74 68 61 74 20 74 68 65 20 6a 6f 75 72 6e 61   that the journa
205c0 6c 20 69 73 20 73 79 6e 63 65 64 2c 20 61 6c 6c  l is synced, all
205d0 20 64 69 72 74 79 20 70 61 67 65 73 20 77 72 69   dirty pages wri
205e0 74 74 65 6e 0a 2a 2a 20 74 6f 20 74 68 65 20 64  tten.** to the d
205f0 61 74 61 62 61 73 65 20 66 69 6c 65 20 61 6e 64  atabase file and
20600 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69   the database fi
20610 6c 65 20 73 79 6e 63 65 64 2e 20 54 68 65 20 6f  le synced. The o
20620 6e 6c 79 20 74 68 69 6e 67 20 74 68 61 74 0a 2a  nly thing that.*
20630 2a 20 72 65 6d 61 69 6e 73 20 74 6f 20 63 6f 6d  * remains to com
20640 6d 69 74 20 74 68 65 20 74 72 61 6e 73 61 63 74  mit the transact
20650 69 6f 6e 20 69 73 20 74 6f 20 64 65 6c 65 74 65  ion is to delete
20660 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c   the journal fil
20670 65 20 28 6f 72 0a 2a 2a 20 6d 61 73 74 65 72 20  e (or.** master 
20680 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 69 66 20  journal file if 
20690 73 70 65 63 69 66 69 65 64 29 2e 0a 2a 2a 0a 2a  specified)..**.*
206a0 2a 20 4e 6f 74 65 20 74 68 61 74 20 69 66 20 7a  * Note that if z
206b0 4d 61 73 74 65 72 3d 3d 4e 55 4c 4c 2c 20 74 68  Master==NULL, th
206c0 69 73 20 64 6f 65 73 20 6e 6f 74 20 6f 76 65 72  is does not over
206d0 77 72 69 74 65 20 61 20 70 72 65 76 69 6f 75 73  write a previous
206e0 20 76 61 6c 75 65 0a 2a 2a 20 70 61 73 73 65 64   value.** passed
206f0 20 74 6f 20 61 6e 20 73 71 6c 69 74 65 33 50 61   to an sqlite3Pa
20700 67 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e  gerCommitPhaseOn
20710 65 28 29 20 63 61 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  e() call..**.** 
20720 49 66 20 70 61 72 61 6d 65 74 65 72 20 6e 54 72  If parameter nTr
20730 75 6e 63 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c  unc is non-zero,
20740 20 74 68 65 6e 20 74 68 65 20 70 61 67 65 72 20   then the pager 
20750 66 69 6c 65 20 69 73 20 74 72 75 6e 63 61 74 65  file is truncate
20760 64 20 74 6f 0a 2a 2a 20 6e 54 72 75 6e 63 20 70  d to.** nTrunc p
20770 61 67 65 73 20 28 74 68 69 73 20 69 73 20 75 73  ages (this is us
20780 65 64 20 62 79 20 61 75 74 6f 2d 76 61 63 75 75  ed by auto-vacuu
20790 6d 20 64 61 74 61 62 61 73 65 73 29 2e 0a 2a 2f  m databases)..*/
207a0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
207b0 72 43 6f 6d 6d 69 74 50 68 61 73 65 4f 6e 65 28  rCommitPhaseOne(
207c0 50 61 67 65 72 20 2a 70 50 61 67 65 72 2c 20 63  Pager *pPager, c
207d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 61 73 74  onst char *zMast
207e0 65 72 2c 20 50 67 6e 6f 20 6e 54 72 75 6e 63 29  er, Pgno nTrunc)
207f0 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  {.  int rc = SQL
20800 49 54 45 5f 4f 4b 3b 0a 0a 20 20 50 41 47 45 52  ITE_OK;..  PAGER
20810 54 52 41 43 45 34 28 22 44 41 54 41 42 41 53 45  TRACE4("DATABASE
20820 20 53 59 4e 43 3a 20 46 69 6c 65 3d 25 73 20 7a   SYNC: File=%s z
20830 4d 61 73 74 65 72 3d 25 73 20 6e 54 72 75 6e 63  Master=%s nTrunc
20840 3d 25 64 5c 6e 22 2c 20 0a 20 20 20 20 20 20 70  =%d\n", .      p
20850 50 61 67 65 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65  Pager->zFilename
20860 2c 20 7a 4d 61 73 74 65 72 2c 20 6e 54 72 75 6e  , zMaster, nTrun
20870 63 29 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69  c);..  /* If thi
20880 73 20 69 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72  s is an in-memor
20890 79 20 64 62 2c 20 6f 72 20 6e 6f 20 70 61 67 65  y db, or no page
208a0 73 20 68 61 76 65 20 62 65 65 6e 20 77 72 69 74  s have been writ
208b0 74 65 6e 20 74 6f 2c 20 6f 72 20 74 68 69 73 0a  ten to, or this.
208c0 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 68 61    ** function ha
208d0 73 20 61 6c 72 65 61 64 79 20 62 65 65 6e 20 63  s already been c
208e0 61 6c 6c 65 64 2c 20 69 74 20 69 73 20 61 20 6e  alled, it is a n
208f0 6f 2d 6f 70 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  o-op..  */.  if(
20900 20 70 50 61 67 65 72 2d 3e 73 74 61 74 65 21 3d   pPager->state!=
20910 50 41 47 45 52 5f 53 59 4e 43 45 44 20 26 26 20  PAGER_SYNCED && 
20920 21 4d 45 4d 44 42 20 26 26 20 70 50 61 67 65 72  !MEMDB && pPager
20930 2d 3e 64 69 72 74 79 43 61 63 68 65 20 29 7b 0a  ->dirtyCache ){.
20940 20 20 20 20 50 67 48 64 72 20 2a 70 50 67 3b 0a      PgHdr *pPg;.
20950 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 67      assert( pPag
20960 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20  er->journalOpen 
20970 29 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 61 20  );..    /* If a 
20980 6d 61 73 74 65 72 20 6a 6f 75 72 6e 61 6c 20 66  master journal f
20990 69 6c 65 20 6e 61 6d 65 20 68 61 73 20 61 6c 72  ile name has alr
209a0 65 61 64 79 20 62 65 65 6e 20 77 72 69 74 74 65  eady been writte
209b0 6e 20 74 6f 20 74 68 65 0a 20 20 20 20 2a 2a 20  n to the.    ** 
209c0 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 2c 20 74 68  journal file, th
209d0 65 6e 20 6e 6f 20 73 79 6e 63 20 69 73 20 72 65  en no sync is re
209e0 71 75 69 72 65 64 2e 20 54 68 69 73 20 68 61 70  quired. This hap
209f0 70 65 6e 73 20 77 68 65 6e 20 69 74 20 69 73 0a  pens when it is.
20a00 20 20 20 20 2a 2a 20 77 72 69 74 74 65 6e 2c 20      ** written, 
20a10 74 68 65 6e 20 74 68 65 20 70 72 6f 63 65 73 73  then the process
20a20 20 66 61 69 6c 73 20 74 6f 20 75 70 67 72 61 64   fails to upgrad
20a30 65 20 66 72 6f 6d 20 61 20 52 45 53 45 52 56 45  e from a RESERVE
20a40 44 20 74 6f 20 61 6e 0a 20 20 20 20 2a 2a 20 45  D to an.    ** E
20a50 58 43 4c 55 53 49 56 45 20 6c 6f 63 6b 2e 20 54  XCLUSIVE lock. T
20a60 68 65 20 6e 65 78 74 20 74 69 6d 65 20 74 68 65  he next time the
20a70 20 70 72 6f 63 65 73 73 20 74 72 69 65 73 20 74   process tries t
20a80 6f 20 63 6f 6d 6d 69 74 20 74 68 65 0a 20 20 20  o commit the.   
20a90 20 2a 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   ** transaction 
20aa0 74 68 65 20 6d 2d 6a 20 6e 61 6d 65 20 77 69 6c  the m-j name wil
20ab0 6c 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62  l have already b
20ac0 65 65 6e 20 77 72 69 74 74 65 6e 2e 0a 20 20 20  een written..   
20ad0 20 2a 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61   */.    if( !pPa
20ae0 67 65 72 2d 3e 73 65 74 4d 61 73 74 65 72 20 29  ger->setMaster )
20af0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 70 61 67  {.      rc = pag
20b00 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63 6f  er_incr_changeco
20b10 75 6e 74 65 72 28 70 50 61 67 65 72 29 3b 0a 20  unter(pPager);. 
20b20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
20b30 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79  ITE_OK ) goto sy
20b40 6e 63 5f 65 78 69 74 3b 0a 23 69 66 6e 64 65 66  nc_exit;.#ifndef
20b50 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
20b60 4f 56 41 43 55 55 4d 0a 20 20 20 20 20 20 69 66  OVACUUM.      if
20b70 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a 20  ( nTrunc!=0 ){. 
20b80 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68 69         /* If thi
20b90 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  s transaction ha
20ba0 73 20 6d 61 64 65 20 74 68 65 20 64 61 74 61 62  s made the datab
20bb0 61 73 65 20 73 6d 61 6c 6c 65 72 2c 20 74 68 65  ase smaller, the
20bc0 6e 20 61 6c 6c 20 70 61 67 65 73 0a 20 20 20 20  n all pages.    
20bd0 20 20 20 20 2a 2a 20 62 65 69 6e 67 20 64 69 73      ** being dis
20be0 63 61 72 64 65 64 20 62 79 20 74 68 65 20 74 72  carded by the tr
20bf0 75 6e 63 61 74 69 6f 6e 20 6d 75 73 74 20 62 65  uncation must be
20c00 20 77 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20   written to the 
20c10 6a 6f 75 72 6e 61 6c 0a 20 20 20 20 20 20 20 20  journal.        
20c20 2a 2a 20 66 69 6c 65 2e 0a 20 20 20 20 20 20 20  ** file..       
20c30 20 2a 2f 0a 20 20 20 20 20 20 20 20 50 67 6e 6f   */.        Pgno
20c40 20 69 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   i;.        int 
20c50 69 53 6b 69 70 20 3d 20 50 41 47 45 52 5f 4d 4a  iSkip = PAGER_MJ
20c60 5f 50 47 4e 4f 28 70 50 61 67 65 72 29 3b 0a 20  _PGNO(pPager);. 
20c70 20 20 20 20 20 20 20 66 6f 72 28 20 69 3d 6e 54         for( i=nT
20c80 72 75 6e 63 2b 31 3b 20 69 3c 3d 70 50 61 67 65  runc+1; i<=pPage
20c90 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 3b 20 69  r->origDbSize; i
20ca0 2b 2b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ++ ){.          
20cb0 69 66 28 20 21 28 70 50 61 67 65 72 2d 3e 61 49  if( !(pPager->aI
20cc0 6e 4a 6f 75 72 6e 61 6c 5b 69 2f 38 5d 20 26 20  nJournal[i/8] & 
20cd0 28 31 3c 3c 28 69 26 37 29 29 29 20 26 26 20 69  (1<<(i&7))) && i
20ce0 21 3d 69 53 6b 69 70 20 29 7b 0a 20 20 20 20 20  !=iSkip ){.     
20cf0 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
20d00 74 65 33 50 61 67 65 72 47 65 74 28 70 50 61 67  te3PagerGet(pPag
20d10 65 72 2c 20 69 2c 20 26 70 50 67 29 3b 0a 20 20  er, i, &pPg);.  
20d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
20d30 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f  !=SQLITE_OK ) go
20d40 74 6f 20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20  to sync_exit;.  
20d50 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
20d60 71 6c 69 74 65 33 50 61 67 65 72 57 72 69 74 65  qlite3PagerWrite
20d70 28 70 50 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (pPg);.         
20d80 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
20d90 6e 72 65 66 28 70 50 67 29 3b 0a 20 20 20 20 20  nref(pPg);.     
20da0 20 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53         if( rc!=S
20db0 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20dc0 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
20dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
20de0 20 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66   .      }.#endif
20df0 0a 20 20 20 20 20 20 72 63 20 3d 20 77 72 69 74  .      rc = writ
20e00 65 4d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 28 70  eMasterJournal(p
20e10 50 61 67 65 72 2c 20 7a 4d 61 73 74 65 72 29 3b  Pager, zMaster);
20e20 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20e30 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20e40 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 20  sync_exit;.     
20e50 20 72 63 20 3d 20 73 79 6e 63 4a 6f 75 72 6e 61   rc = syncJourna
20e60 6c 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20  l(pPager);.     
20e70 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20e80 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63 5f 65  OK ) goto sync_e
20e90 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 23 69 66 6e  xit;.    }..#ifn
20ea0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
20eb0 41 55 54 4f 56 41 43 55 55 4d 0a 20 20 20 20 69  AUTOVACUUM.    i
20ec0 66 28 20 6e 54 72 75 6e 63 21 3d 30 20 29 7b 0a  f( nTrunc!=0 ){.
20ed0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
20ee0 65 33 50 61 67 65 72 54 72 75 6e 63 61 74 65 28  e3PagerTruncate(
20ef0 70 50 61 67 65 72 2c 20 6e 54 72 75 6e 63 29 3b  pPager, nTrunc);
20f00 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
20f10 51 4c 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20  QLITE_OK ) goto 
20f20 73 79 6e 63 5f 65 78 69 74 3b 0a 20 20 20 20 7d  sync_exit;.    }
20f30 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a 20  .#endif..    /* 
20f40 57 72 69 74 65 20 61 6c 6c 20 64 69 72 74 79 20  Write all dirty 
20f50 70 61 67 65 73 20 74 6f 20 74 68 65 20 64 61 74  pages to the dat
20f60 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20  abase file */.  
20f70 20 20 70 50 67 20 3d 20 70 61 67 65 72 5f 67 65    pPg = pager_ge
20f80 74 5f 61 6c 6c 5f 64 69 72 74 79 5f 70 61 67 65  t_all_dirty_page
20f90 73 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 72  s(pPager);.    r
20fa0 63 20 3d 20 70 61 67 65 72 5f 77 72 69 74 65 5f  c = pager_write_
20fb0 70 61 67 65 6c 69 73 74 28 70 50 67 29 3b 0a 20  pagelist(pPg);. 
20fc0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
20fd0 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 73 79 6e 63  E_OK ) goto sync
20fe0 5f 65 78 69 74 3b 0a 20 20 20 20 70 50 61 67 65  _exit;.    pPage
20ff0 72 2d 3e 70 44 69 72 74 79 20 3d 20 30 3b 0a 0a  r->pDirty = 0;..
21000 20 20 20 20 2f 2a 20 53 79 6e 63 20 74 68 65 20      /* Sync the 
21010 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e 20 2a  database file. *
21020 2f 0a 20 20 20 20 69 66 28 20 21 70 50 61 67 65  /.    if( !pPage
21030 72 2d 3e 6e 6f 53 79 6e 63 20 29 7b 0a 20 20 20  r->noSync ){.   
21040 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f     rc = sqlite3O
21050 73 53 79 6e 63 28 70 50 61 67 65 72 2d 3e 66 64  sSync(pPager->fd
21060 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
21070 49 4f 54 52 41 43 45 28 28 22 44 42 53 59 4e 43  IOTRACE(("DBSYNC
21080 20 25 70 5c 6e 22 2c 20 70 50 61 67 65 72 29 29   %p\n", pPager))
21090 0a 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  ..    pPager->st
210a0 61 74 65 20 3d 20 50 41 47 45 52 5f 53 59 4e 43  ate = PAGER_SYNC
210b0 45 44 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ED;.  }else if( 
210c0 4d 45 4d 44 42 20 26 26 20 6e 54 72 75 6e 63 21  MEMDB && nTrunc!
210d0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  =0 ){.    rc = s
210e0 71 6c 69 74 65 33 50 61 67 65 72 54 72 75 6e 63  qlite3PagerTrunc
210f0 61 74 65 28 70 50 61 67 65 72 2c 20 6e 54 72 75  ate(pPager, nTru
21100 6e 63 29 3b 0a 20 20 7d 0a 0a 73 79 6e 63 5f 65  nc);.  }..sync_e
21110 78 69 74 3a 0a 20 20 69 66 28 20 72 63 3d 3d 53  xit:.  if( rc==S
21120 51 4c 49 54 45 5f 49 4f 45 52 52 5f 42 4c 4f 43  QLITE_IOERR_BLOC
21130 4b 45 44 20 29 7b 0a 20 20 20 20 2f 2a 20 70 61  KED ){.    /* pa
21140 67 65 72 5f 69 6e 63 72 5f 63 68 61 6e 67 65 63  ger_incr_changec
21150 6f 75 6e 74 65 72 28 29 20 6d 61 79 20 61 74 74  ounter() may att
21160 65 6d 70 74 20 74 6f 20 6f 62 74 61 69 6e 20 61  empt to obtain a
21170 6e 20 65 78 63 6c 75 73 69 76 65 0a 20 20 20 20  n exclusive.    
21180 20 2a 20 6c 6f 63 6b 20 74 6f 20 73 70 69 6c 6c   * lock to spill
21190 20 74 68 65 20 63 61 63 68 65 20 61 6e 64 20 72   the cache and r
211a0 65 74 75 72 6e 20 49 4f 45 52 52 5f 42 4c 4f 43  eturn IOERR_BLOC
211b0 4b 45 44 2e 20 42 75 74 20 73 69 6e 63 65 20 0a  KED. But since .
211c0 20 20 20 20 20 2a 20 74 68 65 72 65 20 69 73 20       * there is 
211d0 6e 6f 20 63 68 61 6e 63 65 20 74 68 65 20 63 61  no chance the ca
211e0 63 68 65 20 69 73 20 69 6e 63 6f 6e 73 69 73 74  che is inconsist
211f0 65 6e 74 2c 20 69 74 27 73 0a 20 20 20 20 20 2a  ent, it's.     *
21200 20 62 65 74 74 65 72 20 74 6f 20 72 65 74 75 72   better to retur
21210 6e 20 53 51 4c 49 54 45 5f 42 55 53 59 2e 0a 20  n SQLITE_BUSY.. 
21220 20 20 20 20 2a 2f 0a 20 20 20 20 72 63 20 3d 20      */.    rc = 
21230 53 51 4c 49 54 45 5f 42 55 53 59 3b 0a 20 20 7d  SQLITE_BUSY;.  }
21240 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
21250 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 6d 69 74 20 61  ../*.** Commit a
21260 6c 6c 20 63 68 61 6e 67 65 73 20 74 6f 20 74 68  ll changes to th
21270 65 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 72  e database and r
21280 65 6c 65 61 73 65 20 74 68 65 20 77 72 69 74 65  elease the write
21290 20 6c 6f 63 6b 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   lock..**.** If 
212a0 74 68 65 20 63 6f 6d 6d 69 74 20 66 61 69 6c 73  the commit fails
212b0 20 66 6f 72 20 61 6e 79 20 72 65 61 73 6f 6e 2c   for any reason,
212c0 20 61 20 72 6f 6c 6c 62 61 63 6b 20 61 74 74 65   a rollback atte
212d0 6d 70 74 20 69 73 20 6d 61 64 65 0a 2a 2a 20 61  mpt is made.** a
212e0 6e 64 20 61 6e 20 65 72 72 6f 72 20 63 6f 64 65  nd an error code
212f0 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 49   is returned.  I
21300 66 20 74 68 65 20 63 6f 6d 6d 69 74 20 77 6f 72  f the commit wor
21310 6b 65 64 2c 20 53 51 4c 49 54 45 5f 4f 4b 0a 2a  ked, SQLITE_OK.*
21320 2a 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  * is returned..*
21330 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67  /.int sqlite3Pag
21340 65 72 43 6f 6d 6d 69 74 50 68 61 73 65 54 77 6f  erCommitPhaseTwo
21350 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
21360 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 50 67 48  .  int rc;.  PgH
21370 64 72 20 2a 70 50 67 3b 0a 0a 20 20 69 66 28 20  dr *pPg;..  if( 
21380 70 50 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 20  pPager->errCode 
21390 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 50  ){.    return pP
213a0 61 67 65 72 2d 3e 65 72 72 43 6f 64 65 3b 0a 20  ager->errCode;. 
213b0 20 7d 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d   }.  if( pPager-
213c0 3e 73 74 61 74 65 3c 50 41 47 45 52 5f 52 45 53  >state<PAGER_RES
213d0 45 52 56 45 44 20 29 7b 0a 20 20 20 20 72 65 74  ERVED ){.    ret
213e0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
213f0 3b 0a 20 20 7d 0a 20 20 50 41 47 45 52 54 52 41  ;.  }.  PAGERTRA
21400 43 45 32 28 22 43 4f 4d 4d 49 54 20 25 64 5c 6e  CE2("COMMIT %d\n
21410 22 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  ", PAGERID(pPage
21420 72 29 29 3b 0a 20 20 69 66 28 20 4d 45 4d 44 42  r));.  if( MEMDB
21430 20 29 7b 0a 20 20 20 20 70 50 67 20 3d 20 70 61   ){.    pPg = pa
21440 67 65 72 5f 67 65 74 5f 61 6c 6c 5f 64 69 72 74  ger_get_all_dirt
21450 79 5f 70 61 67 65 73 28 70 50 61 67 65 72 29 3b  y_pages(pPager);
21460 0a 20 20 20 20 77 68 69 6c 65 28 20 70 50 67 20  .    while( pPg 
21470 29 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f  ){.      PgHisto
21480 72 79 20 2a 70 48 69 73 74 20 3d 20 50 47 48 44  ry *pHist = PGHD
21490 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
214a0 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 63 6c  Pager);.      cl
214b0 65 61 72 48 69 73 74 6f 72 79 28 70 48 69 73 74  earHistory(pHist
214c0 29 3b 0a 20 20 20 20 20 20 70 50 67 2d 3e 64 69  );.      pPg->di
214d0 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 20 20 70  rty = 0;.      p
214e0 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20  Pg->inJournal = 
214f0 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74 2d 3e  0;.      pHist->
21500 69 6e 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20  inStmt = 0;.    
21510 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63 20    pPg->needSync 
21520 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
21530 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
21540 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
21550 20 30 3b 0a 20 20 20 20 20 20 70 50 67 20 3d 20   0;.      pPg = 
21560 70 50 67 2d 3e 70 44 69 72 74 79 3b 0a 20 20 20  pPg->pDirty;.   
21570 20 7d 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70   }.    pPager->p
21580 44 69 72 74 79 20 3d 20 30 3b 0a 23 69 66 6e 64  Dirty = 0;.#ifnd
21590 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 66 6f  ef NDEBUG.    fo
215a0 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
215b0 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
215c0 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
215d0 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48     PgHistory *pH
215e0 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48  ist = PGHDR_TO_H
215f0 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72 29  IST(pPg, pPager)
21600 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
21610 21 70 50 67 2d 3e 61 6c 77 61 79 73 52 6f 6c 6c  !pPg->alwaysRoll
21620 62 61 63 6b 20 29 3b 0a 20 20 20 20 20 20 61 73  back );.      as
21630 73 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 4f  sert( !pHist->pO
21640 72 69 67 20 29 3b 0a 20 20 20 20 20 20 61 73 73  rig );.      ass
21650 65 72 74 28 20 21 70 48 69 73 74 2d 3e 70 53 74  ert( !pHist->pSt
21660 6d 74 20 29 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  mt );.    }.#end
21670 69 66 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70  if.    pPager->p
21680 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 70 50  Stmt = 0;.    pP
21690 61 67 65 72 2d 3e 73 74 61 74 65 20 3d 20 50 41  ager->state = PA
216a0 47 45 52 5f 53 48 41 52 45 44 3b 0a 20 20 20 20  GER_SHARED;.    
216b0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
216c0 3b 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  ;.  }.  assert( 
216d0 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f  pPager->journalO
216e0 70 65 6e 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  pen || !pPager->
216f0 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
21700 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
21710 73 74 61 74 65 3d 3d 50 41 47 45 52 5f 53 59 4e  state==PAGER_SYN
21720 43 45 44 20 7c 7c 20 21 70 50 61 67 65 72 2d 3e  CED || !pPager->
21730 64 69 72 74 79 43 61 63 68 65 20 29 3b 0a 20 20  dirtyCache );.  
21740 72 63 20 3d 20 70 61 67 65 72 5f 65 6e 64 5f 74  rc = pager_end_t
21750 72 61 6e 73 61 63 74 69 6f 6e 28 70 50 61 67 65  ransaction(pPage
21760 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 61 67  r);.  return pag
21770 65 72 5f 65 72 72 6f 72 28 70 50 61 67 65 72 2c  er_error(pPager,
21780 20 72 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   rc);.}../*.** R
21790 6f 6c 6c 62 61 63 6b 20 61 6c 6c 20 63 68 61 6e  ollback all chan
217a0 67 65 73 2e 20 20 54 68 65 20 64 61 74 61 62 61  ges.  The databa
217b0 73 65 20 66 61 6c 6c 73 20 62 61 63 6b 20 74 6f  se falls back to
217c0 20 50 41 47 45 52 5f 53 48 41 52 45 44 20 6d 6f   PAGER_SHARED mo
217d0 64 65 2e 0a 2a 2a 20 41 6c 6c 20 69 6e 2d 6d 65  de..** All in-me
217e0 6d 6f 72 79 20 63 61 63 68 65 20 70 61 67 65 73  mory cache pages
217f0 20 72 65 76 65 72 74 20 74 6f 20 74 68 65 69 72   revert to their
21800 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 20 63   original data c
21810 6f 6e 74 65 6e 74 73 2e 0a 2a 2a 20 54 68 65 20  ontents..** The 
21820 6a 6f 75 72 6e 61 6c 20 69 73 20 64 65 6c 65 74  journal is delet
21830 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ed..**.** This r
21840 6f 75 74 69 6e 65 20 63 61 6e 6e 6f 74 20 66 61  outine cannot fa
21850 69 6c 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f  il unless some o
21860 74 68 65 72 20 70 72 6f 63 65 73 73 20 69 73 20  ther process is 
21870 6e 6f 74 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a  not following.**
21880 20 74 68 65 20 63 6f 72 72 65 63 74 20 6c 6f 63   the correct loc
21890 6b 69 6e 67 20 70 72 6f 74 6f 63 6f 6c 20 6f 72  king protocol or
218a0 20 75 6e 6c 65 73 73 20 73 6f 6d 65 20 6f 74 68   unless some oth
218b0 65 72 0a 2a 2a 20 70 72 6f 63 65 73 73 20 69 73  er.** process is
218c0 20 77 72 69 74 69 6e 67 20 74 72 61 73 68 20 69   writing trash i
218d0 6e 74 6f 20 74 68 65 20 6a 6f 75 72 6e 61 6c 20  nto the journal 
218e0 66 69 6c 65 20 28 53 51 4c 49 54 45 5f 43 4f 52  file (SQLITE_COR
218f0 52 55 50 54 29 20 6f 72 0a 2a 2a 20 75 6e 6c 65  RUPT) or.** unle
21900 73 73 20 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f  ss a prior mallo
21910 63 28 29 20 66 61 69 6c 65 64 20 28 53 51 4c 49  c() failed (SQLI
21920 54 45 5f 4e 4f 4d 45 4d 29 2e 20 20 41 70 70 72  TE_NOMEM).  Appr
21930 6f 70 72 69 61 74 65 20 65 72 72 6f 72 0a 2a 2a  opriate error.**
21940 20 63 6f 64 65 73 20 61 72 65 20 72 65 74 75 72   codes are retur
21950 6e 65 64 20 66 6f 72 20 61 6c 6c 20 74 68 65 73  ned for all thes
21960 65 20 6f 63 63 61 73 69 6f 6e 73 2e 20 20 4f 74  e occasions.  Ot
21970 68 65 72 77 69 73 65 2c 0a 2a 2a 20 53 51 4c 49  herwise,.** SQLI
21980 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
21990 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
219a0 33 50 61 67 65 72 52 6f 6c 6c 62 61 63 6b 28 50  3PagerRollback(P
219b0 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20  ager *pPager){. 
219c0 20 69 6e 74 20 72 63 3b 0a 20 20 50 41 47 45 52   int rc;.  PAGER
219d0 54 52 41 43 45 32 28 22 52 4f 4c 4c 42 41 43 4b  TRACE2("ROLLBACK
219e0 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28   %d\n", PAGERID(
219f0 70 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20  pPager));.  if( 
21a00 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 50 67 48  MEMDB ){.    PgH
21a10 64 72 20 2a 70 3b 0a 20 20 20 20 66 6f 72 28 70  dr *p;.    for(p
21a20 3d 70 50 61 67 65 72 2d 3e 70 41 6c 6c 3b 20 70  =pPager->pAll; p
21a30 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 41 6c 6c 29  ; p=p->pNextAll)
21a40 7b 0a 20 20 20 20 20 20 50 67 48 69 73 74 6f 72  {.      PgHistor
21a50 79 20 2a 70 48 69 73 74 3b 0a 20 20 20 20 20 20  y *pHist;.      
21a60 61 73 73 65 72 74 28 20 21 70 2d 3e 61 6c 77 61  assert( !p->alwa
21a70 79 73 52 6f 6c 6c 62 61 63 6b 20 29 3b 0a 20 20  ysRollback );.  
21a80 20 20 20 20 69 66 28 20 21 70 2d 3e 64 69 72 74      if( !p->dirt
21a90 79 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  y ){.        ass
21aa0 65 72 74 28 20 21 28 28 50 67 48 69 73 74 6f 72  ert( !((PgHistor
21ab0 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f 48 49 53  y *)PGHDR_TO_HIS
21ac0 54 28 70 2c 20 70 50 61 67 65 72 29 29 2d 3e 70  T(p, pPager))->p
21ad0 4f 72 69 67 20 29 3b 0a 20 20 20 20 20 20 20 20  Orig );.        
21ae0 61 73 73 65 72 74 28 20 21 28 28 50 67 48 69 73  assert( !((PgHis
21af0 74 6f 72 79 20 2a 29 50 47 48 44 52 5f 54 4f 5f  tory *)PGHDR_TO_
21b00 48 49 53 54 28 70 2c 20 70 50 61 67 65 72 29 29  HIST(p, pPager))
21b10 2d 3e 70 53 74 6d 74 20 29 3b 0a 20 20 20 20 20  ->pStmt );.     
21b20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
21b30 20 20 20 7d 0a 0a 20 20 20 20 20 20 70 48 69 73     }..      pHis
21b40 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f 48 49 53  t = PGHDR_TO_HIS
21b50 54 28 70 2c 20 70 50 61 67 65 72 29 3b 0a 20 20  T(p, pPager);.  
21b60 20 20 20 20 69 66 28 20 70 48 69 73 74 2d 3e 70      if( pHist->p
21b70 4f 72 69 67 20 29 7b 0a 20 20 20 20 20 20 20 20  Orig ){.        
21b80 6d 65 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f  memcpy(PGHDR_TO_
21b90 44 41 54 41 28 70 29 2c 20 70 48 69 73 74 2d 3e  DATA(p), pHist->
21ba0 70 4f 72 69 67 2c 20 70 50 61 67 65 72 2d 3e 70  pOrig, pPager->p
21bb0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
21bc0 20 20 50 41 47 45 52 54 52 41 43 45 33 28 22 52    PAGERTRACE3("R
21bd0 4f 4c 4c 42 41 43 4b 2d 50 41 47 45 20 25 64 20  OLLBACK-PAGE %d 
21be0 6f 66 20 25 64 5c 6e 22 2c 20 70 2d 3e 70 67 6e  of %d\n", p->pgn
21bf0 6f 2c 20 50 41 47 45 52 49 44 28 70 50 61 67 65  o, PAGERID(pPage
21c00 72 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r));.      }else
21c10 7b 0a 20 20 20 20 20 20 20 20 50 41 47 45 52 54  {.        PAGERT
21c20 52 41 43 45 33 28 22 50 41 47 45 20 25 64 20 69  RACE3("PAGE %d i
21c30 73 20 63 6c 65 61 6e 20 6f 6e 20 25 64 5c 6e 22  s clean on %d\n"
21c40 2c 20 70 2d 3e 70 67 6e 6f 2c 20 50 41 47 45 52  , p->pgno, PAGER
21c50 49 44 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20  ID(pPager));.   
21c60 20 20 20 7d 0a 20 20 20 20 20 20 63 6c 65 61 72     }.      clear
21c70 48 69 73 74 6f 72 79 28 70 48 69 73 74 29 3b 0a  History(pHist);.
21c80 20 20 20 20 20 20 70 2d 3e 64 69 72 74 79 20 3d        p->dirty =
21c90 20 30 3b 0a 20 20 20 20 20 20 70 2d 3e 69 6e 4a   0;.      p->inJ
21ca0 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20 20 20 20  ournal = 0;.    
21cb0 20 20 70 48 69 73 74 2d 3e 69 6e 53 74 6d 74 20    pHist->inStmt 
21cc0 3d 20 30 3b 0a 20 20 20 20 20 20 70 48 69 73 74  = 0;.      pHist
21cd0 2d 3e 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48  ->pPrevStmt = pH
21ce0 69 73 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d  ist->pNextStmt =
21cf0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50   0;.      if( pP
21d00 61 67 65 72 2d 3e 78 52 65 69 6e 69 74 65 72 20  ager->xReiniter 
21d10 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 67 65  ){.        pPage
21d20 72 2d 3e 78 52 65 69 6e 69 74 65 72 28 70 2c 20  r->xReiniter(p, 
21d30 70 50 61 67 65 72 2d 3e 70 61 67 65 53 69 7a 65  pPager->pageSize
21d40 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
21d50 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 44 69  .    pPager->pDi
21d60 72 74 79 20 3d 20 30 3b 0a 20 20 20 20 70 50 61  rty = 0;.    pPa
21d70 67 65 72 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a  ger->pStmt = 0;.
21d80 20 20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69      pPager->dbSi
21d90 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e 6f 72 69  ze = pPager->ori
21da0 67 44 62 53 69 7a 65 3b 0a 20 20 20 20 70 61 67  gDbSize;.    pag
21db0 65 72 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68  er_truncate_cach
21dc0 65 28 70 50 61 67 65 72 29 3b 0a 20 20 20 20 70  e(pPager);.    p
21dd0 50 61 67 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65  Pager->stmtInUse
21de0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
21df0 2d 3e 73 74 61 74 65 20 3d 20 50 41 47 45 52 5f  ->state = PAGER_
21e00 53 48 41 52 45 44 3b 0a 20 20 20 20 72 65 74 75  SHARED;.    retu
21e10 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20  rn SQLITE_OK;.  
21e20 7d 0a 0a 20 20 69 66 28 20 21 70 50 61 67 65 72  }..  if( !pPager
21e30 2d 3e 64 69 72 74 79 43 61 63 68 65 20 7c 7c 20  ->dirtyCache || 
21e40 21 70 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c  !pPager->journal
21e50 4f 70 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d  Open ){.    rc =
21e60 20 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73   pager_end_trans
21e70 61 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a  action(pPager);.
21e80 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
21e90 20 7d 0a 0a 20 20 69 66 28 20 70 50 61 67 65 72   }..  if( pPager
21ea0 2d 3e 65 72 72 43 6f 64 65 20 26 26 20 70 50 61  ->errCode && pPa
21eb0 67 65 72 2d 3e 65 72 72 43 6f 64 65 21 3d 53 51  ger->errCode!=SQ
21ec0 4c 49 54 45 5f 46 55 4c 4c 20 29 7b 0a 20 20 20  LITE_FULL ){.   
21ed0 20 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61   if( pPager->sta
21ee0 74 65 3e 3d 50 41 47 45 52 5f 45 58 43 4c 55 53  te>=PAGER_EXCLUS
21ef0 49 56 45 20 29 7b 0a 20 20 20 20 20 20 70 61 67  IVE ){.      pag
21f00 65 72 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67  er_playback(pPag
21f10 65 72 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  er, 0);.    }.  
21f20 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
21f30 3e 65 72 72 43 6f 64 65 3b 0a 20 20 7d 0a 20 20  >errCode;.  }.  
21f40 69 66 28 20 70 50 61 67 65 72 2d 3e 73 74 61 74  if( pPager->stat
21f50 65 3d 3d 50 41 47 45 52 5f 52 45 53 45 52 56 45  e==PAGER_RESERVE
21f60 44 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  D ){.    int rc2
21f70 3b 0a 20 20 20 20 72 63 20 3d 20 70 61 67 65 72  ;.    rc = pager
21f80 5f 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72  _playback(pPager
21f90 2c 20 30 29 3b 0a 20 20 20 20 72 63 32 20 3d 20  , 0);.    rc2 = 
21fa0 70 61 67 65 72 5f 65 6e 64 5f 74 72 61 6e 73 61  pager_end_transa
21fb0 63 74 69 6f 6e 28 70 50 61 67 65 72 29 3b 0a 20  ction(pPager);. 
21fc0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
21fd0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63  E_OK ){.      rc
21fe0 20 3d 20 72 63 32 3b 0a 20 20 20 20 7d 0a 20 20   = rc2;.    }.  
21ff0 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
22000 70 61 67 65 72 5f 70 6c 61 79 62 61 63 6b 28 70  pager_playback(p
22010 50 61 67 65 72 2c 20 30 29 3b 0a 20 20 7d 0a 20  Pager, 0);.  }. 
22020 20 2f 2a 20 70 61 67 65 72 5f 72 65 73 65 74 28   /* pager_reset(
22030 70 50 61 67 65 72 29 3b 20 2a 2f 0a 20 20 70 50  pPager); */.  pP
22040 61 67 65 72 2d 3e 64 62 53 69 7a 65 20 3d 20 2d  ager->dbSize = -
22050 31 3b 0a 0a 20 20 2f 2a 20 49 66 20 61 6e 20 65  1;..  /* If an e
22060 72 72 6f 72 20 6f 63 63 75 72 73 20 64 75 72 69  rror occurs duri
22070 6e 67 20 61 20 52 4f 4c 4c 42 41 43 4b 2c 20 77  ng a ROLLBACK, w
22080 65 20 63 61 6e 20 6e 6f 20 6c 6f 6e 67 65 72 20  e can no longer 
22090 74 72 75 73 74 20 74 68 65 20 70 61 67 65 72 0a  trust the pager.
220a0 20 20 2a 2a 20 63 61 63 68 65 2e 20 53 6f 20 63    ** cache. So c
220b0 61 6c 6c 20 70 61 67 65 72 5f 65 72 72 6f 72 28  all pager_error(
220c0 29 20 6f 6e 20 74 68 65 20 77 61 79 20 6f 75 74  ) on the way out
220d0 20 74 6f 20 6d 61 6b 65 20 61 6e 79 20 65 72 72   to make any err
220e0 6f 72 20 0a 20 20 2a 2a 20 70 65 72 73 69 73 74  or .  ** persist
220f0 65 6e 74 2e 0a 20 20 2a 2f 0a 20 20 72 65 74 75  ent..  */.  retu
22100 72 6e 20 70 61 67 65 72 5f 65 72 72 6f 72 28 70  rn pager_error(p
22110 50 61 67 65 72 2c 20 72 63 29 3b 0a 7d 0a 0a 2f  Pager, rc);.}../
22120 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
22130 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
22140 20 66 69 6c 65 20 69 73 20 6f 70 65 6e 65 64 20   file is opened 
22150 72 65 61 64 2d 6f 6e 6c 79 2e 20 20 52 65 74 75  read-only.  Retu
22160 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69 66 20 74  rn FALSE.** if t
22170 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 28  he database is (
22180 69 6e 20 74 68 65 6f 72 79 29 20 77 72 69 74 61  in theory) writa
22190 62 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ble..*/.int sqli
221a0 74 65 33 50 61 67 65 72 49 73 72 65 61 64 6f 6e  te3PagerIsreadon
221b0 6c 79 28 50 61 67 65 72 20 2a 70 50 61 67 65 72  ly(Pager *pPager
221c0 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67  ){.  return pPag
221d0 65 72 2d 3e 72 65 61 64 4f 6e 6c 79 3b 0a 7d 0a  er->readOnly;.}.
221e0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
221f0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  e number of refe
22200 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70 61  rences to the pa
22210 67 65 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ger..*/.int sqli
22220 74 65 33 50 61 67 65 72 52 65 66 63 6f 75 6e 74  te3PagerRefcount
22230 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b  (Pager *pPager){
22240 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72  .  return pPager
22250 2d 3e 6e 52 65 66 3b 0a 7d 0a 0a 23 69 66 64 65  ->nRef;.}..#ifde
22260 66 20 53 51 4c 49 54 45 5f 54 45 53 54 0a 2f 2a  f SQLITE_TEST./*
22270 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
22280 20 69 73 20 75 73 65 64 20 66 6f 72 20 74 65 73   is used for tes
22290 74 69 6e 67 20 61 6e 64 20 61 6e 61 6c 79 73 69  ting and analysi
222a0 73 20 6f 6e 6c 79 2e 0a 2a 2f 0a 69 6e 74 20 2a  s only..*/.int *
222b0 73 71 6c 69 74 65 33 50 61 67 65 72 53 74 61 74  sqlite3PagerStat
222c0 73 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  s(Pager *pPager)
222d0 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20 61  {.  static int a
222e0 5b 31 31 5d 3b 0a 20 20 61 5b 30 5d 20 3d 20 70  [11];.  a[0] = p
222f0 50 61 67 65 72 2d 3e 6e 52 65 66 3b 0a 20 20 61  Pager->nRef;.  a
22300 5b 31 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 50  [1] = pPager->nP
22310 61 67 65 3b 0a 20 20 61 5b 32 5d 20 3d 20 70 50  age;.  a[2] = pP
22320 61 67 65 72 2d 3e 6d 78 50 61 67 65 3b 0a 20 20  ager->mxPage;.  
22330 61 5b 33 5d 20 3d 20 70 50 61 67 65 72 2d 3e 64  a[3] = pPager->d
22340 62 53 69 7a 65 3b 0a 20 20 61 5b 34 5d 20 3d 20  bSize;.  a[4] = 
22350 70 50 61 67 65 72 2d 3e 73 74 61 74 65 3b 0a 20  pPager->state;. 
22360 20 61 5b 35 5d 20 3d 20 70 50 61 67 65 72 2d 3e   a[5] = pPager->
22370 65 72 72 43 6f 64 65 3b 0a 20 20 61 5b 36 5d 20  errCode;.  a[6] 
22380 3d 20 70 50 61 67 65 72 2d 3e 6e 48 69 74 3b 0a  = pPager->nHit;.
22390 20 20 61 5b 37 5d 20 3d 20 70 50 61 67 65 72 2d    a[7] = pPager-
223a0 3e 6e 4d 69 73 73 3b 0a 20 20 61 5b 38 5d 20 3d  >nMiss;.  a[8] =
223b0 20 30 3b 20 20 2f 2a 20 55 73 65 64 20 74 6f 20   0;  /* Used to 
223c0 62 65 20 70 50 61 67 65 72 2d 3e 6e 4f 76 66 6c  be pPager->nOvfl
223d0 20 2a 2f 0a 20 20 61 5b 39 5d 20 3d 20 70 50 61   */.  a[9] = pPa
223e0 67 65 72 2d 3e 6e 52 65 61 64 3b 0a 20 20 61 5b  ger->nRead;.  a[
223f0 31 30 5d 20 3d 20 70 50 61 67 65 72 2d 3e 6e 57  10] = pPager->nW
22400 72 69 74 65 3b 0a 20 20 72 65 74 75 72 6e 20 61  rite;.  return a
22410 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
22420 2a 20 53 65 74 20 74 68 65 20 73 74 61 74 65 6d  * Set the statem
22430 65 6e 74 20 72 6f 6c 6c 62 61 63 6b 20 70 6f 69  ent rollback poi
22440 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
22450 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 62 65  outine should be
22460 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74 68 65   called with the
22470 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 6a 6f 75   transaction jou
22480 72 6e 61 6c 20 61 6c 72 65 61 64 79 0a 2a 2a 20  rnal already.** 
22490 6f 70 65 6e 2e 20 20 41 20 6e 65 77 20 73 74 61  open.  A new sta
224a0 74 65 6d 65 6e 74 20 6a 6f 75 72 6e 61 6c 20 69  tement journal i
224b0 73 20 63 72 65 61 74 65 64 20 74 68 61 74 20 63  s created that c
224c0 61 6e 20 62 65 20 75 73 65 64 20 74 6f 20 72 6f  an be used to ro
224d0 6c 6c 62 61 63 6b 0a 2a 2a 20 63 68 61 6e 67 65  llback.** change
224e0 73 20 6f 66 20 61 20 73 69 6e 67 6c 65 20 53 51  s of a single SQ
224f0 4c 20 63 6f 6d 6d 61 6e 64 20 77 69 74 68 69 6e  L command within
22500 20 61 20 6c 61 72 67 65 72 20 74 72 61 6e 73 61   a larger transa
22510 63 74 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ction..*/.int sq
22520 6c 69 74 65 33 50 61 67 65 72 53 74 6d 74 42 65  lite3PagerStmtBe
22530 67 69 6e 28 50 61 67 65 72 20 2a 70 50 61 67 65  gin(Pager *pPage
22540 72 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  r){.  int rc;.  
22550 61 73 73 65 72 74 28 20 21 70 50 61 67 65 72 2d  assert( !pPager-
22560 3e 73 74 6d 74 49 6e 55 73 65 20 29 3b 0a 20 20  >stmtInUse );.  
22570 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e  assert( pPager->
22580 73 74 61 74 65 3e 3d 50 41 47 45 52 5f 53 48 41  state>=PAGER_SHA
22590 52 45 44 20 29 3b 0a 20 20 61 73 73 65 72 74 28  RED );.  assert(
225a0 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65 3e   pPager->dbSize>
225b0 3d 30 20 29 3b 0a 20 20 50 41 47 45 52 54 52 41  =0 );.  PAGERTRA
225c0 43 45 32 28 22 53 54 4d 54 2d 42 45 47 49 4e 20  CE2("STMT-BEGIN 
225d0 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70  %d\n", PAGERID(p
225e0 50 61 67 65 72 29 29 3b 0a 20 20 69 66 28 20 4d  Pager));.  if( M
225f0 45 4d 44 42 20 29 7b 0a 20 20 20 20 70 50 61 67  EMDB ){.    pPag
22600 65 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20  er->stmtInUse = 
22610 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
22620 74 6d 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72  tmtSize = pPager
22630 2d 3e 64 62 53 69 7a 65 3b 0a 20 20 20 20 72 65  ->dbSize;.    re
22640 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
22650 20 20 7d 0a 20 20 69 66 28 20 21 70 50 61 67 65    }.  if( !pPage
22660 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 70 65 6e 20 29  r->journalOpen )
22670 7b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73 74  {.    pPager->st
22680 6d 74 41 75 74 6f 6f 70 65 6e 20 3d 20 31 3b 0a  mtAutoopen = 1;.
22690 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
226a0 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 61 73 73 65  E_OK;.  }.  asse
226b0 72 74 28 20 70 50 61 67 65 72 2d 3e 6a 6f 75 72  rt( pPager->jour
226c0 6e 61 6c 4f 70 65 6e 20 29 3b 0a 20 20 70 50 61  nalOpen );.  pPa
226d0 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20 73  ger->aInStmt = s
226e0 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 50 61  qliteMalloc( pPa
226f0 67 65 72 2d 3e 64 62 53 69 7a 65 2f 38 20 2b 20  ger->dbSize/8 + 
22700 31 20 29 3b 0a 20 20 69 66 28 20 70 50 61 67 65  1 );.  if( pPage
22710 72 2d 3e 61 49 6e 53 74 6d 74 3d 3d 30 20 29 7b  r->aInStmt==0 ){
22720 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 4f  .    /* sqlite3O
22730 73 4c 6f 63 6b 28 70 50 61 67 65 72 2d 3e 66 64  sLock(pPager->fd
22740 2c 20 53 48 41 52 45 44 5f 4c 4f 43 4b 29 3b 20  , SHARED_LOCK); 
22750 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
22760 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
22770 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
22780 20 72 63 20 3d 20 73 71 6c 69 74 65 33 4f 73 46   rc = sqlite3OsF
22790 69 6c 65 53 69 7a 65 28 70 50 61 67 65 72 2d 3e  ileSize(pPager->
227a0 6a 66 64 2c 20 26 70 50 61 67 65 72 2d 3e 73 74  jfd, &pPager->st
227b0 6d 74 4a 53 69 7a 65 29 3b 0a 20 20 69 66 28 20  mtJSize);.  if( 
227c0 72 63 20 29 20 67 6f 74 6f 20 73 74 6d 74 5f 62  rc ) goto stmt_b
227d0 65 67 69 6e 5f 66 61 69 6c 65 64 3b 0a 20 20 61  egin_failed;.  a
227e0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 73  ssert( pPager->s
227f0 74 6d 74 4a 53 69 7a 65 20 3d 3d 20 70 50 61 67  tmtJSize == pPag
22800 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66 66 20 29  er->journalOff )
22810 3b 0a 23 65 6e 64 69 66 0a 20 20 70 50 61 67 65  ;.#endif.  pPage
22820 72 2d 3e 73 74 6d 74 4a 53 69 7a 65 20 3d 20 70  r->stmtJSize = p
22830 50 61 67 65 72 2d 3e 6a 6f 75 72 6e 61 6c 4f 66  Pager->journalOf
22840 66 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d  f;.  pPager->stm
22850 74 53 69 7a 65 20 3d 20 70 50 61 67 65 72 2d 3e  tSize = pPager->
22860 64 62 53 69 7a 65 3b 0a 20 20 70 50 61 67 65 72  dbSize;.  pPager
22870 2d 3e 73 74 6d 74 48 64 72 4f 66 66 20 3d 20 30  ->stmtHdrOff = 0
22880 3b 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74  ;.  pPager->stmt
22890 43 6b 73 75 6d 20 3d 20 70 50 61 67 65 72 2d 3e  Cksum = pPager->
228a0 63 6b 73 75 6d 49 6e 69 74 3b 0a 20 20 69 66 28  cksumInit;.  if(
228b0 20 21 70 50 61 67 65 72 2d 3e 73 74 6d 74 4f 70   !pPager->stmtOp
228c0 65 6e 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  en ){.    rc = s
228d0 71 6c 69 74 65 33 50 61 67 65 72 4f 70 65 6e 74  qlite3PagerOpent
228e0 65 6d 70 28 26 70 50 61 67 65 72 2d 3e 73 74 66  emp(&pPager->stf
228f0 64 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  d);.    if( rc )
22900 20 67 6f 74 6f 20 73 74 6d 74 5f 62 65 67 69 6e   goto stmt_begin
22910 5f 66 61 69 6c 65 64 3b 0a 20 20 20 20 70 50 61  _failed;.    pPa
22920 67 65 72 2d 3e 73 74 6d 74 4f 70 65 6e 20 3d 20  ger->stmtOpen = 
22930 31 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 73  1;.    pPager->s
22940 74 6d 74 4e 52 65 63 20 3d 20 30 3b 0a 20 20 7d  tmtNRec = 0;.  }
22950 0a 20 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 49  .  pPager->stmtI
22960 6e 55 73 65 20 3d 20 31 3b 0a 20 20 72 65 74 75  nUse = 1;.  retu
22970 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 0a  rn SQLITE_OK;. .
22980 73 74 6d 74 5f 62 65 67 69 6e 5f 66 61 69 6c 65  stmt_begin_faile
22990 64 3a 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d  d:.  if( pPager-
229a0 3e 61 49 6e 53 74 6d 74 20 29 7b 0a 20 20 20 20  >aInStmt ){.    
229b0 73 71 6c 69 74 65 46 72 65 65 28 70 50 61 67 65  sqliteFree(pPage
229c0 72 2d 3e 61 49 6e 53 74 6d 74 29 3b 0a 20 20 20  r->aInStmt);.   
229d0 20 70 50 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74   pPager->aInStmt
229e0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
229f0 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
22a00 43 6f 6d 6d 69 74 20 61 20 73 74 61 74 65 6d 65  Commit a stateme
22a10 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
22a20 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d 69  e3PagerStmtCommi
22a30 74 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  t(Pager *pPager)
22a40 7b 0a 20 20 69 66 28 20 70 50 61 67 65 72 2d 3e  {.  if( pPager->
22a50 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a 20 20 20  stmtInUse ){.   
22a60 20 50 67 48 64 72 20 2a 70 50 67 2c 20 2a 70 4e   PgHdr *pPg, *pN
22a70 65 78 74 3b 0a 20 20 20 20 50 41 47 45 52 54 52  ext;.    PAGERTR
22a80 41 43 45 32 28 22 53 54 4d 54 2d 43 4f 4d 4d 49  ACE2("STMT-COMMI
22a90 54 20 25 64 5c 6e 22 2c 20 50 41 47 45 52 49 44  T %d\n", PAGERID
22aa0 28 70 50 61 67 65 72 29 29 3b 0a 20 20 20 20 69  (pPager));.    i
22ab0 66 28 20 21 4d 45 4d 44 42 20 29 7b 0a 20 20 20  f( !MEMDB ){.   
22ac0 20 20 20 73 71 6c 69 74 65 33 4f 73 53 65 65 6b     sqlite3OsSeek
22ad0 28 70 50 61 67 65 72 2d 3e 73 74 66 64 2c 20 30  (pPager->stfd, 0
22ae0 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  );.      /* sqli
22af0 74 65 33 4f 73 54 72 75 6e 63 61 74 65 28 70 50  te3OsTruncate(pP
22b00 61 67 65 72 2d 3e 73 74 66 64 2c 20 30 29 3b 20  ager->stfd, 0); 
22b10 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46  */.      sqliteF
22b20 72 65 65 28 20 70 50 61 67 65 72 2d 3e 61 49 6e  ree( pPager->aIn
22b30 53 74 6d 74 20 29 3b 0a 20 20 20 20 20 20 70 50  Stmt );.      pP
22b40 61 67 65 72 2d 3e 61 49 6e 53 74 6d 74 20 3d 20  ager->aInStmt = 
22b50 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
22b60 20 20 20 20 66 6f 72 28 70 50 67 3d 70 50 61 67      for(pPg=pPag
22b70 65 72 2d 3e 70 53 74 6d 74 3b 20 70 50 67 3b 20  er->pStmt; pPg; 
22b80 70 50 67 3d 70 4e 65 78 74 29 7b 0a 20 20 20 20  pPg=pNext){.    
22b90 20 20 20 20 50 67 48 69 73 74 6f 72 79 20 2a 70      PgHistory *p
22ba0 48 69 73 74 20 3d 20 50 47 48 44 52 5f 54 4f 5f  Hist = PGHDR_TO_
22bb0 48 49 53 54 28 70 50 67 2c 20 70 50 61 67 65 72  HIST(pPg, pPager
22bc0 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 78 74  );.        pNext
22bd0 20 3d 20 70 48 69 73 74 2d 3e 70 4e 65 78 74 53   = pHist->pNextS
22be0 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 61 73 73  tmt;.        ass
22bf0 65 72 74 28 20 70 48 69 73 74 2d 3e 69 6e 53 74  ert( pHist->inSt
22c00 6d 74 20 29 3b 0a 20 20 20 20 20 20 20 20 70 48  mt );.        pH
22c10 69 73 74 2d 3e 69 6e 53 74 6d 74 20 3d 20 30 3b  ist->inStmt = 0;
22c20 0a 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e  .        pHist->
22c30 70 50 72 65 76 53 74 6d 74 20 3d 20 70 48 69 73  pPrevStmt = pHis
22c40 74 2d 3e 70 4e 65 78 74 53 74 6d 74 20 3d 20 30  t->pNextStmt = 0
22c50 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
22c60 46 72 65 65 28 70 48 69 73 74 2d 3e 70 53 74 6d  Free(pHist->pStm
22c70 74 29 3b 0a 20 20 20 20 20 20 20 20 70 48 69 73  t);.        pHis
22c80 74 2d 3e 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t->pStmt = 0;.  
22c90 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
22ca0 70 50 61 67 65 72 2d 3e 73 74 6d 74 4e 52 65 63  pPager->stmtNRec
22cb0 20 3d 20 30 3b 0a 20 20 20 20 70 50 61 67 65 72   = 0;.    pPager
22cc0 2d 3e 73 74 6d 74 49 6e 55 73 65 20 3d 20 30 3b  ->stmtInUse = 0;
22cd0 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 70 53 74  .    pPager->pSt
22ce0 6d 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 50  mt = 0;.  }.  pP
22cf0 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f 70  ager->stmtAutoop
22d00 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  en = 0;.  return
22d10 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f   SQLITE_OK;.}../
22d20 2a 0a 2a 2a 20 52 6f 6c 6c 62 61 63 6b 20 61 20  *.** Rollback a 
22d30 73 74 61 74 65 6d 65 6e 74 2e 0a 2a 2f 0a 69 6e  statement..*/.in
22d40 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 53 74  t sqlite3PagerSt
22d50 6d 74 52 6f 6c 6c 62 61 63 6b 28 50 61 67 65 72  mtRollback(Pager
22d60 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 69 6e 74   *pPager){.  int
22d70 20 72 63 3b 0a 20 20 69 66 28 20 70 50 61 67 65   rc;.  if( pPage
22d80 72 2d 3e 73 74 6d 74 49 6e 55 73 65 20 29 7b 0a  r->stmtInUse ){.
22d90 20 20 20 20 50 41 47 45 52 54 52 41 43 45 32 28      PAGERTRACE2(
22da0 22 53 54 4d 54 2d 52 4f 4c 4c 42 41 43 4b 20 25  "STMT-ROLLBACK %
22db0 64 5c 6e 22 2c 20 50 41 47 45 52 49 44 28 70 50  d\n", PAGERID(pP
22dc0 61 67 65 72 29 29 3b 0a 20 20 20 20 69 66 28 20  ager));.    if( 
22dd0 4d 45 4d 44 42 20 29 7b 0a 20 20 20 20 20 20 50  MEMDB ){.      P
22de0 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 20 20 20  gHdr *pPg;.     
22df0 20 50 67 48 69 73 74 6f 72 79 20 2a 70 48 69 73   PgHistory *pHis
22e00 74 3b 0a 20 20 20 20 20 20 66 6f 72 28 70 50 67  t;.      for(pPg
22e10 3d 70 50 61 67 65 72 2d 3e 70 53 74 6d 74 3b 20  =pPager->pStmt; 
22e20 70 50 67 3b 20 70 50 67 3d 70 48 69 73 74 2d 3e  pPg; pPg=pHist->
22e30 70 4e 65 78 74 53 74 6d 74 29 7b 0a 20 20 20 20  pNextStmt){.    
22e40 20 20 20 20 70 48 69 73 74 20 3d 20 50 47 48 44      pHist = PGHD
22e50 52 5f 54 4f 5f 48 49 53 54 28 70 50 67 2c 20 70  R_TO_HIST(pPg, p
22e60 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 20 20  Pager);.        
22e70 69 66 28 20 70 48 69 73 74 2d 3e 70 53 74 6d 74  if( pHist->pStmt
22e80 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6d 65   ){.          me
22e90 6d 63 70 79 28 50 47 48 44 52 5f 54 4f 5f 44 41  mcpy(PGHDR_TO_DA
22ea0 54 41 28 70 50 67 29 2c 20 70 48 69 73 74 2d 3e  TA(pPg), pHist->
22eb0 70 53 74 6d 74 2c 20 70 50 61 67 65 72 2d 3e 70  pStmt, pPager->p
22ec0 61 67 65 53 69 7a 65 29 3b 0a 20 20 20 20 20 20  ageSize);.      
22ed0 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
22ee0 48 69 73 74 2d 3e 70 53 74 6d 74 29 3b 0a 20 20  Hist->pStmt);.  
22ef0 20 20 20 20 20 20 20 20 70 48 69 73 74 2d 3e 70          pHist->p
22f00 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
22f10 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
22f20 20 20 70 50 61 67 65 72 2d 3e 64 62 53 69 7a 65    pPager->dbSize
22f30 20 3d 20 70 50 61 67 65 72 2d 3e 73 74 6d 74 53   = pPager->stmtS
22f40 69 7a 65 3b 0a 20 20 20 20 20 20 70 61 67 65 72  ize;.      pager
22f50 5f 74 72 75 6e 63 61 74 65 5f 63 61 63 68 65 28  _truncate_cache(
22f60 70 50 61 67 65 72 29 3b 0a 20 20 20 20 20 20 72  pPager);.      r
22f70 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20  c = SQLITE_OK;. 
22f80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
22f90 72 63 20 3d 20 70 61 67 65 72 5f 73 74 6d 74 5f  rc = pager_stmt_
22fa0 70 6c 61 79 62 61 63 6b 28 70 50 61 67 65 72 29  playback(pPager)
22fb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
22fc0 74 65 33 50 61 67 65 72 53 74 6d 74 43 6f 6d 6d  te3PagerStmtComm
22fd0 69 74 28 70 50 61 67 65 72 29 3b 0a 20 20 7d 65  it(pPager);.  }e
22fe0 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 53 51  lse{.    rc = SQ
22ff0 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 0a 20 20 70  LITE_OK;.  }.  p
23000 50 61 67 65 72 2d 3e 73 74 6d 74 41 75 74 6f 6f  Pager->stmtAutoo
23010 70 65 6e 20 3d 20 30 3b 0a 20 20 72 65 74 75 72  pen = 0;.  retur
23020 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
23030 65 74 75 72 6e 20 74 68 65 20 66 75 6c 6c 20 70  eturn the full p
23040 61 74 68 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  athname of the d
23050 61 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 2a 2f  atabase file..*/
23060 0a 63 6f 6e 73 74 20 63 68 61 72 20 2a 73 71 6c  .const char *sql
23070 69 74 65 33 50 61 67 65 72 46 69 6c 65 6e 61 6d  ite3PagerFilenam
23080 65 28 50 61 67 65 72 20 2a 70 50 61 67 65 72 29  e(Pager *pPager)
23090 7b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 67 65  {.  return pPage
230a0 72 2d 3e 7a 46 69 6c 65 6e 61 6d 65 3b 0a 7d 0a  r->zFilename;.}.
230b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
230c0 65 20 64 69 72 65 63 74 6f 72 79 20 6f 66 20 74  e directory of t
230d0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
230e0 2e 0a 2a 2f 0a 63 6f 6e 73 74 20 63 68 61 72 20  ..*/.const char 
230f0 2a 73 71 6c 69 74 65 33 50 61 67 65 72 44 69 72  *sqlite3PagerDir
23100 6e 61 6d 65 28 50 61 67 65 72 20 2a 70 50 61 67  name(Pager *pPag
23110 65 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 70 50  er){.  return pP
23120 61 67 65 72 2d 3e 7a 44 69 72 65 63 74 6f 72 79  ager->zDirectory
23130 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
23140 6e 20 74 68 65 20 66 75 6c 6c 20 70 61 74 68 6e  n the full pathn
23150 61 6d 65 20 6f 66 20 74 68 65 20 6a 6f 75 72 6e  ame of the journ
23160 61 6c 20 66 69 6c 65 2e 0a 2a 2f 0a 63 6f 6e 73  al file..*/.cons
23170 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 50  t char *sqlite3P
23180 61 67 65 72 4a 6f 75 72 6e 61 6c 6e 61 6d 65 28  agerJournalname(
23190 50 61 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a  Pager *pPager){.
231a0 20 20 72 65 74 75 72 6e 20 70 50 61 67 65 72 2d    return pPager-
231b0 3e 7a 4a 6f 75 72 6e 61 6c 3b 0a 7d 0a 0a 2f 2a  >zJournal;.}../*
231c0 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20  .** Return true 
231d0 69 66 20 66 73 79 6e 63 28 29 20 63 61 6c 6c 73  if fsync() calls
231e0 20 61 72 65 20 64 69 73 61 62 6c 65 64 20 66 6f   are disabled fo
231f0 72 20 74 68 69 73 20 70 61 67 65 72 2e 20 20 52  r this pager.  R
23200 65 74 75 72 6e 20 46 41 4c 53 45 0a 2a 2a 20 69  eturn FALSE.** i
23210 66 20 66 73 79 6e 63 28 29 73 20 61 72 65 20 65  f fsync()s are e
23220 78 65 63 75 74 65 64 20 6e 6f 72 6d 61 6c 6c 79  xecuted normally
23230 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
23240 50 61 67 65 72 4e 6f 73 79 6e 63 28 50 61 67 65  PagerNosync(Page
23250 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20 72 65  r *pPager){.  re
23260 74 75 72 6e 20 70 50 61 67 65 72 2d 3e 6e 6f 53  turn pPager->noS
23270 79 6e 63 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 53  ync;.}..#ifdef S
23280 51 4c 49 54 45 5f 48 41 53 5f 43 4f 44 45 43 0a  QLITE_HAS_CODEC.
23290 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 63 6f  /*.** Set the co
232a0 64 65 63 20 66 6f 72 20 74 68 69 73 20 70 61 67  dec for this pag
232b0 65 72 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  er.*/.void sqlit
232c0 65 33 50 61 67 65 72 53 65 74 43 6f 64 65 63 28  e3PagerSetCodec(
232d0 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65 72  .  Pager *pPager
232e0 2c 0a 20 20 76 6f 69 64 20 2a 28 2a 78 43 6f 64  ,.  void *(*xCod
232f0 65 63 29 28 76 6f 69 64 2a 2c 76 6f 69 64 2a 2c  ec)(void*,void*,
23300 50 67 6e 6f 2c 69 6e 74 29 2c 0a 20 20 76 6f 69  Pgno,int),.  voi
23310 64 20 2a 70 43 6f 64 65 63 41 72 67 0a 29 7b 0a  d *pCodecArg.){.
23320 20 20 70 50 61 67 65 72 2d 3e 78 43 6f 64 65 63    pPager->xCodec
23330 20 3d 20 78 43 6f 64 65 63 3b 0a 20 20 70 50 61   = xCodec;.  pPa
23340 67 65 72 2d 3e 70 43 6f 64 65 63 41 72 67 20 3d  ger->pCodecArg =
23350 20 70 43 6f 64 65 63 41 72 67 3b 0a 7d 0a 23 65   pCodecArg;.}.#e
23360 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
23370 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 4f 56 41  LITE_OMIT_AUTOVA
23380 43 55 55 4d 0a 2f 2a 0a 2a 2a 20 4d 6f 76 65 20  CUUM./*.** Move 
23390 74 68 65 20 70 61 67 65 20 70 50 67 20 74 6f 20  the page pPg to 
233a0 6c 6f 63 61 74 69 6f 6e 20 70 67 6e 6f 20 69 6e  location pgno in
233b0 20 74 68 65 20 66 69 6c 65 2e 20 0a 2a 2a 0a 2a   the file. .**.*
233c0 2a 20 54 68 65 72 65 20 6d 75 73 74 20 62 65 20  * There must be 
233d0 6e 6f 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  no references to
233e0 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69 6f   the page previo
233f0 75 73 6c 79 20 6c 6f 63 61 74 65 64 20 61 74 0a  usly located at.
23400 2a 2a 20 70 67 6e 6f 20 28 77 68 69 63 68 20 77  ** pgno (which w
23410 65 20 63 61 6c 6c 20 70 50 67 4f 6c 64 29 20 74  e call pPgOld) t
23420 68 6f 75 67 68 20 74 68 61 74 20 70 61 67 65 20  hough that page 
23430 69 73 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65  is allowed to be
23440 0a 2a 2a 20 69 6e 20 63 61 63 68 65 2e 20 20 49  .** in cache.  I
23450 66 20 74 68 65 20 70 61 67 65 20 70 72 65 76 69  f the page previ
23460 6f 75 73 20 6c 6f 63 61 74 65 64 20 61 74 20 70  ous located at p
23470 67 6e 6f 20 69 73 20 6e 6f 74 20 61 6c 72 65 61  gno is not alrea
23480 64 79 0a 2a 2a 20 69 6e 20 74 68 65 20 72 6f 6c  dy.** in the rol
23490 6c 62 61 63 6b 20 6a 6f 75 72 6e 61 6c 2c 20 69  lback journal, i
234a0 74 20 69 73 20 6e 6f 74 20 70 75 74 20 74 68 65  t is not put the
234b0 72 65 20 62 79 20 62 79 20 74 68 69 73 20 72 6f  re by by this ro
234c0 75 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 66  utine..**.** Ref
234d0 65 72 65 6e 63 65 73 20 74 6f 20 74 68 65 20 70  erences to the p
234e0 61 67 65 20 70 50 67 20 72 65 6d 61 69 6e 20 76  age pPg remain v
234f0 61 6c 69 64 2e 20 55 70 64 61 74 69 6e 67 20 61  alid. Updating a
23500 6e 79 0a 2a 2a 20 6d 65 74 61 2d 64 61 74 61 20  ny.** meta-data 
23510 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
23520 70 50 67 20 28 69 2e 65 2e 20 64 61 74 61 20 73  pPg (i.e. data s
23530 74 6f 72 65 64 20 69 6e 20 74 68 65 20 6e 45 78  tored in the nEx
23540 74 72 61 20 62 79 74 65 73 0a 2a 2a 20 61 6c 6c  tra bytes.** all
23550 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
23560 68 20 74 68 65 20 70 61 67 65 29 20 69 73 20 74  h the page) is t
23570 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74  he responsibilit
23580 79 20 6f 66 20 74 68 65 20 63 61 6c 6c 65 72 2e  y of the caller.
23590 0a 2a 2a 0a 2a 2a 20 41 20 74 72 61 6e 73 61 63  .**.** A transac
235a0 74 69 6f 6e 20 6d 75 73 74 20 62 65 20 61 63 74  tion must be act
235b0 69 76 65 20 77 68 65 6e 20 74 68 69 73 20 72 6f  ive when this ro
235c0 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 2e  utine is called.
235d0 20 49 74 20 75 73 65 64 20 74 6f 20 62 65 0a 2a   It used to be.*
235e0 2a 20 72 65 71 75 69 72 65 64 20 74 68 61 74 20  * required that 
235f0 61 20 73 74 61 74 65 6d 65 6e 74 20 74 72 61 6e  a statement tran
23600 73 61 63 74 69 6f 6e 20 77 61 73 20 6e 6f 74 20  saction was not 
23610 61 63 74 69 76 65 2c 20 62 75 74 20 74 68 69 73  active, but this
23620 20 72 65 73 74 72 69 63 74 69 6f 6e 0a 2a 2a 20   restriction.** 
23630 68 61 73 20 62 65 65 6e 20 72 65 6d 6f 76 65 64  has been removed
23640 20 28 43 52 45 41 54 45 20 49 4e 44 45 58 20 6e   (CREATE INDEX n
23650 65 65 64 73 20 74 6f 20 6d 6f 76 65 20 61 20 70  eeds to move a p
23660 61 67 65 20 77 68 65 6e 20 61 20 73 74 61 74 65  age when a state
23670 6d 65 6e 74 0a 2a 2a 20 74 72 61 6e 73 61 63 74  ment.** transact
23680 69 6f 6e 20 69 73 20 61 63 74 69 76 65 29 2e 0a  ion is active)..
23690 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61  */.int sqlite3Pa
236a0 67 65 72 4d 6f 76 65 70 61 67 65 28 50 61 67 65  gerMovepage(Page
236b0 72 20 2a 70 50 61 67 65 72 2c 20 44 62 50 61 67  r *pPager, DbPag
236c0 65 20 2a 70 50 67 2c 20 50 67 6e 6f 20 70 67 6e  e *pPg, Pgno pgn
236d0 6f 29 7b 0a 20 20 50 67 48 64 72 20 2a 70 50 67  o){.  PgHdr *pPg
236e0 4f 6c 64 3b 20 20 2f 2a 20 54 68 65 20 70 61 67  Old;  /* The pag
236f0 65 20 62 65 69 6e 67 20 6f 76 65 72 77 72 69 74  e being overwrit
23700 74 65 6e 2e 20 2a 2f 0a 20 20 69 6e 74 20 68 3b  ten. */.  int h;
23710 0a 20 20 50 67 6e 6f 20 6e 65 65 64 53 79 6e 63  .  Pgno needSync
23720 50 67 6e 6f 20 3d 20 30 3b 0a 0a 20 20 61 73 73  Pgno = 0;..  ass
23730 65 72 74 28 20 70 50 67 2d 3e 6e 52 65 66 3e 30  ert( pPg->nRef>0
23740 20 29 3b 0a 0a 20 20 50 41 47 45 52 54 52 41 43   );..  PAGERTRAC
23750 45 35 28 22 4d 4f 56 45 20 25 64 20 70 61 67 65  E5("MOVE %d page
23760 20 25 64 20 28 6e 65 65 64 53 79 6e 63 3d 25 64   %d (needSync=%d
23770 29 20 6d 6f 76 65 73 20 74 6f 20 25 64 5c 6e 22  ) moves to %d\n"
23780 2c 20 0a 20 20 20 20 20 20 50 41 47 45 52 49 44  , .      PAGERID
23790 28 70 50 61 67 65 72 29 2c 20 70 50 67 2d 3e 70  (pPager), pPg->p
237a0 67 6e 6f 2c 20 70 50 67 2d 3e 6e 65 65 64 53 79  gno, pPg->needSy
237b0 6e 63 2c 20 70 67 6e 6f 29 3b 0a 20 20 49 4f 54  nc, pgno);.  IOT
237c0 52 41 43 45 28 28 22 4d 4f 56 45 20 25 70 20 25  RACE(("MOVE %p %
237d0 64 20 25 64 5c 6e 22 2c 20 70 50 61 67 65 72 2c  d %d\n", pPager,
237e0 20 70 50 67 2d 3e 70 67 6e 6f 2c 20 70 67 6e 6f   pPg->pgno, pgno
237f0 29 29 0a 0a 20 20 70 61 67 65 72 5f 67 65 74 5f  ))..  pager_get_
23800 63 6f 6e 74 65 6e 74 28 70 50 67 29 3b 0a 20 20  content(pPg);.  
23810 69 66 28 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e  if( pPg->needSyn
23820 63 20 29 7b 0a 20 20 20 20 6e 65 65 64 53 79 6e  c ){.    needSyn
23830 63 50 67 6e 6f 20 3d 20 70 50 67 2d 3e 70 67 6e  cPgno = pPg->pgn
23840 6f 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  o;.    assert( p
23850 50 67 2d 3e 69 6e 4a 6f 75 72 6e 61 6c 20 7c 7c  Pg->inJournal ||
23860 20 28 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65   (int)pgno>pPage
23870 72 2d 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b  r->origDbSize );
23880 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 50 67  .    assert( pPg
23890 2d 3e 64 69 72 74 79 20 29 3b 0a 20 20 20 20 61  ->dirty );.    a
238a0 73 73 65 72 74 28 20 70 50 61 67 65 72 2d 3e 6e  ssert( pPager->n
238b0 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 7d 0a 0a  eedSync );.  }..
238c0 20 20 2f 2a 20 55 6e 6c 69 6e 6b 20 70 50 67 20    /* Unlink pPg 
238d0 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 2d 63  from it's hash-c
238e0 68 61 69 6e 20 2a 2f 0a 20 20 75 6e 6c 69 6e 6b  hain */.  unlink
238f0 48 61 73 68 43 68 61 69 6e 28 70 50 61 67 65 72  HashChain(pPager
23900 2c 20 70 50 67 29 3b 0a 0a 20 20 2f 2a 20 49 66  , pPg);..  /* If
23910 20 74 68 65 20 63 61 63 68 65 20 63 6f 6e 74 61   the cache conta
23920 69 6e 73 20 61 20 70 61 67 65 20 77 69 74 68 20  ins a page with 
23930 70 61 67 65 2d 6e 75 6d 62 65 72 20 70 67 6e 6f  page-number pgno
23940 2c 20 72 65 6d 6f 76 65 20 69 74 0a 20 20 2a 2a  , remove it.  **
23950 20 66 72 6f 6d 20 69 74 27 73 20 68 61 73 68 20   from it's hash 
23960 63 68 61 69 6e 2e 20 41 6c 73 6f 2c 20 69 66 20  chain. Also, if 
23970 74 68 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79  the PgHdr.needSy
23980 6e 63 20 77 61 73 20 73 65 74 20 66 6f 72 20 0a  nc was set for .
23990 20 20 2a 2a 20 70 61 67 65 20 70 67 6e 6f 20 62    ** page pgno b
239a0 65 66 6f 72 65 20 74 68 65 20 27 6d 6f 76 65 27  efore the 'move'
239b0 20 6f 70 65 72 61 74 69 6f 6e 2c 20 69 74 20 6e   operation, it n
239c0 65 65 64 73 20 74 6f 20 62 65 20 72 65 74 61 69  eeds to be retai
239d0 6e 65 64 20 0a 20 20 2a 2a 20 66 6f 72 20 74 68  ned .  ** for th
239e0 65 20 70 61 67 65 20 6d 6f 76 65 64 20 74 68 65  e page moved the
239f0 72 65 2e 0a 20 20 2a 2f 0a 20 20 70 50 67 2d 3e  re..  */.  pPg->
23a00 6e 65 65 64 53 79 6e 63 20 3d 20 30 3b 0a 20 20  needSync = 0;.  
23a10 70 50 67 4f 6c 64 20 3d 20 70 61 67 65 72 5f 6c  pPgOld = pager_l
23a20 6f 6f 6b 75 70 28 70 50 61 67 65 72 2c 20 70 67  ookup(pPager, pg
23a30 6e 6f 29 3b 0a 20 20 69 66 28 20 70 50 67 4f 6c  no);.  if( pPgOl
23a40 64 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  d ){.    assert(
23a50 20 70 50 67 4f 6c 64 2d 3e 6e 52 65 66 3d 3d 30   pPgOld->nRef==0
23a60 20 29 3b 0a 20 20 20 20 75 6e 6c 69 6e 6b 48 61   );.    unlinkHa
23a70 73 68 43 68 61 69 6e 28 70 50 61 67 65 72 2c 20  shChain(pPager, 
23a80 70 50 67 4f 6c 64 29 3b 0a 20 20 20 20 6d 61 6b  pPgOld);.    mak
23a90 65 43 6c 65 61 6e 28 70 50 67 4f 6c 64 29 3b 0a  eClean(pPgOld);.
23aa0 20 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e      pPg->needSyn
23ab0 63 20 3d 20 70 50 67 4f 6c 64 2d 3e 6e 65 65 64  c = pPgOld->need
23ac0 53 79 6e 63 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Sync;.  }else{. 
23ad0 20 20 20 70 50 67 2d 3e 6e 65 65 64 53 79 6e 63     pPg->needSync
23ae0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 0;.  }.  if( 
23af0 70 50 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e  pPager->aInJourn
23b00 61 6c 20 26 26 20 28 69 6e 74 29 70 67 6e 6f 3c  al && (int)pgno<
23b10 3d 70 50 61 67 65 72 2d 3e 6f 72 69 67 44 62 53  =pPager->origDbS
23b20 69 7a 65 20 29 7b 0a 20 20 20 20 70 50 67 2d 3e  ize ){.    pPg->
23b30 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 20 28 70 50  inJournal =  (pP
23b40 61 67 65 72 2d 3e 61 49 6e 4a 6f 75 72 6e 61 6c  ager->aInJournal
23b50 5b 70 67 6e 6f 2f 38 5d 20 26 20 28 31 3c 3c 28  [pgno/8] & (1<<(
23b60 70 67 6e 6f 26 37 29 29 29 21 3d 30 3b 0a 20 20  pgno&7)))!=0;.  
23b70 7d 65 6c 73 65 7b 0a 20 20 20 20 70 50 67 2d 3e  }else{.    pPg->
23b80 69 6e 4a 6f 75 72 6e 61 6c 20 3d 20 30 3b 0a 20  inJournal = 0;. 
23b90 20 20 20 61 73 73 65 72 74 28 20 70 50 67 2d 3e     assert( pPg->
23ba0 6e 65 65 64 53 79 6e 63 3d 3d 30 20 7c 7c 20 28  needSync==0 || (
23bb0 69 6e 74 29 70 67 6e 6f 3e 70 50 61 67 65 72 2d  int)pgno>pPager-
23bc0 3e 6f 72 69 67 44 62 53 69 7a 65 20 29 3b 0a 20  >origDbSize );. 
23bd0 20 7d 0a 0a 20 20 2f 2a 20 43 68 61 6e 67 65 20   }..  /* Change 
23be0 74 68 65 20 70 61 67 65 20 6e 75 6d 62 65 72 20  the page number 
23bf0 66 6f 72 20 70 50 67 20 61 6e 64 20 69 6e 73 65  for pPg and inse
23c00 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 6e  rt it into the n
23c10 65 77 20 68 61 73 68 2d 63 68 61 69 6e 2e 20 2a  ew hash-chain. *
23c20 2f 0a 20 20 61 73 73 65 72 74 28 20 70 67 6e 6f  /.  assert( pgno
23c30 21 3d 30 20 29 3b 0a 20 20 70 50 67 2d 3e 70 67  !=0 );.  pPg->pg
23c40 6e 6f 20 3d 20 70 67 6e 6f 3b 0a 20 20 68 20 3d  no = pgno;.  h =
23c50 20 70 67 6e 6f 20 26 20 28 70 50 61 67 65 72 2d   pgno & (pPager-
23c60 3e 6e 48 61 73 68 2d 31 29 3b 0a 20 20 69 66 28  >nHash-1);.  if(
23c70 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
23c80 5d 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ] ){.    assert(
23c90 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
23ca0 5d 2d 3e 70 50 72 65 76 48 61 73 68 3d 3d 30 20  ]->pPrevHash==0 
23cb0 29 3b 0a 20 20 20 20 70 50 61 67 65 72 2d 3e 61  );.    pPager->a
23cc0 48 61 73 68 5b 68 5d 2d 3e 70 50 72 65 76 48 61  Hash[h]->pPrevHa
23cd0 73 68 20 3d 20 70 50 67 3b 0a 20 20 7d 0a 20 20  sh = pPg;.  }.  
23ce0 70 50 67 2d 3e 70 4e 65 78 74 48 61 73 68 20 3d  pPg->pNextHash =
23cf0 20 70 50 61 67 65 72 2d 3e 61 48 61 73 68 5b 68   pPager->aHash[h
23d00 5d 3b 0a 20 20 70 50 61 67 65 72 2d 3e 61 48 61  ];.  pPager->aHa
23d10 73 68 5b 68 5d 20 3d 20 70 50 67 3b 0a 20 20 70  sh[h] = pPg;.  p
23d20 50 67 2d 3e 70 50 72 65 76 48 61 73 68 20 3d 20  Pg->pPrevHash = 
23d30 30 3b 0a 0a 20 20 6d 61 6b 65 44 69 72 74 79 28  0;..  makeDirty(
23d40 70 50 67 29 3b 0a 20 20 70 50 61 67 65 72 2d 3e  pPg);.  pPager->
23d50 64 69 72 74 79 43 61 63 68 65 20 3d 20 31 3b 0a  dirtyCache = 1;.
23d60 0a 20 20 69 66 28 20 6e 65 65 64 53 79 6e 63 50  .  if( needSyncP
23d70 67 6e 6f 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  gno ){.    /* If
23d80 20 6e 65 65 64 53 79 6e 63 50 67 6e 6f 20 69 73   needSyncPgno is
23d90 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74 68 65 6e 20   non-zero, then 
23da0 74 68 65 20 6a 6f 75 72 6e 61 6c 20 66 69 6c 65  the journal file
23db0 20 6e 65 65 64 73 20 74 6f 20 62 65 20 0a 20 20   needs to be .  
23dc0 20 20 2a 2a 20 73 79 6e 63 28 29 65 64 20 62 65    ** sync()ed be
23dd0 66 6f 72 65 20 61 6e 79 20 64 61 74 61 20 69 73  fore any data is
23de0 20 77 72 69 74 74 65 6e 20 74 6f 20 64 61 74 61   written to data
23df0 62 61 73 65 20 66 69 6c 65 20 70 61 67 65 20 6e  base file page n
23e00 65 65 64 53 79 6e 63 50 67 6e 6f 2e 0a 20 20 20  eedSyncPgno..   
23e10 20 2a 2a 20 43 75 72 72 65 6e 74 6c 79 2c 20 6e   ** Currently, n
23e20 6f 20 73 75 63 68 20 70 61 67 65 20 65 78 69 73  o such page exis
23e30 74 73 20 69 6e 20 74 68 65 20 70 61 67 65 2d 63  ts in the page-c
23e40 61 63 68 65 20 61 6e 64 20 74 68 65 20 0a 20 20  ache and the .  
23e50 20 20 2a 2a 20 50 61 67 65 72 2e 61 49 6e 4a 6f    ** Pager.aInJo
23e60 75 72 6e 61 6c 20 62 69 74 20 68 61 73 20 62 65  urnal bit has be
23e70 65 6e 20 73 65 74 2e 20 54 68 69 73 20 6e 65 65  en set. This nee
23e80 64 73 20 74 6f 20 62 65 20 72 65 6d 65 64 69 65  ds to be remedie
23e90 64 20 62 79 20 6c 6f 61 64 69 6e 67 0a 20 20 20  d by loading.   
23ea0 20 2a 2a 20 74 68 65 20 70 61 67 65 20 69 6e 74   ** the page int
23eb0 6f 20 74 68 65 20 70 61 67 65 72 2d 63 61 63 68  o the pager-cach
23ec0 65 20 61 6e 64 20 73 65 74 74 69 6e 67 20 74 68  e and setting th
23ed0 65 20 50 67 48 64 72 2e 6e 65 65 64 53 79 6e 63  e PgHdr.needSync
23ee0 20 66 6c 61 67 2e 0a 20 20 20 20 2a 2a 0a 20 20   flag..    **.  
23ef0 20 20 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33    ** The sqlite3
23f00 50 61 67 65 72 47 65 74 28 29 20 63 61 6c 6c 20  PagerGet() call 
23f10 6d 61 79 20 63 61 75 73 65 20 74 68 65 20 6a 6f  may cause the jo
23f20 75 72 6e 61 6c 20 74 6f 20 73 79 6e 63 2e 20 53  urnal to sync. S
23f30 6f 20 6d 61 6b 65 0a 20 20 20 20 2a 2a 20 73 75  o make.    ** su
23f40 72 65 20 74 68 65 20 50 61 67 65 72 2e 6e 65 65  re the Pager.nee
23f50 64 53 79 6e 63 20 66 6c 61 67 20 69 73 20 73 65  dSync flag is se
23f60 74 20 74 6f 6f 2e 0a 20 20 20 20 2a 2f 0a 20 20  t too..    */.  
23f70 20 20 69 6e 74 20 72 63 3b 0a 20 20 20 20 50 67    int rc;.    Pg
23f80 48 64 72 20 2a 70 50 67 48 64 72 3b 0a 20 20 20  Hdr *pPgHdr;.   
23f90 20 61 73 73 65 72 74 28 20 70 50 61 67 65 72 2d   assert( pPager-
23fa0 3e 6e 65 65 64 53 79 6e 63 20 29 3b 0a 20 20 20  >needSync );.   
23fb0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 50 61 67   rc = sqlite3Pag
23fc0 65 72 47 65 74 28 70 50 61 67 65 72 2c 20 6e 65  erGet(pPager, ne
23fd0 65 64 53 79 6e 63 50 67 6e 6f 2c 20 26 70 50 67  edSyncPgno, &pPg
23fe0 48 64 72 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Hdr);.    if( rc
23ff0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
24000 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 70 50 61  turn rc;.    pPa
24010 67 65 72 2d 3e 6e 65 65 64 53 79 6e 63 20 3d 20  ger->needSync = 
24020 31 3b 0a 20 20 20 20 70 50 67 48 64 72 2d 3e 6e  1;.    pPgHdr->n
24030 65 65 64 53 79 6e 63 20 3d 20 31 3b 0a 20 20 20  eedSync = 1;.   
24040 20 70 50 67 48 64 72 2d 3e 69 6e 4a 6f 75 72 6e   pPgHdr->inJourn
24050 61 6c 20 3d 20 31 3b 0a 20 20 20 20 6d 61 6b 65  al = 1;.    make
24060 44 69 72 74 79 28 70 50 67 48 64 72 29 3b 0a 20  Dirty(pPgHdr);. 
24070 20 20 20 73 71 6c 69 74 65 33 50 61 67 65 72 55     sqlite3PagerU
24080 6e 72 65 66 28 70 50 67 48 64 72 29 3b 0a 20 20  nref(pPgHdr);.  
24090 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  }..  return SQLI
240a0 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
240b0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
240c0 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 64  pointer to the d
240d0 61 74 61 20 66 6f 72 20 74 68 65 20 73 70 65 63  ata for the spec
240e0 69 66 69 65 64 20 70 61 67 65 2e 0a 2a 2f 0a 76  ified page..*/.v
240f0 6f 69 64 20 2a 73 71 6c 69 74 65 33 50 61 67 65  oid *sqlite3Page
24100 72 47 65 74 44 61 74 61 28 44 62 50 61 67 65 20  rGetData(DbPage 
24110 2a 70 50 67 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pPg){.  return 
24120 50 47 48 44 52 5f 54 4f 5f 44 41 54 41 28 70 50  PGHDR_TO_DATA(pP
24130 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  g);.}../*.** Ret
24140 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  urn a pointer to
24150 20 74 68 65 20 50 61 67 65 72 2e 6e 45 78 74 72   the Pager.nExtr
24160 61 20 62 79 74 65 73 20 6f 66 20 22 65 78 74 72  a bytes of "extr
24170 61 22 20 73 70 61 63 65 20 0a 2a 2a 20 61 6c 6c  a" space .** all
24180 6f 63 61 74 65 64 20 61 6c 6f 6e 67 20 77 69 74  ocated along wit
24190 68 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20  h the specified 
241a0 70 61 67 65 2e 0a 2a 2f 0a 76 6f 69 64 20 2a 73  page..*/.void *s
241b0 71 6c 69 74 65 33 50 61 67 65 72 47 65 74 45 78  qlite3PagerGetEx
241c0 74 72 61 28 44 62 50 61 67 65 20 2a 70 50 67 29  tra(DbPage *pPg)
241d0 7b 0a 20 20 50 61 67 65 72 20 2a 70 50 61 67 65  {.  Pager *pPage
241e0 72 20 3d 20 70 50 67 2d 3e 70 50 61 67 65 72 3b  r = pPg->pPager;
241f0 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 67 65  .  return (pPage
24200 72 3f 50 47 48 44 52 5f 54 4f 5f 45 58 54 52 41  r?PGHDR_TO_EXTRA
24210 28 70 50 67 2c 20 70 50 61 67 65 72 29 3a 30 29  (pPg, pPager):0)
24220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 74 2f 73  ;.}../*.** Get/s
24230 65 74 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d 6d  et the locking-m
24240 6f 64 65 20 66 6f 72 20 74 68 69 73 20 70 61 67  ode for this pag
24250 65 72 2e 20 50 61 72 61 6d 65 74 65 72 20 65 4d  er. Parameter eM
24260 6f 64 65 20 6d 75 73 74 20 62 65 20 6f 6e 65 0a  ode must be one.
24270 2a 2a 20 6f 66 20 50 41 47 45 52 5f 4c 4f 43 4b  ** of PAGER_LOCK
24280 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59 2c 20 50  INGMODE_QUERY, P
24290 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
242a0 5f 4e 4f 52 4d 41 4c 20 6f 72 20 0a 2a 2a 20 50  _NORMAL or .** P
242b0 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
242c0 5f 45 58 43 4c 55 53 49 56 45 2e 20 49 66 20 74  _EXCLUSIVE. If t
242d0 68 65 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  he parameter is 
242e0 6e 6f 74 20 5f 51 55 45 52 59 2c 20 74 68 65 6e  not _QUERY, then
242f0 0a 2a 2a 20 74 68 65 20 6c 6f 63 6b 69 6e 67 2d  .** the locking-
24300 6d 6f 64 65 20 69 73 20 73 65 74 20 74 6f 20 74  mode is set to t
24310 68 65 20 76 61 6c 75 65 20 73 70 65 63 69 66 69  he value specifi
24320 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
24330 74 75 72 6e 65 64 20 76 61 6c 75 65 20 69 73 20  turned value is 
24340 65 69 74 68 65 72 20 50 41 47 45 52 5f 4c 4f 43  either PAGER_LOC
24350 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 20  KINGMODE_NORMAL 
24360 6f 72 0a 2a 2a 20 50 41 47 45 52 5f 4c 4f 43 4b  or.** PAGER_LOCK
24370 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24380 45 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68  E, indicating th
24390 65 20 63 75 72 72 65 6e 74 20 28 70 6f 73 73 69  e current (possi
243a0 62 6c 79 20 75 70 64 61 74 65 64 29 0a 2a 2a 20  bly updated).** 
243b0 6c 6f 63 6b 69 6e 67 2d 6d 6f 64 65 2e 0a 2a 2f  locking-mode..*/
243c0 0a 69 6e 74 20 73 71 6c 69 74 65 33 50 61 67 65  .int sqlite3Page
243d0 72 4c 6f 63 6b 69 6e 67 4d 6f 64 65 28 50 61 67  rLockingMode(Pag
243e0 65 72 20 2a 70 50 61 67 65 72 2c 20 69 6e 74 20  er *pPager, int 
243f0 65 4d 6f 64 65 29 7b 0a 20 20 61 73 73 65 72 74  eMode){.  assert
24400 28 20 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c  ( eMode==PAGER_L
24410 4f 43 4b 49 4e 47 4d 4f 44 45 5f 51 55 45 52 59  OCKINGMODE_QUERY
24420 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
24430 65 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43  eMode==PAGER_LOC
24440 4b 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 0a  KINGMODE_NORMAL.
24450 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 65              || e
24460 4d 6f 64 65 3d 3d 50 41 47 45 52 5f 4c 4f 43 4b  Mode==PAGER_LOCK
24470 49 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56  INGMODE_EXCLUSIV
24480 45 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 50  E );.  assert( P
24490 41 47 45 52 5f 4c 4f 43 4b 49 4e 47 4d 4f 44 45  AGER_LOCKINGMODE
244a0 5f 51 55 45 52 59 3c 30 20 29 3b 0a 20 20 61 73  _QUERY<0 );.  as
244b0 73 65 72 74 28 20 50 41 47 45 52 5f 4c 4f 43 4b  sert( PAGER_LOCK
244c0 49 4e 47 4d 4f 44 45 5f 4e 4f 52 4d 41 4c 3e 3d  INGMODE_NORMAL>=
244d0 30 20 26 26 20 50 41 47 45 52 5f 4c 4f 43 4b 49  0 && PAGER_LOCKI
244e0 4e 47 4d 4f 44 45 5f 45 58 43 4c 55 53 49 56 45  NGMODE_EXCLUSIVE
244f0 3e 3d 30 20 29 3b 0a 20 20 69 66 28 20 65 4d 6f  >=0 );.  if( eMo
24500 64 65 3e 3d 30 20 26 26 20 21 70 50 61 67 65 72  de>=0 && !pPager
24510 2d 3e 74 65 6d 70 46 69 6c 65 20 29 7b 0a 20 20  ->tempFile ){.  
24520 20 20 70 50 61 67 65 72 2d 3e 65 78 63 6c 75 73    pPager->exclus
24530 69 76 65 4d 6f 64 65 20 3d 20 65 4d 6f 64 65 3b  iveMode = eMode;
24540 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28 69  .  }.  return (i
24550 6e 74 29 70 50 61 67 65 72 2d 3e 65 78 63 6c 75  nt)pPager->exclu
24560 73 69 76 65 4d 6f 64 65 3b 0a 7d 0a 0a 23 69 66  siveMode;.}..#if
24570 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
24580 44 45 42 55 47 29 20 7c 7c 20 64 65 66 69 6e 65  DEBUG) || define
24590 64 28 53 51 4c 49 54 45 5f 54 45 53 54 29 0a 2f  d(SQLITE_TEST)./
245a0 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
245b0 63 75 72 72 65 6e 74 20 73 74 61 74 65 20 6f 66  current state of
245c0 20 74 68 65 20 66 69 6c 65 20 6c 6f 63 6b 20 66   the file lock f
245d0 6f 72 20 74 68 65 20 67 69 76 65 6e 20 70 61 67  or the given pag
245e0 65 72 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  er..** The retur
245f0 6e 20 76 61 6c 75 65 20 69 73 20 6f 6e 65 20 6f  n value is one o
24600 66 20 4e 4f 5f 4c 4f 43 4b 2c 20 53 48 41 52 45  f NO_LOCK, SHARE
24610 44 5f 4c 4f 43 4b 2c 20 52 45 53 45 52 56 45 44  D_LOCK, RESERVED
24620 5f 4c 4f 43 4b 2c 0a 2a 2a 20 50 45 4e 44 49 4e  _LOCK,.** PENDIN
24630 47 5f 4c 4f 43 4b 2c 20 6f 72 20 45 58 43 4c 55  G_LOCK, or EXCLU
24640 53 49 56 45 5f 4c 4f 43 4b 2e 0a 2a 2f 0a 69 6e  SIVE_LOCK..*/.in
24650 74 20 73 71 6c 69 74 65 33 50 61 67 65 72 4c 6f  t sqlite3PagerLo
24660 63 6b 73 74 61 74 65 28 50 61 67 65 72 20 2a 70  ckstate(Pager *p
24670 50 61 67 65 72 29 7b 0a 20 20 72 65 74 75 72 6e  Pager){.  return
24680 20 73 71 6c 69 74 65 33 4f 73 4c 6f 63 6b 53 74   sqlite3OsLockSt
24690 61 74 65 28 70 50 61 67 65 72 2d 3e 66 64 29 3b  ate(pPager->fd);
246a0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65  .}.#endif..#ifde
246b0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 2f  f SQLITE_DEBUG./
246c0 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 6c 69 73  *.** Print a lis
246d0 74 69 6e 67 20 6f 66 20 61 6c 6c 20 72 65 66 65  ting of all refe
246e0 72 65 6e 63 65 64 20 70 61 67 65 73 20 61 6e 64  renced pages and
246f0 20 74 68 65 69 72 20 72 65 66 20 63 6f 75 6e 74   their ref count
24700 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
24710 33 50 61 67 65 72 52 65 66 64 75 6d 70 28 50 61  3PagerRefdump(Pa
24720 67 65 72 20 2a 70 50 61 67 65 72 29 7b 0a 20 20  ger *pPager){.  
24730 50 67 48 64 72 20 2a 70 50 67 3b 0a 20 20 66 6f  PgHdr *pPg;.  fo
24740 72 28 70 50 67 3d 70 50 61 67 65 72 2d 3e 70 41  r(pPg=pPager->pA
24750 6c 6c 3b 20 70 50 67 3b 20 70 50 67 3d 70 50 67  ll; pPg; pPg=pPg
24760 2d 3e 70 4e 65 78 74 41 6c 6c 29 7b 0a 20 20 20  ->pNextAll){.   
24770 20 69 66 28 20 70 50 67 2d 3e 6e 52 65 66 3c 3d   if( pPg->nRef<=
24780 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
24790 20 20 73 71 6c 69 74 65 33 44 65 62 75 67 50 72    sqlite3DebugPr
247a0 69 6e 74 66 28 22 50 41 47 45 20 25 33 64 20 61  intf("PAGE %3d a
247b0 64 64 72 3d 25 70 20 6e 52 65 66 3d 25 64 5c 6e  ddr=%p nRef=%d\n
247c0 22 2c 20 0a 20 20 20 20 20 20 20 70 50 67 2d 3e  ", .       pPg->
247d0 70 67 6e 6f 2c 20 50 47 48 44 52 5f 54 4f 5f 44  pgno, PGHDR_TO_D
247e0 41 54 41 28 70 50 67 29 2c 20 70 50 67 2d 3e 6e  ATA(pPg), pPg->n
247f0 52 65 66 29 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64  Ref);.  }.}.#end
24800 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  if..#endif /* SQ
24810 4c 49 54 45 5f 4f 4d 49 54 5f 44 49 53 4b 49 4f  LITE_OMIT_DISKIO
24820 20 2a 2f 0a                                       */.